{"_id":"joey","_rev":"66718","name":"joey","description":"A Sinatra-like web server configuration language for JavaScript, built on Q, Q-IO, and JSGI.","dist-tags":{"future":"2.0.1","latest":"1.5.3"},"maintainers":[{"name":"hthetiot","email":"hthetiot@gmail.com"},{"name":"kriskowal","email":""},{"name":"marchant","email":"benoit@montagestudio.com"},{"name":"montage-bot","email":"francoisfrisch@gmail.com"}],"time":{"modified":"2021-06-03T10:22:16.000Z","created":"2012-07-10T20:36:30.456Z","1.5.3":"2017-05-12T13:02:51.150Z","1.5.2":"2017-05-12T12:43:43.315Z","2.0.1":"2014-03-20T19:52:03.252Z","2.0.0":"2014-03-20T06:42:55.255Z","1.5.1":"2014-03-06T01:01:13.572Z","1.5.0":"2014-03-05T07:54:07.046Z","1.4.0":"2014-01-22T02:26:14.226Z","1.3.3":"2014-01-17T01:05:40.111Z","1.3.2":"2013-11-16T07:44:26.408Z","1.3.1":"2013-11-12T23:30:44.266Z","1.3.0":"2013-08-20T22:28:17.488Z","1.2.1":"2013-08-20T22:21:04.367Z","1.2.0":"2013-06-19T18:42:23.728Z","1.1.1":"2013-06-04T21:24:24.131Z","1.1.0":"2013-03-18T05:27:57.157Z","1.0.0":"2013-03-18T05:22:11.659Z","0.1.3":"2013-01-15T19:10:42.544Z","0.1.2":"2012-12-06T00:31:39.274Z","0.1.1":"2012-11-30T00:47:07.100Z","0.1.0":"2012-11-29T23:19:00.632Z","0.0.15":"2012-09-01T21:38:14.291Z","0.0.14":"2012-07-10T20:36:30.456Z"},"users":{"cybo42":true},"repository":{"type":"git","url":"git+https://github.com/montagejs/joey.git"},"versions":{"1.5.3":{"name":"joey","version":"1.5.3","description":"A Sinatra-like web server configuration language for JavaScript, built on Q, Q-IO, and JSGI.","license":"BSD-3-Clause","repository":{"type":"git","url":"git+https://github.com/montagejs/joey.git"},"main":"joey.js","dependencies":{"optimist":"~0.3.7","q":"^1.5.0","q-io":"^1.13.4","url2":"~1.0.0"},"bin":{"joey":"bin/joey"},"scripts":{"test":"node test/all.js"},"devDependencies":{"test":"0.6.x"},"gitHead":"b80dab0662be470f6810c1b932a09e3de132de61","bugs":{"url":"https://github.com/montagejs/joey/issues"},"homepage":"https://github.com/montagejs/joey#readme","_id":"joey@1.5.3","_shasum":"e5ca41b46899cf665a21079ef6b8c33a3af17744","_from":".","_npmVersion":"4.0.2","_nodeVersion":"6.9.1","_npmUser":{"name":"hthetiot","email":"hthetiot@gmail.com"},"dist":{"shasum":"e5ca41b46899cf665a21079ef6b8c33a3af17744","size":15125,"noattachment":false,"key":"/joey/-/joey-1.5.3.tgz","tarball":"http://registry.cnpm.dingdandao.com/joey/download/joey-1.5.3.tgz"},"maintainers":[{"name":"hthetiot","email":"hthetiot@gmail.com"},{"name":"kriskowal","email":""},{"name":"marchant","email":"benoit@montagestudio.com"},{"name":"montage-bot","email":"francoisfrisch@gmail.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/joey-1.5.3.tgz_1494594168971_0.49764200998470187"},"directories":{},"publish_time":1494594171150,"_hasShrinkwrap":false,"_cnpm_publish_time":1494594171150},"1.5.2":{"name":"joey","version":"1.5.2","description":"A Sinatra-like web server configuration language for JavaScript, built on Q, Q-IO, and JSGI.","license":"BSD-3-Clause","repository":{"type":"git","url":"git+https://github.com/montagejs/joey.git"},"main":"joey.js","dependencies":{"optimist":"~0.3.7","q":"^1.5.0","q-io":"^1.13.4","url2":"~1.0.0"},"bin":{"joey":"bin/joey"},"scripts":{"test":"node test/all.js"},"devDependencies":{"test":"0.6.x"},"gitHead":"72e13031734f065cb283d420eb34e52c596c3459","bugs":{"url":"https://github.com/montagejs/joey/issues"},"homepage":"https://github.com/montagejs/joey#readme","_id":"joey@1.5.2","_shasum":"b8b075d6c182fcef8249c74bd22c686f3dd76a5b","_from":".","_npmVersion":"4.0.2","_nodeVersion":"6.9.1","_npmUser":{"name":"hthetiot","email":"hthetiot@gmail.com"},"dist":{"shasum":"b8b075d6c182fcef8249c74bd22c686f3dd76a5b","size":14817,"noattachment":false,"key":"/joey/-/joey-1.5.2.tgz","tarball":"http://registry.cnpm.dingdandao.com/joey/download/joey-1.5.2.tgz"},"maintainers":[{"name":"hthetiot","email":"hthetiot@gmail.com"},{"name":"kriskowal","email":""},{"name":"marchant","email":"benoit@montagestudio.com"},{"name":"montage-bot","email":"francoisfrisch@gmail.com"}],"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/joey-1.5.2.tgz_1494593021180_0.06388006173074245"},"directories":{},"publish_time":1494593023315,"_hasShrinkwrap":false,"_cnpm_publish_time":1494593023315},"2.0.1":{"name":"joey","version":"2.0.1","description":"A Sinatra-like web server configuration language for JavaScript, built on Q, Q-IO, and JSGI.","main":"joey.js","dependencies":{"q":"^2.0.1","q-io":"^2.0.2","optimist":"^0.3.7","url2":"^1.0.1"},"bin":{"joey":"bin/joey"},"scripts":{"test":"jasminum test"},"devDependencies":{"jasminum":"^2.0.1"},"_id":"joey@2.0.1","dist":{"shasum":"056dedf6fdead5e954737e0053fb773706922ae1","size":14714,"noattachment":false,"key":"/joey/-/joey-2.0.1.tgz","tarball":"http://registry.cnpm.dingdandao.com/joey/download/joey-2.0.1.tgz"},"_from":".","_npmVersion":"1.4.4","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"hthetiot","email":"hthetiot@gmail.com"},{"name":"kriskowal","email":""},{"name":"marchant","email":"benoit@montagestudio.com"},{"name":"montage-bot","email":"francoisfrisch@gmail.com"}],"directories":{},"publish_time":1395345123252,"_hasShrinkwrap":false,"_cnpm_publish_time":1395345123252},"2.0.0":{"name":"joey","version":"2.0.0","description":"A Sinatra-like web server configuration language for JavaScript, built on Q, Q-IO, and JSGI.","main":"joey.js","dependencies":{"q":"^2.0.0","q-io":"^2.0.0","optimist":"^0.3.7","url2":"^1.0.0"},"bin":{"joey":"bin/joey"},"scripts":{"test":"jasminum test"},"devDependencies":{"jasminum":"~0.0.0"},"_id":"joey@2.0.0","dist":{"shasum":"3ae8770b250f99460f647658f87ac1e03ef07945","size":14712,"noattachment":false,"key":"/joey/-/joey-2.0.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/joey/download/joey-2.0.0.tgz"},"_from":".","_npmVersion":"1.4.4","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"hthetiot","email":"hthetiot@gmail.com"},{"name":"kriskowal","email":""},{"name":"marchant","email":"benoit@montagestudio.com"},{"name":"montage-bot","email":"francoisfrisch@gmail.com"}],"directories":{},"publish_time":1395297775255,"_hasShrinkwrap":false,"_cnpm_publish_time":1395297775255},"1.5.1":{"name":"joey","version":"1.5.1","description":"A Sinatra-like web server configuration language for JavaScript, built on Q, Q-IO, and JSGI.","main":"joey.js","dependencies":{"q":"~1.0.0","q-io":"~1.11.0","optimist":"~0.3.7","url2":"~1.0.0"},"bin":{"joey":"bin/joey"},"scripts":{"test":"node test/all.js"},"devDependencies":{"test":"0.6.x"},"_id":"joey@1.5.1","dist":{"shasum":"aa70923b7bbe193e443e54e85cf09f4a72988dc9","size":14745,"noattachment":false,"key":"/joey/-/joey-1.5.1.tgz","tarball":"http://registry.cnpm.dingdandao.com/joey/download/joey-1.5.1.tgz"},"_from":".","_npmVersion":"1.3.11","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"hthetiot","email":"hthetiot@gmail.com"},{"name":"kriskowal","email":""},{"name":"marchant","email":"benoit@montagestudio.com"},{"name":"montage-bot","email":"francoisfrisch@gmail.com"}],"directories":{},"publish_time":1394067673572,"_hasShrinkwrap":false,"_cnpm_publish_time":1394067673572},"1.5.0":{"name":"joey","version":"1.5.0","description":"A Sinatra-like web server configuration language for JavaScript, built on Q, Q-IO, and JSGI.","main":"joey.js","dependencies":{"q":"~1.0.0","q-io":"~1.11.0","optimist":"~0.3.7","url2":"~1.0.0"},"bin":{"joey":"bin/joey"},"scripts":{"test":"node test/all.js"},"devDependencies":{"test":"0.6.x"},"_id":"joey@1.5.0","dist":{"shasum":"6dc457eacd4522a3180f6b8405b368ea80640d62","size":14657,"noattachment":false,"key":"/joey/-/joey-1.5.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/joey/download/joey-1.5.0.tgz"},"_from":".","_npmVersion":"1.3.11","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"hthetiot","email":"hthetiot@gmail.com"},{"name":"kriskowal","email":""},{"name":"marchant","email":"benoit@montagestudio.com"},{"name":"montage-bot","email":"francoisfrisch@gmail.com"}],"directories":{},"publish_time":1394006047046,"_hasShrinkwrap":false,"_cnpm_publish_time":1394006047046},"1.4.0":{"name":"joey","version":"1.4.0","description":"A Sinatra-like web server configuration language for JavaScript, built on Jaque, Q, and JSGI.","main":"joey.js","dependencies":{"q":"~0.9.7","q-io":"~1.10.8","optimist":"~0.3.7","url2":"~0.0.0"},"bin":{"joey":"bin/joey"},"scripts":{"test":"node test/all.js"},"devDependencies":{"test":"0.6.x"},"_id":"joey@1.4.0","dist":{"shasum":"b771920587b9d857d17c6431b78aaf794bf7019e","size":14687,"noattachment":false,"key":"/joey/-/joey-1.4.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/joey/download/joey-1.4.0.tgz"},"_from":".","_npmVersion":"1.3.11","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"hthetiot","email":"hthetiot@gmail.com"},{"name":"kriskowal","email":""},{"name":"marchant","email":"benoit@montagestudio.com"},{"name":"montage-bot","email":"francoisfrisch@gmail.com"}],"directories":{},"publish_time":1390357574226,"_hasShrinkwrap":false,"_cnpm_publish_time":1390357574226},"1.3.3":{"name":"joey","version":"1.3.3","description":"A Sinatra-like web server configuration language for JavaScript, built on Jaque, Q, and JSGI.","main":"joey.js","dependencies":{"q":"~0.9.7","q-io":"~1.10.8","optimist":"~0.3.7","url2":"~0.0.0"},"bin":{"joey":"bin/joey"},"scripts":{"test":"node test/all.js"},"devDependencies":{"test":"0.6.x"},"_id":"joey@1.3.3","dist":{"shasum":"662792b2e2248c9a6d16d80afc83e2255063ad39","size":14305,"noattachment":false,"key":"/joey/-/joey-1.3.3.tgz","tarball":"http://registry.cnpm.dingdandao.com/joey/download/joey-1.3.3.tgz"},"_from":".","_npmVersion":"1.3.11","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"hthetiot","email":"hthetiot@gmail.com"},{"name":"kriskowal","email":""},{"name":"marchant","email":"benoit@montagestudio.com"},{"name":"montage-bot","email":"francoisfrisch@gmail.com"}],"directories":{},"publish_time":1389920740111,"_hasShrinkwrap":false,"_cnpm_publish_time":1389920740111},"1.3.2":{"name":"joey","version":"1.3.2","description":"A Sinatra-like web server configuration language for JavaScript, built on Jaque, Q, and JSGI.","main":"joey.js","dependencies":{"q":"~0.9.7","q-io":"~1.10.6","optimist":"~0.3.7","url2":"~0.0.0"},"bin":{"joey":"bin/joey"},"scripts":{"test":"node test/all.js"},"devDependencies":{"test":"0.6.x"},"_id":"joey@1.3.2","dist":{"shasum":"9b033e67677e26863b8d189a64e47ee2299aef16","size":14250,"noattachment":false,"key":"/joey/-/joey-1.3.2.tgz","tarball":"http://registry.cnpm.dingdandao.com/joey/download/joey-1.3.2.tgz"},"_from":".","_npmVersion":"1.3.11","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"hthetiot","email":"hthetiot@gmail.com"},{"name":"kriskowal","email":""},{"name":"marchant","email":"benoit@montagestudio.com"},{"name":"montage-bot","email":"francoisfrisch@gmail.com"}],"directories":{},"publish_time":1384587866408,"_hasShrinkwrap":false,"_cnpm_publish_time":1384587866408},"1.3.1":{"name":"joey","version":"1.3.1","description":"A Sinatra-like web server configuration language for JavaScript, built on Jaque, Q, and JSGI.","main":"joey.js","dependencies":{"q":"~0.9.7","q-io":"~1.10.4","optimist":"~0.3.7","url2":"~0.0.0"},"bin":{"joey":"bin/joey"},"scripts":{"test":"node test/all.js"},"devDependencies":{"test":"0.6.x"},"_id":"joey@1.3.1","dist":{"shasum":"daf38109c145c8ebe166f1a459fc7dfd41a5d457","size":14217,"noattachment":false,"key":"/joey/-/joey-1.3.1.tgz","tarball":"http://registry.cnpm.dingdandao.com/joey/download/joey-1.3.1.tgz"},"_from":".","_npmVersion":"1.3.11","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"hthetiot","email":"hthetiot@gmail.com"},{"name":"kriskowal","email":""},{"name":"marchant","email":"benoit@montagestudio.com"},{"name":"montage-bot","email":"francoisfrisch@gmail.com"}],"directories":{},"publish_time":1384299044266,"_hasShrinkwrap":false,"_cnpm_publish_time":1384299044266},"1.3.0":{"name":"joey","version":"1.3.0","description":"A Sinatra-like web server configuration language for JavaScript, built on Jaque, Q, and JSGI.","main":"joey.js","dependencies":{"q":"~0.9.6","q-io":"~1.9.3","optimist":"~0.3.7","url2":"~0.0.0"},"bin":{"joey":"bin/joey"},"scripts":{"test":"node test/all.js"},"devDependencies":{"test":"0.6.x"},"_id":"joey@1.3.0","dist":{"shasum":"3ca5ad9481a89795e6ed3bfaadd6164652de4bee","size":14184,"noattachment":false,"key":"/joey/-/joey-1.3.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/joey/download/joey-1.3.0.tgz"},"_from":".","_npmVersion":"1.3.2","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"hthetiot","email":"hthetiot@gmail.com"},{"name":"kriskowal","email":""},{"name":"marchant","email":"benoit@montagestudio.com"},{"name":"montage-bot","email":"francoisfrisch@gmail.com"}],"directories":{},"publish_time":1377037697488,"_hasShrinkwrap":false,"_cnpm_publish_time":1377037697488},"1.2.1":{"name":"joey","version":"1.2.1","description":"A Sinatra-like web server configuration language for JavaScript, built on Jaque, Q, and JSGI.","main":"joey.js","dependencies":{"q":"~0.9.6","q-io":"~1.9.3","optimist":"~0.3.7","url2":"~0.0.0"},"bin":{"joey":"bin/joey"},"scripts":{"test":"node test/all.js"},"devDependencies":{"test":"0.6.x"},"_id":"joey@1.2.1","dist":{"shasum":"a652878a87aebd547b3e60118282bec86aa58781","size":14181,"noattachment":false,"key":"/joey/-/joey-1.2.1.tgz","tarball":"http://registry.cnpm.dingdandao.com/joey/download/joey-1.2.1.tgz"},"_from":".","_npmVersion":"1.3.2","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"hthetiot","email":"hthetiot@gmail.com"},{"name":"kriskowal","email":""},{"name":"marchant","email":"benoit@montagestudio.com"},{"name":"montage-bot","email":"francoisfrisch@gmail.com"}],"directories":{},"publish_time":1377037264367,"_hasShrinkwrap":false,"_cnpm_publish_time":1377037264367},"1.2.0":{"name":"joey","version":"1.2.0","description":"A Sinatra-like web server configuration language for JavaScript, built on Jaque, Q, and JSGI.","main":"joey.js","dependencies":{"q":"~0.9.6","q-io":"~1.7","optimist":"~0.3.5","url2":"~0.0.0"},"bin":{"joey":"bin/joey"},"scripts":{"test":"node test/all.js"},"devDependencies":{"test":"0.6.x"},"_id":"joey@1.2.0","dist":{"shasum":"8281077a08c94417d44faa26988b6c1aea29d862","size":14160,"noattachment":false,"key":"/joey/-/joey-1.2.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/joey/download/joey-1.2.0.tgz"},"_from":".","_npmVersion":"1.2.15","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"hthetiot","email":"hthetiot@gmail.com"},{"name":"kriskowal","email":""},{"name":"marchant","email":"benoit@montagestudio.com"},{"name":"montage-bot","email":"francoisfrisch@gmail.com"}],"directories":{},"publish_time":1371667343728,"_hasShrinkwrap":false,"_cnpm_publish_time":1371667343728},"1.1.1":{"name":"joey","version":"1.1.1","description":"A Sinatra-like web server configuration language for JavaScript, built on Jaque, Q, and JSGI.","main":"joey.js","dependencies":{"q":"~0.8.11","q-io":"~1.7","optimist":"~0.3.5","url2":"~0.0.0"},"bin":{"joey":"bin/joey"},"scripts":{"test":"node test/all.js"},"devDependencies":{"test":"0.6.x"},"_id":"joey@1.1.1","dist":{"shasum":"49fefd46fd9bb69007a16d7f0a2ccb849ac5766d","size":14040,"noattachment":false,"key":"/joey/-/joey-1.1.1.tgz","tarball":"http://registry.cnpm.dingdandao.com/joey/download/joey-1.1.1.tgz"},"_from":".","_npmVersion":"1.2.9","_npmUser":{"name":"montage-bot","email":"francoisfrisch@gmail.com"},"maintainers":[{"name":"hthetiot","email":"hthetiot@gmail.com"},{"name":"kriskowal","email":""},{"name":"marchant","email":"benoit@montagestudio.com"},{"name":"montage-bot","email":"francoisfrisch@gmail.com"}],"directories":{},"publish_time":1370381064131,"_hasShrinkwrap":false,"_cnpm_publish_time":1370381064131},"1.1.0":{"name":"joey","version":"1.1.0","description":"A Sinatra-like web server configuration language for JavaScript, built on Jaque, Q, and JSGI.","main":"joey.js","dependencies":{"q":"~0.8.11","q-io":"~1.6","optimist":"~0.3.5","url2":"~0.0.0"},"bin":{"joey":"bin/joey"},"scripts":{"test":"node test/all.js"},"devDependencies":{"test":"0.6.x"},"_id":"joey@1.1.0","dist":{"shasum":"251e1e35af63c94f1bd843de33d7f56267be2d83","size":13971,"noattachment":false,"key":"/joey/-/joey-1.1.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/joey/download/joey-1.1.0.tgz"},"_from":".","_npmVersion":"1.2.2","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"hthetiot","email":"hthetiot@gmail.com"},{"name":"kriskowal","email":""},{"name":"marchant","email":"benoit@montagestudio.com"},{"name":"montage-bot","email":"francoisfrisch@gmail.com"}],"directories":{},"publish_time":1363584477157,"_hasShrinkwrap":false,"_cnpm_publish_time":1363584477157},"1.0.0":{"name":"joey","version":"1.0.0","description":"A Sinatra-like web server configuration language for JavaScript, built on Jaque, Q, and JSGI.","main":"joey.js","dependencies":{"q":"~0.8.11","q-io":"~1.6","optimist":"~0.3.5","url2":"~0.0.0"},"bin":{"joey":"bin/joey"},"scripts":{"test":"node test/all.js"},"devDependencies":{"test":"0.6.x"},"_id":"joey@1.0.0","dist":{"shasum":"2323a482552336a8e5cf44d552ac55ba710f4fc4","size":13909,"noattachment":false,"key":"/joey/-/joey-1.0.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/joey/download/joey-1.0.0.tgz"},"_from":".","_npmVersion":"1.2.2","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"hthetiot","email":"hthetiot@gmail.com"},{"name":"kriskowal","email":""},{"name":"marchant","email":"benoit@montagestudio.com"},{"name":"montage-bot","email":"francoisfrisch@gmail.com"}],"directories":{},"publish_time":1363584131659,"_hasShrinkwrap":false,"_cnpm_publish_time":1363584131659},"0.1.3":{"name":"joey","version":"0.1.3","description":"A Sinatra-like web server configuration language for JavaScript, built on Jaque, Q, and JSGI.","main":"joey.js","dependencies":{"q":"~0.8.11","q-io":"~1.3","optimist":"~0.3.5","url2":"~0.0.0"},"bin":{"joey":"bin/joey"},"scripts":{"test":"node test/all.js"},"devDependencies":{"test":"0.6.x"},"_id":"joey@0.1.3","dist":{"shasum":"d66d42dabeea7ecd310ae1703ed5913bab327f00","size":13910,"noattachment":false,"key":"/joey/-/joey-0.1.3.tgz","tarball":"http://registry.cnpm.dingdandao.com/joey/download/joey-0.1.3.tgz"},"_npmVersion":"1.1.62","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"hthetiot","email":"hthetiot@gmail.com"},{"name":"kriskowal","email":""},{"name":"marchant","email":"benoit@montagestudio.com"},{"name":"montage-bot","email":"francoisfrisch@gmail.com"}],"directories":{},"publish_time":1358277042544,"_hasShrinkwrap":false,"_cnpm_publish_time":1358277042544},"0.1.2":{"name":"joey","version":"0.1.2","description":"A Sinatra-like web server configuration language for JavaScript, built on Jaque, Q, and JSGI.","main":"joey.js","dependencies":{"q":"0.8.11 - 0.9","q-io":"1.3.2 - 1.4","optimist":"0.3 - 0.4","url2":"0.0 - 0.1"},"bin":{"joey":"bin/joey"},"scripts":{"test":"node test/all.js"},"devDependencies":{"test":"0.6.x"},"_id":"joey@0.1.2","dist":{"shasum":"6fc0c1dde5643d709dd61dcc15f1cddc02cf4495","size":13910,"noattachment":false,"key":"/joey/-/joey-0.1.2.tgz","tarball":"http://registry.cnpm.dingdandao.com/joey/download/joey-0.1.2.tgz"},"_npmVersion":"1.1.62","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"hthetiot","email":"hthetiot@gmail.com"},{"name":"kriskowal","email":""},{"name":"marchant","email":"benoit@montagestudio.com"},{"name":"montage-bot","email":"francoisfrisch@gmail.com"}],"directories":{},"publish_time":1354753899274,"_hasShrinkwrap":false,"_cnpm_publish_time":1354753899274},"0.1.1":{"name":"joey","version":"0.1.1","description":"A Sinatra-like web server configuration language for JavaScript, built on Jaque, Q, and JSGI.","main":"joey.js","dependencies":{"q":"0.8.x >=0.8.11","q-io":"1.3.x >=0.3.1","optimist":"0.3.x","url2":"0.0.x"},"bin":{"joey":"bin/joey"},"scripts":{"test":"node test/all.js"},"devDependencies":{"test":"0.6.x"},"_id":"joey@0.1.1","dist":{"shasum":"57008420023d8f7ca7dd9d1295c391a7f6ebb222","size":13904,"noattachment":false,"key":"/joey/-/joey-0.1.1.tgz","tarball":"http://registry.cnpm.dingdandao.com/joey/download/joey-0.1.1.tgz"},"_npmVersion":"1.1.62","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"hthetiot","email":"hthetiot@gmail.com"},{"name":"kriskowal","email":""},{"name":"marchant","email":"benoit@montagestudio.com"},{"name":"montage-bot","email":"francoisfrisch@gmail.com"}],"directories":{},"publish_time":1354236427100,"_hasShrinkwrap":false,"_cnpm_publish_time":1354236427100},"0.1.0":{"name":"joey","version":"0.1.0","description":"A Sinatra-like web server configuration language for JavaScript, built on Jaque, Q, and JSGI.","main":"joey.js","dependencies":{"q":"0.8.x >=0.8.11","q-io":"1.3.x >=0.3.1","optimist":"0.3.x","url2":"0.0.x"},"bin":{"joey":"bin/joey"},"scripts":{"test":"node test/all.js"},"devDependencies":{"test":"0.6.x"},"_id":"joey@0.1.0","dist":{"shasum":"6b87d03718848a001a431490f36b2b82a27141a7","size":13906,"noattachment":false,"key":"/joey/-/joey-0.1.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/joey/download/joey-0.1.0.tgz"},"_npmVersion":"1.1.62","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"hthetiot","email":"hthetiot@gmail.com"},{"name":"kriskowal","email":""},{"name":"marchant","email":"benoit@montagestudio.com"},{"name":"montage-bot","email":"francoisfrisch@gmail.com"}],"directories":{},"publish_time":1354231140632,"_hasShrinkwrap":false,"_cnpm_publish_time":1354231140632},"0.0.15":{"name":"joey","version":"0.0.15","description":"A Sinatra-like web server configuration language for JavaScript, built on Jaque, Q, and JSGI.","main":"joey.js","dependencies":{"jaque":"1.3.x","q":"0.8.x","q-fs":"0.1.x","q-http":"0.1.x","optimist":"0.3.x"},"bin":{"joey":"bin/joey"},"devDependencies":{"test":"0.2.0"},"_id":"joey@0.0.15","dist":{"shasum":"87267198e1f5ac293944a4670a82af7cf6dc8a55","size":13650,"noattachment":false,"key":"/joey/-/joey-0.0.15.tgz","tarball":"http://registry.cnpm.dingdandao.com/joey/download/joey-0.0.15.tgz"},"_npmVersion":"1.1.59","_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"maintainers":[{"name":"hthetiot","email":"hthetiot@gmail.com"},{"name":"kriskowal","email":""},{"name":"marchant","email":"benoit@montagestudio.com"},{"name":"montage-bot","email":"francoisfrisch@gmail.com"}],"directories":{},"publish_time":1346535494291,"_hasShrinkwrap":false,"_cnpm_publish_time":1346535494291},"0.0.14":{"name":"joey","version":"0.0.14","description":"A Sinatra-like web server configuration language for JavaScript, built on Jaque, Q, and JSGI.","main":"joey.js","dependencies":{"jaque":"1.3.1","q":"0.8.4","q-fs":"0.1.27","q-http":"0.1.14"},"devDependencies":{"test":"0.2.0"},"_npmUser":{"name":"kriskowal","email":"kris.kowal@cixar.com"},"_id":"joey@0.0.14","optionalDependencies":{},"engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.1.21","_nodeVersion":"v0.6.17","_defaultsLoaded":true,"dist":{"shasum":"500079b61b0dd058848d2bad9c91bed1ece5ea1c","size":13386,"noattachment":false,"key":"/joey/-/joey-0.0.14.tgz","tarball":"http://registry.cnpm.dingdandao.com/joey/download/joey-0.0.14.tgz"},"maintainers":[{"name":"hthetiot","email":"hthetiot@gmail.com"},{"name":"kriskowal","email":""},{"name":"marchant","email":"benoit@montagestudio.com"},{"name":"montage-bot","email":"francoisfrisch@gmail.com"}],"directories":{},"publish_time":1341952590456,"_hasShrinkwrap":false,"_cnpm_publish_time":1341952590456}},"readme":"\n[![Build Status](https://travis-ci.org/montagejs/joey.png?branch=master)](http://travis-ci.org/montagejs/joey)\n\nJoey\n====\n\nA [Sinatra][]-like and [jQuery][]-like web server (and client!)\nconfiguration language in JavaScript for [NodeJS][] and [NPM][], based\non [JSGI][], [Q][], and [Q-IO][].\n\n[Joey Bishop][JB] was a member of the [Humphrey][HB] [Bogart][Bogart]'s\n[Rat Pack][RP], which included [Frank][FS] [Sinatra][Sinatra],\n[Dean][DM] [Martin][], [Peter Lawford][PL], and [Sammy][Sammy] [Davis\nJr.][SDJ].\n\n[Sinatra]: http://www.sinatrarb.com/\n[jQuery]: http://jquery.com/\n[NodeJS]: http://nodejs.org/\n[NPM]: http://npmjs.org/\n[JSGI]: http://wiki.commonjs.org/wiki/JSGI\n[Q]: https://github.com/kriskowal/q\n[Q-IO]: https://github.com/kriskowal/q-io\n[Sammy]: http://sammyjs.org/\n[Bogart]: https://github.com/nrstott/bogart\n[Martin]: https://github.com/thegrubbsian/Martin\n[RP]: http://en.wikipedia.org/wiki/Rat_Pack\n[JB]: http://en.wikipedia.org/wiki/Joey_Bishop\n[HB]: http://en.wikipedia.org/wiki/Humphrey_Bogart\n[PL]: http://en.wikipedia.org/wiki/Peter_Lawford\n[SDJ]: http://en.wikipedia.org/wiki/Sammy_Davis,_Jr.\n[DM]: http://en.wikipedia.org/wiki/Dean_Martin\n[FS]: http://en.wikipedia.org/wiki/Frank_Sinatra\n\n\nInstallation\n============\n\nYou will need [NodeJS][] and [NPM][].\n\n    $ npm install joey\n\nOr add it to your package:\n\n    {\n        \"dependencies\": {\n            \"joey\": \"*\"\n        }\n    }\n\nAnd install your package.\n\n    $ npm install\n\nTo run tests, you'll need a developer install.\n\n    $ npm install -d\n    $ node test/all.js\n\n\nHello, You!\n===========\n\n```javascript\nrequire(\"joey\")\n.log()\n.error()\n.favicon()\n.route(function ($) {\n\n    $(\"\")\n    .method(\"GET\")\n    .contentType(\"text/plain\")\n    .content(\"Hello, World!\")\n\n    $(\"hello/:name\")\n    .method(\"GET\")\n    .contentType(\"text/html\")\n    .contentApp(function (request) {\n        return \"Hello, \" + request.params.name + \"!\\n\";\n    })\n\n    $(\"store\")\n    .methods(function ($) {\n\n        var content = \"\\n\";\n\n        $(\"GET\")\n        .contentType(\"text/plain\")\n        .contentApp(function () {\n            return content;\n        });\n\n        $(\"PUT\")\n        .tap(function (request) {\n            return request.body.read()\n            .then(function (_content) {\n                content = _content.toString(\"utf-8\");\n            });\n        })\n        .redirect(\"\");\n\n    })\n\n    $(\"files/...\").fileTree(\".\"); // danger!\n\n})\n.listen(8080)\n.then(function () {\n    console.log(\"Listening on 8080\")\n\n    // client\n    var request = require(\"joey\").redirectTrap(20).client();\n\n    request(\"http://localhost:8080\")\n    .then(function (response) {\n        console.log(response.status, response.headers);\n        response.body.read()\n        .invoke('toString', 'utf-8')\n        .then(console.log)\n    })\n})\n.done()\n```\n\nUsage\n=====\n\nRoutes start with Joey.\n\n```javascript\nrequire(\"joey\")\n```\n\nBranches end with an application, like some static content.\n\n```javascript\n.content(\"Hello, World!\")\n```\n\nOr some dynamic content.\n\n```javascript\n.contentApp(function (request) {\n    return \"Hello, \" + request.pathInfo + \"\\n\";\n})\n```\n\nOr a file, with its content type intuitied from the extension.\n\n```javascript\n.file(module.path || __filename)\n```\n\nOr a file with a specific content type, or status code.\n\n```javascript\n.file(module.path || __filename, \"text/plain\", 200)\n```\n\nOr some content in a directory tree.\n\n```javascript\n.fileTree(module.directory || __dirname)\n```\n\nOr proxy another server.\n\n```javascript\n.proxyTree(\"http://example.com/\")\n```\n\nOr a temporary or permanent redirect.\n\n```javascript\n.redirect(\"../foo\")\n.redirectPermanent(\"../bar\")\n```\n\nRedirect paths are implicitly resolved relative to the request URL.\nWith no argument, a redirect implicitly loops back to the same path,\nwhich is handy for redirecting to a ``GET`` after a ``PUT`` or ``POST``.\n\nOr you can respond with an HTTP error.\n\n```javascript\n.badRequest()\n.notFound()\n.methodNotAllowed()\n.notAcceptable()\n```\n\nOr JSGI applications.  If you're using promises, the response can be a\npromise. The body can be a promise. The body may be anything with a\n``forEach(write)`` method.  ``forEach(write)`` may return a promise,\nwhich upon resolution will end the response.  ``write(content)`` may\nreturn a promise, particularly for throttling.\n\n```javascript\n.app(function (request) {\n    return {\n        status: 200,\n        headers: {\n            \"content-type\": \"text/plain\"\n        },\n        \"body\": [\n            \"Hello, \" + request.pathInfo + \"\\n\"\n        ]\n    }\n})\n```\n\nOr Node-style applications.\n\n```javascript\n.nap(function (request, response) {\n    response.writeHead(200, {\n        \"content-type\": \"text/plain\",\n        \"charset\": \"utf-8\"\n    });\n    request.on(\"data\", function (data) {\n        response.write(data);\n    });\n    request.on(\"end\", function () {\n        response.end();\n    })\n})\n```\n\nIf you want to observe a request as it trickles down the chain, but do\nnot want to respond to it yourself, you can use a tap.\n\n```javascript\n.tap(function (request, response) {\n    assert.equal(request.method, \"PUT\", \"method is PUT\");\n})\n.redirect(\"/\")\n```\n\nYou can use a trap to intercept a response.\n\n```javascript\n.trap(function (response) {\n    response.headers[\"set-cookie\"] = \"id=1; HttpOnly\";\n})\n```\n\nThere is also a ``cap`` method in the ``app``, ``nap``, ``tap``,\n``trap`` theme, at the end of routing.  ``cap`` limits subsequent\nresponders to the portion of the URL that has already been routed; all\nother requests are \"not found\".\n\n```javascript\n.cap()\n.content(\"Hello, World\");\n```\n\n\nListening\n---------\n\nWhich you can then serve as a web application.\n\n```javascript\n.listen(8080)\n.then(function (server) {\n    console.log(\"Listening on 8080\");\n})\n.done()\n```\n\n\nRouting\n-------\n\nAnd you can create branches.\n\n```javascript\n.route(function ($) {\n    $(\"\").content('<a href=\"/hello\">Hello</a>', 'text/html');\n    $(\"hello\").content(\"Hello, World!\");\n})\n```\n\nAnd the branches can be nested.\n\n```javascript\n.route(function ($) {\n    $(\"hello\").content(\"Hi!\");\n    $(\"hello/...\").route(function ($) {\n        $(\"world\").content(\"Hello, World!\");\n        $(\"joey\").content(\"Hello, Joey!\");\n        $(\"dave\").content(\"Hello, Dave!\");\n    });\n})\n```\n\nThe arguments to the ``$`` function (as named in these examples; you may\nof course name it anything you like) are conditions for matching a\nbranch.  If a branch does not match the remaining routes are searched in\norder.\n\nThe path expression can contain variables.\n\n```javascript\n.route(function ($) {\n    $(\"hello/:name\").contentApp(function (request) {\n        return \"Hello, \" + request.params.name + \"!\";\n    });\n})\n```\n\nVariables start with either ``:``, ``*``, or ``...``, have an optional\nname, and may be followed by ``?``.  If there's a slash before a\nvariable, it receives special treatment when the variable is optional.\n\n-   ``:name`` is a named variable, matching zero or more non-slash\n    characters.  The matching characters are stored in\n    ``request.params.name``.\n-   ``*name`` is a named variable, matching all following characters\n    including slashes.\n-   ``:`` and ``*`` without a following letter character are anonymous\n    variables.  They are accessible by their zero-index offset among the\n    other parameters, like ``request.params[0]``.\n-   ``/:name?`` is an optional variable. It, and even the slash that\n    comes before it, can be omitted and the expression will still match.\n    -   ``/:?`` optional variables can also be anonymous\n    -   ``/*name?`` and match all following text including slashes\n    -   ``:name?`` do not need to follow a slash\n    -   or any combination thereof\n-   ``/...`` matches the slash and everything that follows.  The entire\n    match, including the slash, becomes the path for subsequent routing,\n    stored in ``request.pathInfo``.\n\nThe path expressions have a default prefix of a slash, ``/``.  An\nalternate prefix can be provided, for example, if you wish to match file\nextension.\n\n```javascript\n.route(function ($) {\n    $(\"foo\").route(\".\", function ($) {\n\n        // \"/foo.html\"\n        $(\"html\")\n        .contentType(\"text/html\")\n        .content(\"<p>Hello, World</p>\")\n\n        // \"/foo.txt\"\n        $(\"txt\")\n        .contentType(\"text/plain\")\n        .content(\"Hello, World\")\n\n    })\n})\n```\n\nYou can limit a path to a particular HTTP method.  Any HTTP method may\nbe used, in addition to the special ``ANY`` method.\n\n```javascript\n.route(function (ANY, GET) {\n    GET(\"hello\").content(\"Hello, World!\");\n})\n```\n\nThe common methods are provided as positional arguments, of which you\ncan take as many as you need: ``ANY``, ``GET``, ``PUT``, ``POST``, and\n``DELETE``, in that order.\n\n```javascript\n.route(function (ANY, GET, PUT, POST, DELETE) {\n    GET(\"hello\").content(\"Hello, World!\");\n})\n```\n\nAll other valid methods are provided as functions on ``this``.\n\n```javascript\n.route(function () {\n    this.OPTIONS(\"hello\").methodNotAllowed();\n})\n```\n\nBut, you'll get proper HTTP responses for free if you use content\nnegotiation.\n\n```javascript\n.route(function ($) {\n    $(\"foo\").methods(function ($) {\n        var value;\n\n        $(\"GET\")\n        .json()\n        .app(function () {\n            return value;\n        });\n\n        $(\"PUT\")\n        .jsonRequest()\n        .tap(function (object) {\n            value = object;\n        })\n        .redirect();\n\n    })\n})\n```\n\nEach route selector accepts any number of conditions (predicates).  If\nthe predicate is a function, the function gets called with ``request``\nand ``response`` and it must return ``true`` for the route to be\nselected.\n\n```javascript\n.route(function ($) {\n    $(\"hello\", function (request) {\n        return request.headers.host === \"localhost\";\n    }).content(\"Hello\");\n})\n```\n\nSo you can profane the HTTP specification if you must:\n\n```javascript\n.route(function ($) {\n    $(function (request) {\n        return request.method === \"NYANCAT\";\n    }).redirect(\"http://nyan.cat/\");\n})\n```\n\nIf no route is selected, the route will continue searching for an app\ndown the chain.\n\n```javascript\n.route(function ($, GET) {\n    GET(\"hello\").content(\"Hello, World\")\n})\n.redirectTemporary(\"hello\")\n```\n\nYou can put a cap on routing, which will end a route.  If a request\nreaches a route cap with any part of the request URL unprocessed the\nserver will respond with a 404 \"Not Found\".\n\n```javascript\n.cap()\n```\n\n\nNegotiation\n-----------\n\nYou can use chains to limit what HTTP Method and Host you are willing to\nrespond to.\n\n```javascript\n.host(\"localhost\")\n.method(\"GET\")\n```\n\nAnd you can and should use chains to perform content-negotiation.  With\nthe ``contentType``, ``language``, ``encoding``, ``charset``  functions,\nrouting will only proceed through the chain if the client is able to\naccept the given parameter.  This is what Corbain Dallas would probably\ncall Content Negotiation.\n\n```javascript\n.charset(\"utf-8\")\n.contentType(\"text/html\")\n.language(\"en\")\n.content(\"I wonder.\")\n```\n\nOnce negotiation is complete, the corresponding response headers are\nautomatically populated.  So, if you've negotiated to respond in\n``text/html``, the ``Content-Type`` header of the response will be sent\nwith the headers automatically.  It is however up to you to ensure that\nyour response content satisfies the negotiated terms.  The negotiation\nresults are stored in ``request.terms``.\n\n```javascript\n.charset(\"utf-8\", \"ascii\")\n.app(function (request) {\n    assert.ok([\"utf-8\", \"ascii\"].indexOf(request.terms.charset) >= 0);\n})\n```\n\nAlternately, you can bring multiple options to the content negotiation.\n\n```javascript\n.route(function ($, GET) {\n    GET(\"foo\").route(function (\".\", function (ext) {\n        ext(\"html\").app(html);\n        ext(\"text\").app(text);\n        ext(\"txt\").app(text);\n    })\n    .contentTypes(function (type) {\n        type(\"text/html\").app(html);\n        type(\"text/plain\").app(text);\n    })\n})\n```\n\nYou can branch likewise on hosts:\n\n```javascript\n.host(\"localhost:*\", \"127.0.0.1:*\")\n.hosts(function ($) {\n    $(\"localhost:*\", \"127.0.0.1:*\")\n    .contentType(\"text/plain\")\n    .content(\"Hello, local client.\")\n    .cap()\n})\n```\n\n-   ``hosts``\n-   ``methods``\n-   ``contentTypes``\n-   ``languages``\n-   ``charsets``\n-   ``encodings``\n\n\nMiddleware\n----------\n\nAnd you can wrap your route in middleware.\n\nLogging middleware shows request and response times and statuses.\n\n```javascript\n.log()\n.log(console.log, stamp(message))\n```\n\nError middleware transforms errors into 500 Server Error pages.\n\n```javascript\n.error()\n```\n\nFavicon middleware handles requests for ``/favicon.ico``.\n\n```javascript\n.favicon()\n.favicon(path)\n```\n\nAnd to avoid carpal tunnel, you can just use sensible defaults for\nmiddleware.\n\n```javascript\n.blah()\n.blah({\n    log: console.log,\n    stamp: function (message) {return new Date() + \" \"},\n    favicon: path,\n    debug: true\n})\n```\n\nIn fact, if you're in a real hurry, as in say, on a REPL, you can go\nstraight into blah from the `\"joey\"` module.\n\n```javascript\nrequire(\"joey\").blah().content(\"hi\").listen(8080)\n```\n\nOr, create your own JSGI Middleware and hook it up:\n\n```javascript\n.use(function (next) {\n    return Middleware(next);\n})\n```\n\n\nAdapters\n--------\n\nAnd there are a couple adapters for formatting responses, as in JSON.\n\n```javascript\n.json()\n.app(function () {\n    return {a: 10};\n})\n```\n\nOr Node's variable inspection format.\n\n```javascript\n.inspect()\n.app(function (request) {\n    return request;\n});\n```\n\nOr create your own JSGI adapter and hook it up:\n\n```javascript\n.use(function (next) {\n    return Adapter(...options, next);\n});\n```\n\nThis adds a link to the chain, which will get connected to the\n``next`` application, or ``undefined`` when the chain terminates.\n\n```javascript\n.terminate(function () {\n    return function (request, response) {\n        // end of the chain\n        // returns its own response,\n        // does not forward to next application\n    };\n})\n```\n\nYou can instantiate a JSGI application from the chain by terminating it.\nThe return value is an app, not a link in the chain.\n\n```javascript\n.done()\n```\n\n\nLicense\n=======\n\nCopyright (c) 2012, Motorola Mobility LLC.\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 notice,\n  this list of conditions and the following disclaimer.\n\n- Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\n- Neither the name of Motorola Mobility LLC nor the names of its\n  contributors may be used to endorse or promote products derived from this\n  software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\nLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\nCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\nSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\nINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\nCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGE.\n\n","_attachments":{},"homepage":"https://github.com/montagejs/joey#readme","bugs":{"url":"https://github.com/montagejs/joey/issues"},"license":"BSD-3-Clause"}