{"_id":"async-kit","_rev":"2169944","name":"async-kit","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","dist-tags":{"latest":"2.2.4"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"time":{"modified":"2022-01-05T03:00:53.000Z","created":"2014-07-30T14:43:08.510Z","2.2.4":"2018-05-12T13:37:47.459Z","2.2.3":"2016-11-18T13:09:37.332Z","2.2.2":"2016-11-18T13:04:15.477Z","2.2.1":"2016-11-16T17:03:14.132Z","2.2.0":"2016-09-21T12:46:40.953Z","2.1.6":"2016-07-31T13:47:29.927Z","2.1.5":"2016-07-29T09:47:56.640Z","2.1.4":"2016-07-29T09:46:41.039Z","2.1.3":"2016-07-05T15:46:27.236Z","2.1.2":"2016-06-29T09:38:35.363Z","2.1.1":"2016-06-15T07:55:01.450Z","2.1.0":"2016-06-15T07:51:50.050Z","2.0.1":"2016-05-30T09:34:03.588Z","2.0.0":"2016-05-30T09:27:21.317Z","1.0.1":"2016-05-29T13:24:41.919Z","1.0.0":"2016-04-23T15:01:05.627Z","0.6.10":"2016-04-23T14:57:57.193Z","0.6.9":"2016-02-18T14:34:13.782Z","0.6.8":"2015-12-09T13:03:19.190Z","0.6.7":"2015-11-21T16:28:30.328Z","0.6.6":"2015-11-10T16:31:15.425Z","0.6.5":"2015-10-29T15:07:02.520Z","0.6.4":"2015-10-29T14:36:37.095Z","0.6.3":"2015-10-29T14:07:54.812Z","0.6.2":"2015-10-29T14:03:18.708Z","0.6.1":"2015-10-19T15:45:38.431Z","0.6.0":"2015-10-19T14:34:16.752Z","0.5.10":"2015-07-23T16:33:30.343Z","0.5.9":"2015-05-15T13:18:02.933Z","0.5.8":"2015-03-27T15:53:50.974Z","0.5.7":"2015-03-26T14:58:00.742Z","0.5.6":"2015-01-20T14:19:27.407Z","0.5.5":"2014-11-04T18:39:24.799Z","0.5.4":"2014-11-04T12:55:48.230Z","0.5.2":"2014-10-27T14:25:13.343Z","0.5.1":"2014-10-27T10:12:55.602Z","0.4.13":"2014-10-26T12:05:44.998Z","0.4.12":"2014-09-15T13:07:04.365Z","0.4.11":"2014-09-10T16:17:31.108Z","0.4.10":"2014-09-10T16:02:24.040Z","0.4.9":"2014-09-10T14:09:54.076Z","0.4.8":"2014-09-03T00:56:43.469Z","0.4.6":"2014-08-24T08:26:23.328Z","0.4.5":"2014-08-23T13:31:32.685Z","0.4.4":"2014-08-22T13:46:09.393Z","0.4.3":"2014-08-14T15:16:43.246Z","0.4.2":"2014-08-14T15:14:18.640Z","0.4.1":"2014-08-05T11:26:51.613Z","0.4.0":"2014-08-02T16:53:22.855Z","0.3.29":"2014-08-02T15:34:18.444Z","0.3.28":"2014-08-02T09:56:50.628Z","0.3.27":"2014-08-01T14:54:15.371Z","0.3.26":"2014-07-30T14:48:49.171Z","0.3.25":"2014-07-30T14:45:29.222Z","0.3.24":"2014-07-30T14:43:08.510Z"},"users":{"cronvel":true,"maur1th":true,"forican":true,"awei01":true},"author":{"name":"Cédric Ronvel"},"repository":{"type":"git","url":"git+https://github.com/cronvel/async-kit.git"},"versions":{"2.2.4":{"name":"async-kit","version":"2.2.4","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"nextgen-events":"^0.14.5","tree-kit":"^0.5.27"},"devDependencies":{"browserify":"^16.2.2","expect.js":"^0.3.1","uglify-js":"^2.7.0"},"scripts":{"test":"tea-time -R dot"},"repository":{"type":"git","url":"git+https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","exit","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"config":{"tea-time":{"coverDir":["lib"]}},"copyright":{"title":"Async Kit","years":[2014,2016],"owner":"Cédric Ronvel"},"gitHead":"65a78972ea9a8960774acaaf1c8df918463c85e2","homepage":"https://github.com/cronvel/async-kit#readme","_id":"async-kit@2.2.4","_npmVersion":"6.0.1","_nodeVersion":"8.10.0","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"53249064fc5c894c46210cbd1c1a9ff5bd44bf9f","size":202738,"noattachment":false,"key":"/async-kit/-/async-kit-2.2.4.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-2.2.4.tgz"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/async-kit_2.2.4_1526132267368_0.7499500603393361"},"_hasShrinkwrap":false,"publish_time":1526132267459,"_cnpm_publish_time":1526132267459},"2.2.3":{"name":"async-kit","version":"2.2.3","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"nextgen-events":"^0.9.0","tree-kit":"^0.5.26"},"devDependencies":{"browserify":"^13.1.0","expect.js":"^0.3.1","jshint":"^2.9.2","mocha":"^2.5.3","uglify-js":"^2.7.0"},"scripts":{"test":"mocha -R dot"},"repository":{"type":"git","url":"git+https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","exit","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"copyright":{"title":"Async Kit","years":[2014,2016],"owner":"Cédric Ronvel"},"gitHead":"43089e0d6aa9030462c2aed59ed80995ee9e82bd","homepage":"https://github.com/cronvel/async-kit#readme","_id":"async-kit@2.2.3","_shasum":"264751a279ddc5f59b419638b805ae2c49858fb7","_from":".","_npmVersion":"3.10.8","_nodeVersion":"6.9.1","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"264751a279ddc5f59b419638b805ae2c49858fb7","size":202904,"noattachment":false,"key":"/async-kit/-/async-kit-2.2.3.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-2.2.3.tgz"},"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/async-kit-2.2.3.tgz_1479474575094_0.9020743810106069"},"publish_time":1479474577332,"_cnpm_publish_time":1479474577332,"_hasShrinkwrap":false},"2.2.2":{"name":"async-kit","version":"2.2.2","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"nextgen-events":"^0.9.0","tree-kit":"^0.5.26"},"devDependencies":{"browserify":"^13.1.0","expect.js":"^0.3.1","jshint":"^2.9.2","mocha":"^2.5.3","uglify-js":"^2.7.0"},"scripts":{"test":"mocha -R dot"},"repository":{"type":"git","url":"git+https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","exit","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"copyright":{"title":"Async Kit","years":[2014,2016],"owner":"Cédric Ronvel"},"gitHead":"0dc5f1e9c43fc91484d8db7277e7d23ce9450c72","homepage":"https://github.com/cronvel/async-kit#readme","_id":"async-kit@2.2.2","_shasum":"e57c32cf5d01408b3a2e4986139f2fcd6120db76","_from":".","_npmVersion":"3.10.8","_nodeVersion":"6.9.1","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"e57c32cf5d01408b3a2e4986139f2fcd6120db76","size":202868,"noattachment":false,"key":"/async-kit/-/async-kit-2.2.2.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-2.2.2.tgz"},"_npmOperationalInternal":{"host":"packages-18-east.internal.npmjs.com","tmp":"tmp/async-kit-2.2.2.tgz_1479474254666_0.7375935397576541"},"publish_time":1479474255477,"_cnpm_publish_time":1479474255477,"_hasShrinkwrap":false},"2.2.1":{"name":"async-kit","version":"2.2.1","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"nextgen-events":"^0.9.0","tree-kit":"^0.5.26"},"devDependencies":{"browserify":"^13.1.0","expect.js":"^0.3.1","jshint":"^2.9.2","mocha":"^2.5.3","uglify-js":"^2.7.0"},"scripts":{"test":"mocha -R dot"},"repository":{"type":"git","url":"git+https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","exit","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"copyright":{"title":"Async Kit","years":[2014,2016],"owner":"Cédric Ronvel"},"gitHead":"2f27f258a15949ea768aa845f0a1d6e473a9a14b","homepage":"https://github.com/cronvel/async-kit#readme","_id":"async-kit@2.2.1","_shasum":"3f0bf86175a36bc6f0b477f3562b014e22b90f2b","_from":".","_npmVersion":"3.10.8","_nodeVersion":"6.9.1","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"3f0bf86175a36bc6f0b477f3562b014e22b90f2b","size":202859,"noattachment":false,"key":"/async-kit/-/async-kit-2.2.1.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-2.2.1.tgz"},"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/async-kit-2.2.1.tgz_1479315791723_0.2851765009108931"},"publish_time":1479315794132,"_cnpm_publish_time":1479315794132,"_hasShrinkwrap":false},"2.2.0":{"name":"async-kit","version":"2.2.0","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"nextgen-events":"^0.9.0","tree-kit":"^0.5.26"},"devDependencies":{"browserify":"^13.1.0","expect.js":"^0.3.1","jshint":"^2.9.2","mocha":"^2.5.3","uglify-js":"^2.7.0"},"scripts":{"test":"mocha -R dot"},"repository":{"type":"git","url":"git+https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","exit","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"copyright":{"title":"Async Kit","years":[2014,2016],"owner":"Cédric Ronvel"},"gitHead":"b0e35a83ddfd1f126fe345ac736124ee8adb1b9c","homepage":"https://github.com/cronvel/async-kit#readme","_id":"async-kit@2.2.0","_shasum":"6041515fdf285345a4bec6e757a4d5d6b590340d","_from":".","_npmVersion":"2.15.9","_nodeVersion":"4.5.0","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"6041515fdf285345a4bec6e757a4d5d6b590340d","size":202632,"noattachment":false,"key":"/async-kit/-/async-kit-2.2.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-2.2.0.tgz"},"_npmOperationalInternal":{"host":"packages-16-east.internal.npmjs.com","tmp":"tmp/async-kit-2.2.0.tgz_1474461998316_0.4224486437160522"},"publish_time":1474462000953,"_cnpm_publish_time":1474462000953,"_hasShrinkwrap":false},"2.1.6":{"name":"async-kit","version":"2.1.6","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"nextgen-events":"^0.9.0","tree-kit":"^0.5.26"},"devDependencies":{"browserify":"^13.1.0","expect.js":"^0.3.1","jshint":"^2.9.2","mocha":"^2.5.3","uglify-js":"^2.7.0"},"scripts":{"test":"mocha -R dot"},"repository":{"type":"git","url":"git+https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","exit","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"copyright":{"title":"Async Kit","years":[2014,2016],"owner":"Cédric Ronvel"},"gitHead":"f3a853e920536b7280f2a56c5a66a34ba264aad0","homepage":"https://github.com/cronvel/async-kit#readme","_id":"async-kit@2.1.6","_shasum":"b97c0e7fe38f73f87a7b97a2f157b733db01fb0d","_from":".","_npmVersion":"2.15.8","_nodeVersion":"4.4.7","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"b97c0e7fe38f73f87a7b97a2f157b733db01fb0d","size":200262,"noattachment":false,"key":"/async-kit/-/async-kit-2.1.6.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-2.1.6.tgz"},"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/async-kit-2.1.6.tgz_1469972847503_0.40996486600488424"},"publish_time":1469972849927,"_cnpm_publish_time":1469972849927,"_hasShrinkwrap":false},"2.1.5":{"name":"async-kit","version":"2.1.5","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"nextgen-events":"^0.6.0","tree-kit":"^0.5.26"},"devDependencies":{"browserify":"^13.0.1","expect.js":"^0.3.1","jshint":"^2.9.2","mocha":"^2.5.3","uglify-js":"^2.6.2"},"scripts":{"test":"mocha -R dot"},"repository":{"type":"git","url":"git+https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","exit","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"copyright":{"title":"Async Kit","years":[2014,2016],"owner":"Cédric Ronvel"},"gitHead":"4edc248d1f2aa400a79eeca84a0f59473d72da1f","homepage":"https://github.com/cronvel/async-kit#readme","_id":"async-kit@2.1.5","_shasum":"5e0a94647663ce7f5d180e59e20fcdee030d779d","_from":".","_npmVersion":"2.15.8","_nodeVersion":"4.4.7","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"5e0a94647663ce7f5d180e59e20fcdee030d779d","size":194279,"noattachment":false,"key":"/async-kit/-/async-kit-2.1.5.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-2.1.5.tgz"},"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/async-kit-2.1.5.tgz_1469785674249_0.9742430243641138"},"publish_time":1469785676640,"_cnpm_publish_time":1469785676640,"_hasShrinkwrap":false},"2.1.4":{"name":"async-kit","version":"2.1.4","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"nextgen-events":"^0.5.23","tree-kit":"^0.5.26"},"devDependencies":{"browserify":"^13.0.1","expect.js":"^0.3.1","jshint":"^2.9.2","mocha":"^2.5.3","uglify-js":"^2.6.2"},"scripts":{"test":"mocha -R dot"},"repository":{"type":"git","url":"git+https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","exit","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"copyright":{"title":"Async Kit","years":[2014,2016],"owner":"Cédric Ronvel"},"gitHead":"4154418f4f7d3e718857d2f0ee64ff9fd0e5a197","homepage":"https://github.com/cronvel/async-kit#readme","_id":"async-kit@2.1.4","_shasum":"10200c14a940f85d4f6873c1d4eefda00254e081","_from":".","_npmVersion":"2.15.8","_nodeVersion":"4.4.7","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"10200c14a940f85d4f6873c1d4eefda00254e081","size":194278,"noattachment":false,"key":"/async-kit/-/async-kit-2.1.4.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-2.1.4.tgz"},"_npmOperationalInternal":{"host":"packages-16-east.internal.npmjs.com","tmp":"tmp/async-kit-2.1.4.tgz_1469785597902_0.758275487460196"},"publish_time":1469785601039,"_cnpm_publish_time":1469785601039,"_hasShrinkwrap":false},"2.1.3":{"name":"async-kit","version":"2.1.3","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"nextgen-events":"^0.5.16","tree-kit":"^0.5.24"},"devDependencies":{"browserify":"^13.0.1","expect.js":"^0.3.1","jshint":"^2.9.2","mocha":"^2.5.3","uglify-js":"^2.6.2"},"scripts":{"test":"mocha -R dot"},"repository":{"type":"git","url":"git+https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","exit","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"copyright":{"title":"Async Kit","years":[2014,2016],"owner":"Cédric Ronvel"},"gitHead":"27a9a34fb09e7cb6964c99e971021b9c5c25a680","homepage":"https://github.com/cronvel/async-kit#readme","_id":"async-kit@2.1.3","_shasum":"968a2b5d2efc1fd5020e4fd7b2d331e230a30812","_from":".","_npmVersion":"2.15.8","_nodeVersion":"4.4.7","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"968a2b5d2efc1fd5020e4fd7b2d331e230a30812","size":194278,"noattachment":false,"key":"/async-kit/-/async-kit-2.1.3.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-2.1.3.tgz"},"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/async-kit-2.1.3.tgz_1467733584824_0.5178362433798611"},"publish_time":1467733587236,"_cnpm_publish_time":1467733587236,"_hasShrinkwrap":false},"2.1.2":{"name":"async-kit","version":"2.1.2","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"nextgen-events":"^0.5.16","tree-kit":"^0.5.24"},"devDependencies":{"browserify":"^13.0.1","expect.js":"^0.3.1","jshint":"^2.9.2","mocha":"^2.5.3","uglify-js":"^2.6.2"},"scripts":{"test":"mocha -R dot"},"repository":{"type":"git","url":"git+https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","exit","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"copyright":{"title":"Async Kit","years":[2014,2016],"owner":"Cédric Ronvel"},"gitHead":"033c63bc2ed7550f3828a7ae99a5861fd49564e0","homepage":"https://github.com/cronvel/async-kit#readme","_id":"async-kit@2.1.2","_shasum":"096096739011522bb9ef3135392bc4e3d3f0e328","_from":".","_npmVersion":"2.15.5","_nodeVersion":"4.4.5","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"096096739011522bb9ef3135392bc4e3d3f0e328","size":194094,"noattachment":false,"key":"/async-kit/-/async-kit-2.1.2.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-2.1.2.tgz"},"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/async-kit-2.1.2.tgz_1467193112782_0.054904320277273655"},"publish_time":1467193115363,"_cnpm_publish_time":1467193115363,"_hasShrinkwrap":false},"2.1.1":{"name":"async-kit","version":"2.1.1","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"nextgen-events":"^0.5.13","tree-kit":"^0.5.20"},"devDependencies":{"browserify":"^13.0.1","expect.js":"^0.3.1","jshint":"^2.9.2","mocha":"^2.5.3","uglify-js":"^2.6.2"},"scripts":{"test":"mocha -R dot"},"repository":{"type":"git","url":"git+https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","exit","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"copyright":{"title":"Async Kit","years":[2014,2016],"owner":"Cédric Ronvel"},"gitHead":"63fa3a75c1b8cf5d3eb0d7511dff4432e6fd7e3c","homepage":"https://github.com/cronvel/async-kit#readme","_id":"async-kit@2.1.1","_shasum":"fa43f8446f3385e928e35d3d5664fcccd24a9710","_from":".","_npmVersion":"2.15.5","_nodeVersion":"4.4.5","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"fa43f8446f3385e928e35d3d5664fcccd24a9710","size":194080,"noattachment":false,"key":"/async-kit/-/async-kit-2.1.1.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-2.1.1.tgz"},"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/async-kit-2.1.1.tgz_1465977298519_0.6512568625621498"},"publish_time":1465977301450,"_cnpm_publish_time":1465977301450,"_hasShrinkwrap":false},"2.1.0":{"name":"async-kit","version":"2.1.0","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"nextgen-events":"^0.5.13","tree-kit":"^0.5.20"},"devDependencies":{"browserify":"^13.0.1","expect.js":"^0.3.1","jshint":"^2.9.2","mocha":"^2.5.3","uglify-js":"^2.6.2"},"scripts":{"test":"mocha -R dot"},"repository":{"type":"git","url":"git+https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","exit","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"copyright":{"title":"Async Kit","years":[2014,2016],"owner":"Cédric Ronvel"},"gitHead":"025095ae0678ae2364fdaa207d250f675d826e7f","homepage":"https://github.com/cronvel/async-kit#readme","_id":"async-kit@2.1.0","_shasum":"0164d4ff5969673cd64324d0c4ff47f8db1cc40d","_from":".","_npmVersion":"2.15.5","_nodeVersion":"4.4.5","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"0164d4ff5969673cd64324d0c4ff47f8db1cc40d","size":193718,"noattachment":false,"key":"/async-kit/-/async-kit-2.1.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-2.1.0.tgz"},"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/async-kit-2.1.0.tgz_1465977107040_0.30058505455963314"},"publish_time":1465977110050,"_cnpm_publish_time":1465977110050,"_hasShrinkwrap":false},"2.0.1":{"name":"async-kit","version":"2.0.1","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"nextgen-events":"^0.5.13","tree-kit":"^0.5.20"},"devDependencies":{"browserify":"^13.0.1","expect.js":"^0.3.1","jshint":"^2.9.2","mocha":"^2.5.3","uglify-js":"^2.6.2"},"scripts":{"test":"mocha -R dot"},"repository":{"type":"git","url":"git+https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","exit","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"copyright":{"title":"Async Kit","years":[2014,2016],"owner":"Cédric Ronvel"},"gitHead":"94978d4314164b0a00a1696e16bc0a25b72ced26","homepage":"https://github.com/cronvel/async-kit#readme","_id":"async-kit@2.0.1","_shasum":"8b5672f1f32674e66b06847b7679792287414d41","_from":".","_npmVersion":"2.15.1","_nodeVersion":"4.4.4","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"8b5672f1f32674e66b06847b7679792287414d41","size":192591,"noattachment":false,"key":"/async-kit/-/async-kit-2.0.1.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-2.0.1.tgz"},"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/async-kit-2.0.1.tgz_1464600838146_0.41588816954754293"},"publish_time":1464600843588,"_cnpm_publish_time":1464600843588,"_hasShrinkwrap":false},"2.0.0":{"name":"async-kit","version":"2.0.0","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"nextgen-events":"^0.5.13","tree-kit":"^0.5.20"},"devDependencies":{"browserify":"^13.0.1","expect.js":"^0.3.1","jshint":"^2.9.2","mocha":"^2.5.3","uglify-js":"^2.6.2"},"scripts":{"test":"mocha -R dot"},"repository":{"type":"git","url":"git+https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","exit","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"copyright":{"title":"Async Kit","years":[2014,2016],"owner":"Cédric Ronvel"},"gitHead":"2b10836959d0917d15f587b551ef7ac520ee1b4e","homepage":"https://github.com/cronvel/async-kit#readme","_id":"async-kit@2.0.0","_shasum":"8a635a60470d5bcaf346de744bc3254763df1042","_from":".","_npmVersion":"2.15.1","_nodeVersion":"4.4.4","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"8a635a60470d5bcaf346de744bc3254763df1042","size":192634,"noattachment":false,"key":"/async-kit/-/async-kit-2.0.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-2.0.0.tgz"},"_npmOperationalInternal":{"host":"packages-12-west.internal.npmjs.com","tmp":"tmp/async-kit-2.0.0.tgz_1464600438382_0.6033134444151074"},"publish_time":1464600441317,"_cnpm_publish_time":1464600441317,"_hasShrinkwrap":false},"1.0.1":{"name":"async-kit","version":"1.0.1","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"tree-kit":"^0.5.19"},"devDependencies":{"browserify":"^13.0.0","expect.js":"^0.3.1","jshint":"^2.9.2","mocha":"^2.4.5","testling":"^1.7.1","uglify-js":"^2.6.2"},"testling":{"harness":"mocha","files":"test/*.js","browsers":["ie/8..latest","chrome/35..latest","firefox/35..latest","safari/latest","opera/11.0..latest","iphone/6","ipad/6","android-browser/latest"]},"scripts":{"test":"mocha -R dot"},"repository":{"type":"git","url":"git+https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","exit","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"gitHead":"4865f8816e68dcfe477733debdb347a833e8b94d","homepage":"https://github.com/cronvel/async-kit#readme","_id":"async-kit@1.0.1","_shasum":"3c44912932aa2125e1607a47be41299790c15afa","_from":".","_npmVersion":"2.15.1","_nodeVersion":"4.4.4","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"3c44912932aa2125e1607a47be41299790c15afa","size":192845,"noattachment":false,"key":"/async-kit/-/async-kit-1.0.1.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-1.0.1.tgz"},"_npmOperationalInternal":{"host":"packages-16-east.internal.npmjs.com","tmp":"tmp/async-kit-1.0.1.tgz_1464528279782_0.8915681054349989"},"publish_time":1464528281919,"_cnpm_publish_time":1464528281919,"_hasShrinkwrap":false},"1.0.0":{"name":"async-kit","version":"1.0.0","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"tree-kit":"^0.5.19"},"devDependencies":{"browserify":"^13.0.0","expect.js":"^0.3.1","jshint":"^2.9.2","mocha":"^2.4.5","testling":"^1.7.1","uglify-js":"^2.6.2"},"testling":{"harness":"mocha","files":"test/*.js","browsers":["ie/8..latest","chrome/35..latest","firefox/35..latest","safari/latest","opera/11.0..latest","iphone/6","ipad/6","android-browser/latest"]},"scripts":{"test":"mocha -R dot"},"repository":{"type":"git","url":"git+https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","exit","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"gitHead":"2fefdbd6a604b2a6c4d19acba7e481bcc6f452df","homepage":"https://github.com/cronvel/async-kit#readme","_id":"async-kit@1.0.0","_shasum":"2e4086038e2c1db9ab4b67ac91fec0806a6b021b","_from":".","_npmVersion":"2.14.12","_nodeVersion":"4.3.2","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"2e4086038e2c1db9ab4b67ac91fec0806a6b021b","size":111162,"noattachment":false,"key":"/async-kit/-/async-kit-1.0.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-1.0.0.tgz"},"_npmOperationalInternal":{"host":"packages-16-east.internal.npmjs.com","tmp":"tmp/async-kit-1.0.0.tgz_1461423663589_0.22506780829280615"},"publish_time":1461423665627,"_cnpm_publish_time":1461423665627,"_hasShrinkwrap":false},"0.6.10":{"name":"async-kit","version":"0.6.10","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"tree-kit":"^0.5.19"},"devDependencies":{"browserify":"^13.0.0","expect.js":"^0.3.1","jshint":"^2.9.2","mocha":"^2.4.5","testling":"^1.7.1","uglify-js":"^2.6.2"},"testling":{"harness":"mocha","files":"test/*.js","browsers":["ie/8..latest","chrome/35..latest","firefox/35..latest","safari/latest","opera/11.0..latest","iphone/6","ipad/6","android-browser/latest"]},"scripts":{"test":"mocha -R dot"},"repository":{"type":"git","url":"git+https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","exit","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"gitHead":"24ae69d57bf9cefdc6625df4b06d0588ed963608","homepage":"https://github.com/cronvel/async-kit#readme","_id":"async-kit@0.6.10","_shasum":"8c17f578e7c4251b44ad662705eaa3bde98ba8d8","_from":".","_npmVersion":"2.14.12","_nodeVersion":"4.3.2","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"8c17f578e7c4251b44ad662705eaa3bde98ba8d8","size":111245,"noattachment":false,"key":"/async-kit/-/async-kit-0.6.10.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-0.6.10.tgz"},"_npmOperationalInternal":{"host":"packages-16-east.internal.npmjs.com","tmp":"tmp/async-kit-0.6.10.tgz_1461423475292_0.4871082913596183"},"publish_time":1461423477193,"_cnpm_publish_time":1461423477193,"_hasShrinkwrap":false},"0.6.9":{"name":"async-kit","version":"0.6.9","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"tree-kit":"^0.5.6"},"devDependencies":{"expect.js":"^0.3.1","jshint":"^2.5.4","mocha":"^1.21.4"},"scripts":{"test":"mocha -R dot"},"repository":{"type":"git","url":"git+https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","exit","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"gitHead":"cac495993d4a3436fee5912c308ddca2c9697722","homepage":"https://github.com/cronvel/async-kit#readme","_id":"async-kit@0.6.9","_shasum":"7562ed65d0c415a91e38643b9dcfb3297e972514","_from":".","_npmVersion":"2.14.18","_nodeVersion":"4.2.2","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"7562ed65d0c415a91e38643b9dcfb3297e972514","size":83685,"noattachment":false,"key":"/async-kit/-/async-kit-0.6.9.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-0.6.9.tgz"},"_npmOperationalInternal":{"host":"packages-9-west.internal.npmjs.com","tmp":"tmp/async-kit-0.6.9.tgz_1455806049249_0.5249778234865516"},"publish_time":1455806053782,"_cnpm_publish_time":1455806053782,"_hasShrinkwrap":false},"0.6.8":{"name":"async-kit","version":"0.6.8","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"tree-kit":"^0.5.6"},"devDependencies":{"expect.js":"^0.3.1","jshint":"^2.5.4","mocha":"^1.21.4"},"scripts":{"test":"mocha -R dot"},"repository":{"type":"git","url":"git+https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","exit","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"gitHead":"5dc093b8238346144ea5068b332c4bd0856c0191","homepage":"https://github.com/cronvel/async-kit#readme","_id":"async-kit@0.6.8","_shasum":"ac6f0e452d714216de5afa29e6d9194aac0e736a","_from":".","_npmVersion":"2.14.10","_nodeVersion":"4.2.2","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"ac6f0e452d714216de5afa29e6d9194aac0e736a","size":83704,"noattachment":false,"key":"/async-kit/-/async-kit-0.6.8.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-0.6.8.tgz"},"publish_time":1449666199190,"_cnpm_publish_time":1449666199190,"_hasShrinkwrap":false},"0.6.7":{"name":"async-kit","version":"0.6.7","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"tree-kit":"^0.5.6"},"devDependencies":{"expect.js":"^0.3.1","jshint":"^2.5.4","mocha":"^1.21.4"},"scripts":{"test":"mocha -R dot"},"repository":{"type":"git","url":"git+https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","exit","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"gitHead":"fbce147a18889f3d80f505920b14388a429b2357","homepage":"https://github.com/cronvel/async-kit#readme","_id":"async-kit@0.6.7","_shasum":"f4175a6639e4572e2e56699885090c5d5fa499d6","_from":".","_npmVersion":"2.14.10","_nodeVersion":"4.2.2","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"f4175a6639e4572e2e56699885090c5d5fa499d6","size":83709,"noattachment":false,"key":"/async-kit/-/async-kit-0.6.7.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-0.6.7.tgz"},"publish_time":1448123310328,"_cnpm_publish_time":1448123310328,"_hasShrinkwrap":false},"0.6.6":{"name":"async-kit","version":"0.6.6","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"tree-kit":"^0.5.5"},"devDependencies":{"expect.js":"^0.3.1","jshint":"^2.5.4","mocha":"^1.21.4"},"scripts":{"test":"mocha"},"repository":{"type":"git","url":"git+https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","exit","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"gitHead":"17dbd362b46f476ebe8fece05856a47ec8ef73b9","homepage":"https://github.com/cronvel/async-kit#readme","_id":"async-kit@0.6.6","_shasum":"3a529e9741792531ae96baa44af7505c0dd6bd2e","_from":".","_npmVersion":"2.14.10","_nodeVersion":"4.2.2","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"3a529e9741792531ae96baa44af7505c0dd6bd2e","size":83685,"noattachment":false,"key":"/async-kit/-/async-kit-0.6.6.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-0.6.6.tgz"},"publish_time":1447173075425,"_cnpm_publish_time":1447173075425,"_hasShrinkwrap":false},"0.6.5":{"name":"async-kit","version":"0.6.5","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"tree-kit":"^0.5.5"},"devDependencies":{"expect.js":"^0.3.1","jshint":"^2.5.4","mocha":"^1.21.4"},"scripts":{"test":"mocha"},"repository":{"type":"git","url":"git+https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","exit","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"gitHead":"fac13cad08c257d42eb1e39d909360c515845734","homepage":"https://github.com/cronvel/async-kit#readme","_id":"async-kit@0.6.5","_shasum":"ee494b9102e975ddfac37996d92b8d714cb3d987","_from":".","_npmVersion":"2.14.1","_nodeVersion":"4.1.0","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"ee494b9102e975ddfac37996d92b8d714cb3d987","size":83679,"noattachment":false,"key":"/async-kit/-/async-kit-0.6.5.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-0.6.5.tgz"},"publish_time":1446131222520,"_cnpm_publish_time":1446131222520,"_hasShrinkwrap":false},"0.6.4":{"name":"async-kit","version":"0.6.4","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"tree-kit":"^0.5.5"},"devDependencies":{"expect.js":"^0.3.1","jshint":"^2.5.4","mocha":"^1.21.4"},"scripts":{"test":"mocha"},"repository":{"type":"git","url":"git+https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","exit","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"gitHead":"1f6c885b92b6c30750e16223fc7fbc54633fcd9c","homepage":"https://github.com/cronvel/async-kit#readme","_id":"async-kit@0.6.4","_shasum":"ff68ab17c51d10ebf33dc0fd7a9f3a3ffe601299","_from":".","_npmVersion":"2.14.1","_nodeVersion":"4.1.0","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"ff68ab17c51d10ebf33dc0fd7a9f3a3ffe601299","size":83616,"noattachment":false,"key":"/async-kit/-/async-kit-0.6.4.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-0.6.4.tgz"},"publish_time":1446129397095,"_cnpm_publish_time":1446129397095,"_hasShrinkwrap":false},"0.6.3":{"name":"async-kit","version":"0.6.3","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"tree-kit":"^0.5.5"},"devDependencies":{"expect.js":"^0.3.1","jshint":"^2.5.4","mocha":"^1.21.4"},"scripts":{"test":"mocha"},"repository":{"type":"git","url":"git+https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","exit","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"gitHead":"a0ee7da2954d062552c0158c5e8f73f2c8ba0b1f","homepage":"https://github.com/cronvel/async-kit#readme","_id":"async-kit@0.6.3","_shasum":"129afbb26cecd3d5ef70dc23094db4cdfcc81b17","_from":".","_npmVersion":"2.14.1","_nodeVersion":"4.1.0","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"129afbb26cecd3d5ef70dc23094db4cdfcc81b17","size":83609,"noattachment":false,"key":"/async-kit/-/async-kit-0.6.3.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-0.6.3.tgz"},"publish_time":1446127674812,"_cnpm_publish_time":1446127674812,"_hasShrinkwrap":false},"0.6.2":{"name":"async-kit","version":"0.6.2","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"tree-kit":"^0.5.5"},"devDependencies":{"expect.js":"^0.3.1","jshint":"^2.5.4","mocha":"^1.21.4"},"scripts":{"test":"mocha"},"repository":{"type":"git","url":"git+https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","exit","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"gitHead":"557453666418985a7114da1bb145b04985942ee7","homepage":"https://github.com/cronvel/async-kit#readme","_id":"async-kit@0.6.2","_shasum":"5620b30fc787b1470deb1f876f760db41b99a785","_from":".","_npmVersion":"2.14.1","_nodeVersion":"4.1.0","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"5620b30fc787b1470deb1f876f760db41b99a785","size":83577,"noattachment":false,"key":"/async-kit/-/async-kit-0.6.2.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-0.6.2.tgz"},"publish_time":1446127398708,"_cnpm_publish_time":1446127398708,"_hasShrinkwrap":false},"0.6.1":{"name":"async-kit","version":"0.6.1","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"tree-kit":"^0.5.5"},"devDependencies":{"expect.js":"^0.3.1","jshint":"^2.5.4","mocha":"^1.21.4"},"scripts":{"test":"mocha"},"repository":{"type":"git","url":"git+https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"gitHead":"1102ac4e1808145b279e7833079b7b3a4faf656a","homepage":"https://github.com/cronvel/async-kit#readme","_id":"async-kit@0.6.1","_shasum":"b749a37ffdf72c9cb0aa67abaf5a06961c7eb4f4","_from":".","_npmVersion":"2.14.1","_nodeVersion":"4.1.0","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"b749a37ffdf72c9cb0aa67abaf5a06961c7eb4f4","size":81223,"noattachment":false,"key":"/async-kit/-/async-kit-0.6.1.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-0.6.1.tgz"},"publish_time":1445269538431,"_cnpm_publish_time":1445269538431,"_hasShrinkwrap":false},"0.6.0":{"name":"async-kit","version":"0.6.0","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"tree-kit":"^0.5.5"},"devDependencies":{"expect.js":"^0.3.1","jshint":"^2.5.4","mocha":"^1.21.4"},"scripts":{"test":"mocha"},"repository":{"type":"git","url":"git+https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"gitHead":"3ecf7293bffb624b5d5a1123fc4cad436d4001f6","homepage":"https://github.com/cronvel/async-kit#readme","_id":"async-kit@0.6.0","_shasum":"23173da79c67ebdc5909df16c01feb27f1dcd203","_from":".","_npmVersion":"2.14.1","_nodeVersion":"4.1.0","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"23173da79c67ebdc5909df16c01feb27f1dcd203","size":81239,"noattachment":false,"key":"/async-kit/-/async-kit-0.6.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-0.6.0.tgz"},"publish_time":1445265256752,"_cnpm_publish_time":1445265256752,"_hasShrinkwrap":false},"0.5.10":{"name":"async-kit","version":"0.5.10","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"tree-kit":"^0.5.5"},"devDependencies":{"expect.js":"^0.3.1","jshint":"^2.5.4","mocha":"^1.21.4"},"scripts":{"test":"mocha"},"repository":{"type":"git","url":"git+https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"gitHead":"b7419653a9d8d0023d4989ecc6bf4b0ddefe89c5","homepage":"https://github.com/cronvel/async-kit#readme","_id":"async-kit@0.5.10","_shasum":"659d86b941c3760ad2a538e19820a57cee6ceacc","_from":".","_npmVersion":"2.9.0","_nodeVersion":"0.10.36","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"659d86b941c3760ad2a538e19820a57cee6ceacc","size":80684,"noattachment":false,"key":"/async-kit/-/async-kit-0.5.10.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-0.5.10.tgz"},"publish_time":1437669210343,"_cnpm_publish_time":1437669210343,"_hasShrinkwrap":false},"0.5.9":{"name":"async-kit","version":"0.5.9","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"tree-kit":"^0.5.0"},"devDependencies":{"expect.js":"^0.3.1","jshint":"^2.5.4","mocha":"^1.21.4"},"scripts":{"test":"mocha"},"repository":{"type":"git","url":"git+https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"gitHead":"806bcaecd279cee65040e7cb7c07b5492077034e","homepage":"https://github.com/cronvel/async-kit#readme","_id":"async-kit@0.5.9","_shasum":"786967e56b909e60c4b51927a64bdff5f95a5c4b","_from":".","_npmVersion":"2.9.0","_nodeVersion":"0.10.36","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"786967e56b909e60c4b51927a64bdff5f95a5c4b","size":80640,"noattachment":false,"key":"/async-kit/-/async-kit-0.5.9.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-0.5.9.tgz"},"publish_time":1431695882933,"_cnpm_publish_time":1431695882933,"_hasShrinkwrap":false},"0.5.8":{"name":"async-kit","version":"0.5.8","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"tree-kit":"^0.5.0"},"devDependencies":{"expect.js":"^0.3.1","jshint":"^2.5.4","mocha":"^1.21.4"},"scripts":{"test":"mocha"},"repository":{"type":"git","url":"https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"gitHead":"806004b64c896cb91444086b9f6be389eb7b2183","homepage":"https://github.com/cronvel/async-kit","_id":"async-kit@0.5.8","_shasum":"3922aa1de4ca6df15e528e0a7b2fa276b6af697b","_from":".","_npmVersion":"2.7.4","_nodeVersion":"0.10.36","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"3922aa1de4ca6df15e528e0a7b2fa276b6af697b","size":80090,"noattachment":false,"key":"/async-kit/-/async-kit-0.5.8.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-0.5.8.tgz"},"publish_time":1427471630974,"_cnpm_publish_time":1427471630974,"_hasShrinkwrap":false},"0.5.7":{"name":"async-kit","version":"0.5.7","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"tree-kit":"^0.5.0"},"devDependencies":{"expect.js":"^0.3.1","jshint":"^2.5.4","mocha":"^1.21.4"},"scripts":{"test":"mocha"},"repository":{"type":"git","url":"https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"gitHead":"cf44c8081426f0806c07851bb23b2644cc335a04","homepage":"https://github.com/cronvel/async-kit","_id":"async-kit@0.5.7","_shasum":"63930e26882c3c1178eba4c4fcef0f68f3e967d6","_from":".","_npmVersion":"2.7.1","_nodeVersion":"0.10.36","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"63930e26882c3c1178eba4c4fcef0f68f3e967d6","size":79578,"noattachment":false,"key":"/async-kit/-/async-kit-0.5.7.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-0.5.7.tgz"},"publish_time":1427381880742,"_cnpm_publish_time":1427381880742,"_hasShrinkwrap":false},"0.5.6":{"name":"async-kit","version":"0.5.6","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"tree-kit":"^0.4.1"},"devDependencies":{"expect.js":"^0.3.1","jshint":"^2.5.4","mocha":"^1.21.4"},"scripts":{"test":"mocha"},"repository":{"type":"git","url":"https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"gitHead":"eee5ce6f4160ee683e0b22d9ca1df284eb773e20","homepage":"https://github.com/cronvel/async-kit","_id":"async-kit@0.5.6","_shasum":"d35d2edf0fe4a37befc05b01a4f7e9593fab416c","_from":".","_npmVersion":"2.1.2","_nodeVersion":"0.10.33","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"d35d2edf0fe4a37befc05b01a4f7e9593fab416c","size":78965,"noattachment":false,"key":"/async-kit/-/async-kit-0.5.6.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-0.5.6.tgz"},"publish_time":1421763567407,"_cnpm_publish_time":1421763567407,"_hasShrinkwrap":false},"0.5.5":{"name":"async-kit","version":"0.5.5","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"tree-kit":"^0.3.1"},"devDependencies":{"expect.js":"^0.3.1","jshint":"^2.5.4","mocha":"^1.21.4"},"scripts":{"test":"mocha"},"repository":{"type":"git","url":"https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"gitHead":"c9a22c617e9469528d9c3a672ac2ce5b948f5cfc","homepage":"https://github.com/cronvel/async-kit","_id":"async-kit@0.5.5","_shasum":"841093ee814edfd16917b063208d58fc0fff05d1","_from":".","_npmVersion":"2.1.2","_nodeVersion":"0.10.32","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"841093ee814edfd16917b063208d58fc0fff05d1","size":78946,"noattachment":false,"key":"/async-kit/-/async-kit-0.5.5.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-0.5.5.tgz"},"publish_time":1415126364799,"_cnpm_publish_time":1415126364799,"_hasShrinkwrap":false},"0.5.4":{"name":"async-kit","version":"0.5.4","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"tree-kit":"^0.3.1"},"devDependencies":{"expect.js":"^0.3.1","jshint":"^2.5.4","mocha":"^1.21.4"},"scripts":{"test":"mocha"},"repository":{"type":"git","url":"https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"gitHead":"31a39cc5372e3b4900acc477313947e26bd99bcc","homepage":"https://github.com/cronvel/async-kit","_id":"async-kit@0.5.4","_shasum":"ab6b06ecd7ebdf2a465bc773bba856bc46daac80","_from":".","_npmVersion":"2.1.2","_nodeVersion":"0.10.32","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"ab6b06ecd7ebdf2a465bc773bba856bc46daac80","size":77168,"noattachment":false,"key":"/async-kit/-/async-kit-0.5.4.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-0.5.4.tgz"},"publish_time":1415105748230,"_cnpm_publish_time":1415105748230,"_hasShrinkwrap":false},"0.5.2":{"name":"async-kit","version":"0.5.2","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"tree-kit":"^0.2.4"},"devDependencies":{"expect.js":"^0.3.1","jshint":"^2.5.4","mocha":"^1.21.4"},"scripts":{"test":"mocha"},"repository":{"type":"git","url":"https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"gitHead":"9ef756db9318d80269d37c72f73b35307844ec2f","homepage":"https://github.com/cronvel/async-kit","_id":"async-kit@0.5.2","_shasum":"6613e8039bfcf7224b88a9480ee0bf6a6c3c4086","_from":".","_npmVersion":"1.4.16","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"6613e8039bfcf7224b88a9480ee0bf6a6c3c4086","size":77292,"noattachment":false,"key":"/async-kit/-/async-kit-0.5.2.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-0.5.2.tgz"},"publish_time":1414419913343,"_cnpm_publish_time":1414419913343,"_hasShrinkwrap":false},"0.5.1":{"name":"async-kit","version":"0.5.1","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"tree-kit":"^0.2.4"},"devDependencies":{"expect.js":"^0.3.1","jshint":"^2.5.4","mocha":"^1.21.4"},"scripts":{"test":"mocha"},"repository":{"type":"git","url":"https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"gitHead":"bf0496dcc03bbf8930a29516f94caa6f96263c16","homepage":"https://github.com/cronvel/async-kit","_id":"async-kit@0.5.1","_shasum":"922a61d68276555b994b7d18f78487167e21bd35","_from":".","_npmVersion":"1.4.16","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"922a61d68276555b994b7d18f78487167e21bd35","size":74396,"noattachment":false,"key":"/async-kit/-/async-kit-0.5.1.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-0.5.1.tgz"},"publish_time":1414404775602,"_cnpm_publish_time":1414404775602,"_hasShrinkwrap":false},"0.4.13":{"name":"async-kit","version":"0.4.13","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"tree-kit":"^0.2.4"},"devDependencies":{"expect.js":"^0.3.1","jshint":"^2.5.4","mocha":"^1.21.4"},"scripts":{"test":"mocha"},"repository":{"type":"git","url":"https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"gitHead":"3a1f53cb9500489eaf5c1c88d4222c6e31ec885e","homepage":"https://github.com/cronvel/async-kit","_id":"async-kit@0.4.13","_shasum":"ce4a4d3e21e44a1b252746d3da92dc19ac4822cf","_from":".","_npmVersion":"1.4.16","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"ce4a4d3e21e44a1b252746d3da92dc19ac4822cf","size":72879,"noattachment":false,"key":"/async-kit/-/async-kit-0.4.13.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-0.4.13.tgz"},"publish_time":1414325144998,"_cnpm_publish_time":1414325144998,"_hasShrinkwrap":false},"0.4.12":{"name":"async-kit","version":"0.4.12","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"tree-kit":"^0.2.4"},"devDependencies":{"expect.js":"^0.3.1","jshint":"^2.5.4","mocha":"^1.21.4"},"scripts":{"test":"mocha"},"repository":{"type":"git","url":"https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"gitHead":"8a1345b1875a6e76f76abbd525f4b865b2f1a193","homepage":"https://github.com/cronvel/async-kit","_id":"async-kit@0.4.12","_shasum":"83b018ec32bce4ed162a98fac3db98e566a10a50","_from":".","_npmVersion":"1.4.16","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"83b018ec32bce4ed162a98fac3db98e566a10a50","size":72759,"noattachment":false,"key":"/async-kit/-/async-kit-0.4.12.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-0.4.12.tgz"},"publish_time":1410786424365,"_cnpm_publish_time":1410786424365,"_hasShrinkwrap":false},"0.4.11":{"name":"async-kit","version":"0.4.11","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"tree-kit":"^0.2.1"},"devDependencies":{"expect.js":"^0.3.1","jshint":"^2.5.4","mocha":"^1.21.4"},"scripts":{"test":"mocha"},"repository":{"type":"git","url":"https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"gitHead":"e3f9e96e7e4cc9962ab1c70a4a92f7e37cdfa589","homepage":"https://github.com/cronvel/async-kit","_id":"async-kit@0.4.11","_shasum":"5a3c9db5df5118932f3f36c4476e7da0cafdbe6e","_from":".","_npmVersion":"1.4.16","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"5a3c9db5df5118932f3f36c4476e7da0cafdbe6e","size":71707,"noattachment":false,"key":"/async-kit/-/async-kit-0.4.11.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-0.4.11.tgz"},"publish_time":1410365851108,"_cnpm_publish_time":1410365851108,"_hasShrinkwrap":false},"0.4.10":{"name":"async-kit","version":"0.4.10","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"tree-kit":"^0.2.1"},"devDependencies":{"expect.js":"^0.3.1","jshint":"^2.5.4","mocha":"^1.21.4"},"scripts":{"test":"mocha"},"repository":{"type":"git","url":"https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"gitHead":"d39906252b57b2b07522535bb4792a6f6c0baf83","homepage":"https://github.com/cronvel/async-kit","_id":"async-kit@0.4.10","_shasum":"fa3637bd3e23400581109300540053ecadaaaf6e","_from":".","_npmVersion":"1.4.16","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"fa3637bd3e23400581109300540053ecadaaaf6e","size":80967,"noattachment":false,"key":"/async-kit/-/async-kit-0.4.10.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-0.4.10.tgz"},"publish_time":1410364944040,"_cnpm_publish_time":1410364944040,"_hasShrinkwrap":false},"0.4.9":{"name":"async-kit","version":"0.4.9","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"tree-kit":"^0.2.1"},"devDependencies":{"expect.js":"^0.3.1","jshint":"^2.5.4","mocha":"^1.21.4"},"scripts":{"test":"mocha"},"repository":{"type":"git","url":"https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"gitHead":"d39906252b57b2b07522535bb4792a6f6c0baf83","homepage":"https://github.com/cronvel/async-kit","_id":"async-kit@0.4.9","_shasum":"e5fc098c68e204f1912418ccb326afff5c8c5935","_from":".","_npmVersion":"1.4.16","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"e5fc098c68e204f1912418ccb326afff5c8c5935","size":80963,"noattachment":false,"key":"/async-kit/-/async-kit-0.4.9.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-0.4.9.tgz"},"publish_time":1410358194076,"_cnpm_publish_time":1410358194076,"_hasShrinkwrap":false},"0.4.8":{"name":"async-kit","version":"0.4.8","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"tree-kit":"^0.2.1"},"devDependencies":{"expect.js":"^0.3.1","jshint":"^2.5.4","mocha":"^1.21.4"},"scripts":{"test":"mocha"},"repository":{"type":"git","url":"https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"gitHead":"b1ec7ee6eaaba8d5ae4e89e2528f307edc3a8cf6","homepage":"https://github.com/cronvel/async-kit","_id":"async-kit@0.4.8","_shasum":"444fe18902b600ba95952ff71155448c27ede427","_from":".","_npmVersion":"1.4.21","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"444fe18902b600ba95952ff71155448c27ede427","size":80517,"noattachment":false,"key":"/async-kit/-/async-kit-0.4.8.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-0.4.8.tgz"},"publish_time":1409705803469,"_cnpm_publish_time":1409705803469,"_hasShrinkwrap":false},"0.4.6":{"name":"async-kit","version":"0.4.6","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"tree-kit":"^0.1.4"},"devDependencies":{"expect.js":"^0.3.1","jshint":"^2.5.4","mocha":"^1.21.4"},"scripts":{"test":"mocha"},"repository":{"type":"git","url":"https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"gitHead":"ac5fd3bbcb93795dce10ad3145fc1b294b158d6e","homepage":"https://github.com/cronvel/async-kit","_id":"async-kit@0.4.6","_shasum":"50de8cf00157c79ee28bb77b8d2a1d39329491c8","_from":".","_npmVersion":"1.4.21","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"50de8cf00157c79ee28bb77b8d2a1d39329491c8","size":80516,"noattachment":false,"key":"/async-kit/-/async-kit-0.4.6.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-0.4.6.tgz"},"publish_time":1408868783328,"_cnpm_publish_time":1408868783328,"_hasShrinkwrap":false},"0.4.5":{"name":"async-kit","version":"0.4.5","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"expect.js":"^0.3.1","jshint":"^2.5.4","mocha":"^1.21.4","tree-kit":"^0.1.4"},"devDependencies":{"expect.js":"^0.3.1","jshint":"^2.5.4","mocha":"^1.21.4"},"scripts":{"test":"mocha"},"repository":{"type":"git","url":"https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"gitHead":"a7a35fa53e0b9966936292dbfa9eafcd3b1c25df","homepage":"https://github.com/cronvel/async-kit","_id":"async-kit@0.4.5","_shasum":"193cbb1fb275c411b1f303edf77bc126bcd16376","_from":".","_npmVersion":"1.4.21","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"193cbb1fb275c411b1f303edf77bc126bcd16376","size":80523,"noattachment":false,"key":"/async-kit/-/async-kit-0.4.5.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-0.4.5.tgz"},"publish_time":1408800692685,"_cnpm_publish_time":1408800692685,"_hasShrinkwrap":false},"0.4.4":{"name":"async-kit","version":"0.4.4","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"tree-kit":"^0.0.5"},"devDependencies":{"expect.js":"~0.3.1","jshint":"~2.4.4","mocha":"~1.17.1"},"scripts":{"test":"mocha"},"repository":{"type":"git","url":"https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"gitHead":"59da368ec17a7d1cda8a385fad599d65f7e9d9c8","homepage":"https://github.com/cronvel/async-kit","_id":"async-kit@0.4.4","_shasum":"80f21b7b2294f776337cc9604a988299d4e28722","_from":".","_npmVersion":"1.4.23","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"80f21b7b2294f776337cc9604a988299d4e28722","size":80977,"noattachment":false,"key":"/async-kit/-/async-kit-0.4.4.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-0.4.4.tgz"},"publish_time":1408715169393,"_cnpm_publish_time":1408715169393,"_hasShrinkwrap":false},"0.4.3":{"name":"async-kit","version":"0.4.3","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"tree-kit":"^0.0.5"},"devDependencies":{"expect.js":"~0.3.1","jshint":"~2.4.4","mocha":"~1.17.1"},"scripts":{"test":"mocha"},"repository":{"type":"git","url":"https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"gitHead":"bc8aea3e9eb02db046faeac0ea93b14f2a19b4fd","homepage":"https://github.com/cronvel/async-kit","_id":"async-kit@0.4.3","_shasum":"e830696ff5002a748b0583e264ff017be283c675","_from":".","_npmVersion":"1.4.23","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"e830696ff5002a748b0583e264ff017be283c675","size":80973,"noattachment":false,"key":"/async-kit/-/async-kit-0.4.3.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-0.4.3.tgz"},"publish_time":1408029403246,"_cnpm_publish_time":1408029403246,"_hasShrinkwrap":false},"0.4.2":{"name":"async-kit","version":"0.4.2","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"tree-kit":"^0.0.5"},"devDependencies":{"expect.js":"~0.3.1","jshint":"~2.4.4","mocha":"~1.17.1"},"scripts":{"test":"mocha"},"repository":{"type":"git","url":"https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"gitHead":"ca4661b0a4648c006f8b4ae5483b2dc0df6d792f","homepage":"https://github.com/cronvel/async-kit","_id":"async-kit@0.4.2","_shasum":"61422177379ea829bdae6c8b8140e4e527a9bbc0","_from":".","_npmVersion":"1.4.23","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"61422177379ea829bdae6c8b8140e4e527a9bbc0","size":80606,"noattachment":false,"key":"/async-kit/-/async-kit-0.4.2.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-0.4.2.tgz"},"publish_time":1408029258640,"_cnpm_publish_time":1408029258640,"_hasShrinkwrap":false},"0.4.1":{"name":"async-kit","version":"0.4.1","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"tree-kit":"0.0.4"},"devDependencies":{"expect.js":"~0.3.1","jshint":"~2.4.4","mocha":"~1.17.1"},"scripts":{"test":"mocha"},"repository":{"type":"git","url":"https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"gitHead":"e650f2b7be95bd3a8e1bb88fa2ce77b55a6c7a81","homepage":"https://github.com/cronvel/async-kit","_id":"async-kit@0.4.1","_shasum":"7595e7eebdbae7a1fb3ee36b2a7f05b574912af8","_from":".","_npmVersion":"1.4.16","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"7595e7eebdbae7a1fb3ee36b2a7f05b574912af8","size":80482,"noattachment":false,"key":"/async-kit/-/async-kit-0.4.1.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-0.4.1.tgz"},"publish_time":1407238011613,"_cnpm_publish_time":1407238011613,"_hasShrinkwrap":false},"0.4.0":{"name":"async-kit","version":"0.4.0","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"tree-kit":"0.0.4"},"devDependencies":{"expect.js":"~0.3.1","jshint":"~2.4.4","mocha":"~1.17.1"},"scripts":{"test":"mocha"},"repository":{"type":"git","url":"https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"gitHead":"be4e80961178b5c50fb8526070b4482f5d262f88","homepage":"https://github.com/cronvel/async-kit","_id":"async-kit@0.4.0","_shasum":"c3d1b0ee04367d251fd761c58a9088a11a329505","_from":".","_npmVersion":"1.4.16","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"c3d1b0ee04367d251fd761c58a9088a11a329505","size":79693,"noattachment":false,"key":"/async-kit/-/async-kit-0.4.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-0.4.0.tgz"},"publish_time":1406998402855,"_cnpm_publish_time":1406998402855,"_hasShrinkwrap":false},"0.3.29":{"name":"async-kit","version":"0.3.29","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"tree-kit":"0.0.4"},"devDependencies":{"expect.js":"~0.3.1","jshint":"~2.4.4","mocha":"~1.17.1"},"scripts":{"test":"mocha"},"repository":{"type":"git","url":"https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"gitHead":"becaad4b0915b2bf9ffa40c6ff5d5899c9f08be7","homepage":"https://github.com/cronvel/async-kit","_id":"async-kit@0.3.29","_shasum":"747b0daba5a9e61ade8e73d1fb09d9693102170f","_from":".","_npmVersion":"1.4.16","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"747b0daba5a9e61ade8e73d1fb09d9693102170f","size":78696,"noattachment":false,"key":"/async-kit/-/async-kit-0.3.29.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-0.3.29.tgz"},"publish_time":1406993658444,"_cnpm_publish_time":1406993658444,"_hasShrinkwrap":false},"0.3.28":{"name":"async-kit","version":"0.3.28","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"tree-kit":"0.0.4"},"devDependencies":{"expect.js":"~0.3.1","jshint":"~2.4.4","mocha":"~1.17.1"},"scripts":{"test":"mocha"},"repository":{"type":"git","url":"https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"gitHead":"cfca141b9fae0e27a0c6a77cb5577a34787075f3","homepage":"https://github.com/cronvel/async-kit","_id":"async-kit@0.3.28","_shasum":"1bcb9fb3eac8d9f2c6e4908a1d20d13e5097fd64","_from":".","_npmVersion":"1.4.16","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"1bcb9fb3eac8d9f2c6e4908a1d20d13e5097fd64","size":78017,"noattachment":false,"key":"/async-kit/-/async-kit-0.3.28.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-0.3.28.tgz"},"publish_time":1406973410628,"_cnpm_publish_time":1406973410628,"_hasShrinkwrap":false},"0.3.27":{"name":"async-kit","version":"0.3.27","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"tree-kit":"0.0.4"},"devDependencies":{"expect.js":"~0.3.1","jshint":"~2.4.4","mocha":"~1.17.1"},"scripts":{"test":"mocha"},"repository":{"type":"git","url":"https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"gitHead":"bf23a75e9b37b27ee5d8bc05323292272474b76f","homepage":"https://github.com/cronvel/async-kit","_id":"async-kit@0.3.27","_shasum":"7bb3f9972d05d997a5aef2f654bfaa93d7864da4","_from":".","_npmVersion":"1.4.23","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"7bb3f9972d05d997a5aef2f654bfaa93d7864da4","size":78567,"noattachment":false,"key":"/async-kit/-/async-kit-0.3.27.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-0.3.27.tgz"},"publish_time":1406904855371,"_cnpm_publish_time":1406904855371,"_hasShrinkwrap":false},"0.3.26":{"name":"async-kit","version":"0.3.26","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"tree-kit":"0.0.4"},"devDependencies":{"expect.js":"~0.3.1","jshint":"~2.4.4","mocha":"~1.17.1"},"scripts":{"test":"mocha"},"repository":{"type":"git","url":"https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"gitHead":"fe98ef9f11bc845c5c367834ddbcce5432f11ac7","homepage":"https://github.com/cronvel/async-kit","_id":"async-kit@0.3.26","_shasum":"8e9206d355a84e526af318cec04e91eb3b46ce6c","_from":".","_npmVersion":"1.4.16","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"8e9206d355a84e526af318cec04e91eb3b46ce6c","size":77989,"noattachment":false,"key":"/async-kit/-/async-kit-0.3.26.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-0.3.26.tgz"},"publish_time":1406731729171,"_cnpm_publish_time":1406731729171,"_hasShrinkwrap":false},"0.3.25":{"name":"async-kit","version":"0.3.25","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"tree-kit":"0.0.4"},"devDependencies":{"expect.js":"~0.3.1","jshint":"~2.4.4","mocha":"~1.17.1"},"scripts":{"test":"mocha"},"repository":{"type":"git","url":"https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"gitHead":"e4d00b84e7830e016768d175f722650d9a03ca38","homepage":"https://github.com/cronvel/async-kit","_id":"async-kit@0.3.25","_shasum":"d8d1feb0b942c1cbfd33c42a57660c51a7fd866d","_from":".","_npmVersion":"1.4.16","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"d8d1feb0b942c1cbfd33c42a57660c51a7fd866d","size":77945,"noattachment":false,"key":"/async-kit/-/async-kit-0.3.25.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-0.3.25.tgz"},"publish_time":1406731529222,"_cnpm_publish_time":1406731529222,"_hasShrinkwrap":false},"0.3.24":{"name":"async-kit","version":"0.3.24","description":"A simple and powerful async abstraction lib for easily writing Node.js code.","main":"lib/async.js","directories":{"test":"test"},"dependencies":{"tree-kit":"0.0.4"},"devDependencies":{"expect.js":"~0.3.1","jshint":"~2.4.4","mocha":"~1.17.1"},"scripts":{"test":"mocha"},"repository":{"type":"git","url":"https://github.com/cronvel/async-kit.git"},"keywords":["async","asynchronous","flow","jobs","series","parallel","conditionnal","if","then","else","catch","finally","waterfall","race","foreach","map","reduce","while","loop","callback","retry","events","scheduler","progress","csk","easy"],"author":{"name":"Cédric Ronvel"},"license":"MIT","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"gitHead":"cc0e5ed78620dfe24704c3af29add7a6e3edf9e9","homepage":"https://github.com/cronvel/async-kit","_id":"async-kit@0.3.24","_shasum":"95d498687ab855462d3d7d83c923da3fa3b473d7","_from":".","_npmVersion":"1.4.16","_npmUser":{"name":"cronvel","email":"cedric.ronvel@gmail.com"},"maintainers":[{"name":"cronvel","email":"cedric.ronvel@gmail.com"}],"dist":{"shasum":"95d498687ab855462d3d7d83c923da3fa3b473d7","size":77940,"noattachment":false,"key":"/async-kit/-/async-kit-0.3.24.tgz","tarball":"http://registry.cnpm.dingdandao.com/async-kit/download/async-kit-0.3.24.tgz"},"publish_time":1406731388510,"_cnpm_publish_time":1406731388510,"_hasShrinkwrap":false}},"readme":"\n# Async Kit\n\nA simple and powerful async abstraction layer lib to easily write Node.js code.\n\n* License: MIT\n* Platform: Node.js and modern browsers\n\nWhile inspired in some way by [caolan/async](https://github.com/caolan/async), Async Kit uses a completely different approach.\n\nRather than having a whole bunch of specific functions, this lib provides a generic way to solve async code flow.\nSo anything that can be done by caolan/async lib can be converted to Async Kit, but the reverse is not always true.\n\nUsing natural syntax really easy to become familiar with, you will be able to code great things effortlessly, \nwithout cumbersome callback hell, and without coding again and again the same async pattern and logic.\n\nPlease read [this doc on Github](https://github.com/cronvel/async-kit.git), npmjs.org truncate it.\n\n\n\n# Quick example\n\n```js\nasync.series( [\n\tfunction( callback ) {\n\t\tletsConnectToDatabase( callback ) ;\n\t} ,\n\tfunction( callback ) {\n\t\tletsQueryTheDatabase( callback ) ;\n\t} ,\n\tfunction( callback ) {\n\t\tdoMoreQueries( callback ) ;\n\t}\n] )\n.exec( function( error , results ) {\n\tif ( error ) { console.log( 'Doh!' ) ; }\n\telse { console.log( 'Yay! Done!' ) ; }\n} ) ;\n```\n\nThis small example prepares an async job's list and executes it. \n\nAll jobs are executed in series, one after one.\n\nEach callback works the Node.js way, the first argument is always the *error* argument.\n\nIf one job fails (ie it triggers its callback with an error or any *truthy* value), all remaining jobs are skipped \nand the `exec()`'s callback is instantly called with that error.\n\nWhen every jobs are finished, the `exec()`'s callback is called, the *results* argument contains an array of the *arguments* passed by each job to its callback.\n\n\n\n# Features\n\n### Code flow\n\n* [Series](#ref.async.series)\n* [Parallel](#ref.async.parallel)\n* [Race (parallel, stop when the first job finish without error)](#ref.async.race)\n* [Waterfall (series, each job transmits its results to the next)](#ref.async.waterfall)\n* [While loop](#ref.async.while.do), [do while loop](#ref.async.do.while)\n* [Foreach](#ref.async.foreach)\n* [Map](#ref.async.map)\n* [Reduce](#ref.async.reduce)\n* [Async if](#ref.async.if.and)/[and](#ref.async.and)\n* [Async if](#ref.async.if.or)/[or](#ref.async.or)\n* [Nested async if](#ref.nested)\n\n\n\n### Modifier\n\n* [Set the parallel limit](#ref.async.Plan.parallel)\n* [While conditions](#ref.async.Plan.while)\n* [Repeat jobs a fixed amount of time](#ref.async.Plan.repeat)\n* [Iterator](#ref.async.Plan.iterator)\n* [Timeout for jobs (avoid pending jobs troubles)](#ref.async.Plan.timeout)\n* [Retry jobs on error (useful for managing outgoing connection for example)](#ref.async.Plan.retry)\n* [Async/sync job's scheduling controle (turn sync jobs into async, change the *nice* value of the job's scheduler)](#ref.async.Plan.nice)\n* [Continue on error or not](#ref.async.Plan.fatal)\n* [Transmission of all jobs' results or only results of the last job](#ref.async.Plan.lastJobOnly)\n* [Then callback, if successful](#ref.callback.thenCallback)\n* [Else callback, for *async if*](#ref.callback.elseCallback)\n* [Catch callback, if an error occurs](#ref.callback.catchCallback)\n* [Finally callback, always executed](#ref.callback.finallyCallback)\n* [Define input arguments to invoke `.exec()` with, that are transmitted to jobs](#ref.async.Plan.execMapping)\n* [Export a plan as a simple function](#ref.async.Plan.export)\n\n\n\n### Misc\n\n* [Async exit](#ref.async.exit)\n* [Safe Timeout](#ref.async.setSafeTimeout)\n\n\n\n# Install\n\nUse Node Package Manager:\n\n    npm install async-kit\n\n\n\n# Plan stage & exec stage concept\n\nThis is an important concept to understand when using this lib: there are two stages to perform an async flow.\n\nIn the first stage, you define the plan.\nAll plan definition returns an `async.Plan` object.\n\nThen you can `.exec()` your plan as many time as you want. All the *exec* method family returns an *execContext* object.\nThe first time an `async.Plan` is `.exec()`, it becomes locked forever: you cannot modify it anymore.\n\nThe example above becomes:\n\n```js\n// Plan stage, jobs' definition\nvar plan = async.series( [\n\tfunction( callback ) {\n\t\tletsConnectToDatabase( callback ) ;\n\t} ,\n\tfunction( callback ) {\n\t\tletsQueryTheDatabase( callback ) ;\n\t} ,\n\tfunction( callback ) {\n\t\tdoMoreQueries( callback ) ;\n\t}\n] ) ;\n\n// Change the plan, each job should terminate within 200ms\nplan.timeout( 200 ) ;\n\n// Exec stage\nplan.exec( function( error , results ) {\n\tif ( error ) { console.log( 'Doh!' ) ; }\n\telse { console.log( 'Yay! Done!' ) ; }\n} ) ;\n\nplan.exec( function( error , results ) {\n\tif ( error ) { console.log( 'Doh x2!' ) ; }\n\telse { console.log( 'Yay! Again!' ) ; }\n} ) ;\n\n// No effect! Plan cannot be modified anymore!\nplan.timeout( 200 ) ;\n```\n\n\n\n# Callbacks & the error argument\n\nIn most case, callbacks work in the Node.js fashion, except explicitly expressed otherwise.\nThe callback should always be called with arguments in this order:\n\n```js\ncallback( [error] , [argument1] , [argument2] , ... ) ;\n```\n\nThat's it: the first argument, if present, is always assumed to be the error argument.\n\nAsync Kit will assume that something is wrong with a job if it get **ANY** truthy value as the error argument,\nweither it is an instanceof of *Error*, *true*, *'my error message'*, or any expression evaluated to true.\nIf you are unsure what are *truthy* and *falsy* values, \n[check this out](http://docs.nodejitsu.com/articles/javascript-conventions/what-are-truthy-and-falsy-values).\n\n\n\n# Common use cases\n\n### Perform asynchronous database queries\n\n**Use case**: this is probably the most common use case for any website, we have to perform\na series of async query, each query should be sent after the previous one succeed.\n\n```js\nasync.waterfall( [\n\tfunction getUserByLoginAndPassword( login , password , callback ) {\n\t\tdbUserCollection.findOne( { login: login, password: password } , callback ) ;\n\t} ,\n\t\n\tfunction getUserPhoto( userDocument , callback ) {\n\t\tdbPhotoCollection.findOne( { _id: userDocument.photoID } , callback ) ;\n\t}\n] )\n.timeout( 200 )\n.then( function( photoDocument ) {\n\thttpResponse.writeHead( 200 , { 'Content-Type' : 'image/png' } ) ;\n\thttpResponse.write( photoDocument.rawData ) ;\n\thttpResponse.end() ;\n} )\n.catch( function( error ) {\n\thttpResponse.writeHead( 404 , { 'Content-Type' : 'text/plain' } ) ;\n\thttpResponse.write( '404 - Not found.' ) ;\n\thttpResponse.end() ;\n} )\n.execArgs( 'john@example.com' , 'god' ) ;\n```\n\n**Explanation**: \n- *async.waterfall()* declare a job list in *waterfall* mode, when one job finish, it pass arguments to the next job\n- *dbUserCollection.findOne()* & *dbPhotoCollection.findOne* are some kind of MongoDB pseudo-code,\n  they return a document from the collection\n- *getUserPhoto()* receive a document of the authenticated user\n- *timeout( 200 )* assume each job should perform within 200ms, if a job hit the time limit, it works as if\n  the job itself passed an error to its callback, here *.catch()* is immediately triggered if it happens\n- *.then()* declare a *then callback* in the *Plan* itself, it will be triggered if we manage to authenticate the user\n  and get its photo\n- *.catch()* declare a *catch callback* in the *Plan* itself, it will be triggered if a job fails\n- *.execArgs()* is used when you do not want to pass callback to `.exec()`-like function, since by default\n  `.exec()` assume than its last argument is the *finally callback*, so since we are in *waterfall* mode, every\n  arguments passed to *execArgs()* are passed only to the first job\n\nYou can chain as many queries as you want, without burying them deeper and deeper in nested callback hell.\n\n\n\n### Get informations on various mirror URL as fast as possible\n\n**Use case**: we want to get some contents (JSON, HTML, RSS, etc), many mirrors are available \nbut we don't want to try them one at a time, we want to try them all at once and finish \nas soon as possible, when the first non-error response is received.\n\n```js\nasync.race( [ url1 , url2 , url3 , url4 ] )\n.using( function( url , callback ) {\n\tgetContentFromUrl( url , callback ) ;\n} )\n.then( function( contents ) {\n\tdoSomethingWithContent( contents ) ;\n} )\n.catch( function( error ) {\n\tconsole.log( \"Cannot get contents from any mirror\" ) ;\n} )\n.exec() ;\n```\n\n**Explanation**: \n- *async.race()* declare a job list of four racing elements to process, in parallel mode, \n  triggering callback when the first non-error job finished\n- *.using()* declare the function used to process them (iterator-like, if it means anything in a parallel context)\n- *getContentFromUrl()* is a user-defined function that take an URL and a callback, try to get contents from\n  that URL and call its callback the Node.js way: `callback( error , contents )`\n- *.then()* declare a *then callback* in the *Plan* itself, it will be triggered if we get what we want\n- *doSomethingWithContent()* is a user-defined function, that process the contents\n- *.catch()* declare a *catch callback* in the *Plan* itself, it will be triggered if **ALL** jobs have failed\n- here *.exec()* is called without argument, so it executes the *Plan* with no callback of its own: \n  if we do not want to re-use the *Plan* it improves readability to use *.then()* and *.catch()* directly\n  in the *Plan* definition part.\n\n\n\n### Async foreach\n\n**Use case**: we have an array, we want to iterate it but there are some async code in the iterator, \nand we really want that each element to be processed one at a time. The native javascript *myArray.forEach()*\nwould parallelize the async part even if we don't want.\n\n```js\nasync.foreach( myArray , function( element , callback ) {\n\tdoSomethingAsyncWithElement( element , callback ) ;\n} )\n.exec( function( error ) {\n\tconsole.log( \"Finished!\" ) ;\n} ) ;\n```\n\n**Explanation**: \n- *async.foreach( myArray , function )* define a job list with myArray, and specify an iterator function\n- *doSomethingAsyncWithElement()* should trigger its callback when the job is finished\n- When all element have been processed, the `.exec()`'s callback is triggered, as usual\n\nYou can as well add a ```.parallel()``` before `.exec()`, you still have the advantage versus native forEach()\nof having a general callback triggered when everything is asynchronously done.\n\n\t\n\n# Reference\n\n* [*Do* family factories](#ref.do.factories)\n\t* [async.do()](#ref.async.do)\n\t* [async.series()](#ref.async.series)\n\t* [async.parallel()](#ref.async.parallel)\n\t* [async.race()](#ref.async.race)\n\t* [async.waterfall()](#ref.async.waterfall)\n\t* [async.foreach()](#ref.async.foreach)\n\t* [async.map()](#ref.async.map)\n\t* [async.reduce()](#ref.async.reduce)\n\t* [async.while().do()](#ref.async.while.do)\n\t* [async.do().while()](#ref.async.do.while)\n* [*Conditional* family factories](#ref.conditional.factories)\n\t* [async.and()](#ref.async.and)\n\t* [async.or()](#ref.async.or)\n\t* [async.if.and()](#ref.async.if.and)\n\t* [async.if.or()](#ref.async.if.or)\n\t* [Nested condition()](#ref.nested)\n* [Class async.Plan](#ref.async.Plan)\n\t* [.do()](#ref.async.Plan.do)\n\t* [.parallel()](#ref.async.Plan.parallel)\n\t* [.race()](#ref.async.Plan.race)\n\t* [.waterfall()](#ref.async.Plan.waterfall)\n\t* [.while()](#ref.async.Plan.while)\n\t* [.repeat()](#ref.async.Plan.repeat)\n\t* [.fatal()](#ref.async.Plan.fatal)\n\t* [.boolean()](#ref.async.Plan.boolean)\n\t* [.transmitError()](#ref.async.Plan.transmitError)\n\t* [.timeout()](#ref.async.Plan.timeout)\n\t* [.retry()](#ref.async.Plan.retry)\n\t* [Mixing .timeout() & .retry()](#ref.mixing.timeout.retry)\n\t* [.lastJobOnly()](#ref.async.Plan.lastJobOnly)\n\t* [.mapping1to1()](#ref.async.Plan.mapping1to1)\n\t* [.using()](#ref.async.Plan.using)\n\t* [.iterator()](#ref.async.Plan.iterator)\n\t* [.aggregator()](#ref.async.Plan.aggregator)\n\t* [.nice()](#ref.async.Plan.nice)\n\t* [.then()](#ref.async.Plan.then)\n\t* [.else()](#ref.async.Plan.else)\n\t* [.catch()](#ref.async.Plan.catch)\n\t* [.finally()](#ref.async.Plan.finally)\n\t* [.clone()](#ref.async.Plan.clone)\n\t* [.export()](#ref.async.Plan.export)\n\t* [.exec()](#ref.async.Plan.exec)\n\t* [.execFinally()](#ref.async.Plan.execFinally)\n\t* [.execThenCatch()](#ref.async.Plan.execThenCatch)\n\t* [.execThenElse()](#ref.async.Plan.execThenElse)\n\t* [.execThenElseCatch()](#ref.async.Plan.execThenElseCatch)\n\t* [.execArgs()](#ref.async.Plan.execArgs)\n\t* [.execMapping()](#ref.async.Plan.execMapping)\n\t* [.execKV()](#ref.async.Plan.execKV)\n* [Callback types](#ref.callback)\n\t* [thenCallback()](#ref.callback.thenCallback)\n\t* [elseCallback()](#ref.callback.elseCallback)\n\t* [catchCallback()](#ref.callback.catchCallback)\n\t* [finallyCallback()](#ref.callback.finallyCallback)\n\t* [whileCallback()](#ref.callback.whileCallback)\n* [Class async.ExecContext](#ref.async.ExecContext)\n\t* [.getJobsStatus()](#ref.async.ExecContext.getJobsStatus)\n\t* [Event: 'progress'](#ref.async.ExecContext.event.progress)\n\t* [Event: 'resolved'](#ref.async.ExecContext.event.resolved)\n\t* [Event: 'finish'](#ref.async.ExecContext.event.finish)\n* [Class async.JobContext](#ref.async.JobContext)\n\t* [.execContext](#ref.async.JobContext.execContext)\n\t* [.abort()](#ref.async.JobContext.abort)\n\t* [Event: 'timeout'](#ref.async.JobContext.event.finish)\n* [Misc utilities](#ref.misc)\n\t* [async.exit](#ref.async.exit)\n\t* [async.setSafeTimeout](#ref.async.setSafeTimeout)\n\t* [async.clearSafeTimeout](#ref.async.clearSafeTimeout)\n\n\n\n\n\n<a name=\"ref.do.factories\"></a>\n## *Do* family factories\n\nThey create `async.Plan` object and set up the job's list.\n\nNote that an `async.Plan` do not perform anything until its `.exec()` method is called (see Class async.Plan for details).\nThe following informations describe what happend when the plan is executed.\n\nBy default, jobs are processed one at a time.\n\nIf an error occurs, no new jobs will be processed.\n\nJobs should trigger their callback the Node.js way: `callback( error , [arg1] , [arg2] , ... )`.\n\nThe `finally` callbacks (see below) are triggered when the first error occurs or when all jobs are done.\n\nNote: **all factories below are described relative to this point of reference.**\nOnly differences will be reported.\n\n\n\n<a name=\"ref.async.do\"></a>\n### async.do( jobsList )\n\n* jobsList `Array` or `Object`\n\nThis is the most generic factory, with default behaviour, with no further limitation.\n\nSee *Do* family factories above.\n\n\n\n<a name=\"ref.async.series\"></a>\n### async.series( jobsList )\n\n* jobsList `Array` or `Object`\n\nSet up a job's list to be processed in series.\n\n**Calling `.parallel()` on it has no effect, it will process jobs one at a time anyway.**\n\n\n\n<a name=\"ref.async.parallel\"></a>\n### async.parallel( jobsList )\n\n* jobsList `Array` or `Object`\n\nSet up a job's list to be processed in parallel.\nThe parallel limit is set to `Infinity` by default.\n\n\n\n<a name=\"ref.async.race\"></a>\n### async.race( jobsList )\n\n* jobsList `Array` or `Object`\n\nSet up a job's list to be processed in parallel.\nThe parallel limit is set to `Infinity` by default.\n\nThe whole jobs processing aborts when the first job finish without error.\n\nJobs processing continues on error.\n\nNote that `async.race( jobsList )` is the same than `async.parallel( jobsList ).fatal( false ).race()`.\n\n\n\n<a name=\"ref.async.waterfall\"></a>\n### async.waterfall( jobsList )\n\n* jobsList `Array` or `Object`\n\nSet up a job's list to be processed in series, in waterfall mode.\n\nEach job is called with the previous job output as arguments.\n\nBy default, the `.exec()` method accept arguments to pass to the first job.\n\nBy default, the *error* argument is not transmitted, see [.transmitError()](#ref.async.Plan.transmitError) for details.\n\nOnly the last job pass its result to [*finallyCallback*](#ref.callback.finallyCallback), [*thenCallback*](#ref.callback.thenCallback) etc...\nSee [.lastJobOnly()](#ref.async.Plan.lastJobOnly) for details.\n\n**Calling `.parallel()` on it has no effect, it will process jobs one at a time anyway.**\n\nExample:\n```js\nasync.waterfall( [\n\tfunction( str , callback ) {\n\t\t// str equals 'oh', passed by .exec()'s first argument\n\t\tcallback( null , str + ' my' ) ;\n\t\t// null is the error argument, it is not transmitted to the next job by default\n\t} ,\n\tfunction( str , callback ) {\n\t\t// str equals 'oh my', passed by the previous job\n\t\tcallback( null , str + ' wonderful' ) ;\n\t\t// null is the error argument, it is not transmitted to the next job by default\n\t} ,\n\tfunction( str , callback ) {\n\t\t// str equals 'oh my wonderful', passed by the previous job\n\t\tcallback( null , str + ' result' ) ;\n\t}\n] )\n.exec( 'oh' , function( error , results ) {\n\t// output 'oh my wonderful result'\n\tconsole.log( results ) ;\n} ) ;\n```\n\nAny number of arguments can be used.\nThe previous example can become something like this:\n\n```js\nasync.waterfall( [\n\tfunction( str1 , str2 , str3 , callback ) {\n\t\t// str1 equals 'Hello', passed by .exec()'s first argument\n\t\t// str2 equals 'world', passed by .exec()'s second argument\n\t\t// str3 equals 'this', passed by .exec()'s third argument\n\t\tcallback( null , str1 + ' ' + str2 + ' ' + str3 + ' is' ) ;\n\t} ,\n\tfunction( str , callback ) {\n\t\t// str equals 'Hello world, this is', passed by the previous job\n\t\tcallback( null , str + ' my' , 'wonderful' ) ;\n\t} ,\n\tfunction( str1 , str2 , callback ) {\n\t\t// str1 equals 'Hello world, this is my', passed by the previous job\n\t\t// str2 equals 'wonderful', passed by the previous job\n\t\tcallback( null , str1 + ' ' + str2 + ' result' ) ;\n\t}\n] )\n.exec( 'Hello' , 'world,' , 'this' , function( error , results ) {\n\t// output 'Hello world, this is my wonderful result'\n\tconsole.log( results ) ;\n} ) ;\n```\n\n\n\n<a name=\"ref.async.foreach\"></a>\n### async.foreach( container , iterator )\n\n* container `Array` or `Object` to iterate\n* iterator `Function( element , [key] , [container] , callback )` where:\n\t* element `mixed` the current array element or object's property value\n\t* key `Number` or `String` the current key (index for array, property name for object)\n\t* container `Array` or `Object`, this is the original container\n\t* callback `Function( error , [arg1] , [arg2] , ... )` a node-style callback to trigger on completion\n\nIt performs an async foreach, iterating *container*, using *iterator*. \n\nDepending on `iterator.length` (the number of arguments the user-provided function accept), the arguments passed to *iterator*\nwill be `( element , callback )`, `( element , key , callback )`, or `( element , key , container , callback )`\nwhere *element* is the current element, *key* is the current key (the current index if *container* is an Array,\nor the current property's name if *container* is an object), *container* is the original container,\nand *callback* is the completion's callback.\n\nBy default, `element`s are performed one at a time, in **series**.\n\nIf the *iterator* fails for one element, it will continue processing others elements anyway.\n\nNote that `async.foreach( container , iterator )` is equal to `async.do( container ).iterator( iterator )`.\n\nExample:\n```js\nvar myArray = [ 'one' , 'two' , 'three' ] ;\n\nasync.foreach( myArray , function( element , callback ) {\n\t// Called three time, with element's value: 'one', then 'two', then 'three'\n\tdoSomethingAsyncWithElement( element , callback ) ;\n} )\n.exec( function( error , results ) {\n\tthingsToDoWhenFinished() ;\n} ) ;\n```\n\n\n\n<a name=\"ref.async.map\"></a>\n### async.map( container , iterator )\n\n* container `Array` or `Object` to iterate\n* iterator `Function( element , [key] , [container] , callback )` where:\n\t* element `mixed` the current array element or object's property value\n\t* key `Number` or `String` the current key (index for array, property name for object)\n\t* container `Array` or `Object`, this is the original container\n\t* callback `Function( error , [arg1] , [arg2] , ... )` a node-style callback to trigger on completion\n\nIt performs an async map, iterating *container*, using *iterator*.\nAn async map takes an array and produces a new array, each value in the input array is mapped into the output array, preserving indexes.\nIf an object is provided instead of an array, it produces a new object, preserving keys.\n\nDepending on `iterator.length` (the number of arguments the user-provided function accept), the arguments passed to *iterator*\nwill be `( element , callback )`, `( element , key , callback )`, or `( element , key , container , callback )`\nwhere *element* is the current element, *key* is the current key (the current index if *container* is an Array,\nor the current property's name if *container* is an object), *container* is the original container,\nand *callback* is the completion's callback.\n\nBy default, `element`s are performed in **parallel** mode.\n\nIf the *iterator* fails for one element, it will continue processing others elements anyway.\n\nThe *results* (see example below) directly map the *container*, like [`.mapping1to1()`](#ref.async.Plan.mapping1to1) do.\n\nNote that `async.map( container , iterator )` is equal to `async.do( container ).iterator( iterator ).mapping1to1()`.\n\nExample:\n```js\nvar myArray = [ 'my' , 'wonderful' , 'result' ] ;\n\nasync.map( myArray , function( element , callback ) {\n\t\n\tsetTimeout( function() {\n\t\tcallback( null , element.length ) ;\n\t} , 0 ) ;\n} )\n.exec( function( error , results ) {\n\t// we expect results to be equal to [ 2, 9, 6 ]\n\texpect( results ).to.be.eql( [ 2, 9, 6 ] ) ;\n} ) ;\n```\n\n\n\n<a name=\"ref.async.reduce\"></a>\n### async.reduce( container , [aggregatedValue] , iterator )\n\n* container `Array` or `Object` to iterate\n* aggregatedValue `mixed` the initial default reduced (aggregated) value\n* iterator `Function( aggregatedValue , element , [key] , [container] , callback )` where:\n\t* aggregatedValue `mixed` the current reduced value\n\t* element `mixed` the current array element or object's property value\n\t* key `Number` or `String` the current key (index for array, property name for object)\n\t* container `Array` or `Object`, this is the original container\n\t* callback `Function( error , newAggregatedValue , [arg1] , [arg2] , ... )` a node-style callback to trigger on completion, where:\n\t\t* newAggregatedValue `mixed` is the new reduced value that will be passed to the next iteration\n\nIt performs an async reduce, iterating *container*, using *iterator*.\nAn async reduce takes an array (or an object), and iterate it to produce a single reduced value (though actually this single *value*\ncan be anything we like, even an array or object).\n\nDepending on `iterator.length` (the number of arguments the user-provided function accept), the arguments passed to *iterator*\nwill be `( aggregatedValue , element , callback )`, `( aggregatedValue , element , key , callback )`,\nor `( aggregatedValue , element , key , container , callback )`, where *aggregatedValue* is the current reduced value,\n*element* is the current element, *key* is the current key (the current index if *container* is an Array,\nor the current property's name if *container* is an object), *container* is the original container,\nand *callback* is the completion's callback.\n\nEach `element` is processed one at a time, in **series**.\n**Calling `.parallel()` on this `async.Plan` has no effect, it will process jobs one at a time anyway.**\n\nIf the *iterator* fails for one element, the whole process *aborts and fails*.\n\n**If you do \\*NOT\\* provide a default aggregatedValue in the `async.Plan`, then the `.exec()` method require an initial *aggregatedValue* as its first argument.**\n\nNote that `async.reduce( initialAggregatedValue , container , iterator )` is equal to\n`async.do( container ).iterator( iterator ).aggregator( true , true , initialAggregatedValue )`.\n\nExample:\n```js\nvar myArray = [ 'my' , 'wonderful' , 'result' ] ;\n\nvar plan = async.reduce( myArray , function( aggregate , element , callback ) {\n\t\n\tsetTimeout( function() {\n\t\t// Asyncly calculate the sum of the length\n\t\tcallback( null , aggregate + element.length ) ;\n\t} , 0 ) ;\n} )\n// No aggregatedValue is provided in the async.Plan creation,\n// so the first argument of exec() must be the initial aggregatedValue.\n.exec( 0 , function( error , results ) {\n\t// we expect results to be equal to 17\n\texpect( results ).to.be.eql( 17 ) ;\n} ) ;\n```\n\n\n\n<a name=\"ref.async.while.do\"></a>\n### async.while( whileCallback ).do( jobsList )\n\n* [whileCallback](#ref.callback.whileCallback) `Function( error , results , logicCallback )` triggered for checking if we have to continue or not, where:\n\t* error `mixed` any truthy means error\n\t* results `Array` or `Object` that maps the *jobsList*\n\t* logicCallback `Function( [error] , loopAgain )` where:\n\t\t* error `mixed` any truthy means error\n\t\t* loopAgain `Boolean` anything else is considered either *truthy* or *falsy*\n* jobsList `Array` or `Object`\n\nIt performs an async while loop.\nThis is equivalent to javascript code:\n```js\nwhile ( expression ) {\n\t// do something\n}\n```\n\nUnlike others factories, in order to mimic native language syntax, this factory accepts a [*whileCallback*](#ref.callback.whileCallback) \nrather than a job's list. \nSo you have to use the `async.Plan`'s `.do()` method to pass the job's list.\n\nAsync while loops behave diffently than other `async.Plan` in various way:\n* it first performs an async conditional check, if the outcome is falsy, then the execution is immediately aborted\n* it performs jobs, just the way other `async.Plan` do, but:\n* when everything is done, it performs again a conditional check, and if its outcome is truthy, it loops again (and again, etc...)\n* when the outcome of the conditional check is falsy, callbacks (*finally, then, catch, else*) are triggered \nwith the results of the last iteration only (if any), so older iteration's results are lost unless checked and used\nin the [*whileCallback*](#ref.callback.whileCallback).\n\nExample:\n```js\nasync.while( function( error , results , logicCallback ) {\n\t// If doMoreWorksFunction() triggers its callback demanding another loop...\n\tlogicCallback( results.moreWorks[ 1 ] === 'loop' ) ;\n} )\n.do( {\n\tpreliminaries: doPreliminariesFunction ,\n\tworks: doWorksFunction ,\n\tmoreWorks: doMoreWorksFunction\n} ) \n.exec( function( error , results ) {\n\t// 'results' contains only the results of the last loop\n\tthingsToDoWhenFinished() ;\n} ) ;\n```\n\n\n\n<a name=\"ref.async.do.while\"></a>\n### async.do( jobsList ).while( whileCallback )\n\n* jobsList `Array` or `Object`\n* [whileCallback](#ref.callback.whileCallback) `Function( error , results , logicCallback )` triggered for checking if we have to continue or not, where:\n\t* error `mixed` any truthy means error\n\t* results `Array` or `Object` that maps the *jobsList*\n\t* logicCallback `Function( [error] , loopAgain )` where:\n\t\t* error `mixed` any truthy means error\n\t\t* loopAgain `Boolean` anything else is considered either *truthy* or *falsy*\n\nIt performs an async do-while loop.\n\nIt works exactly the same as [async.while().do()](#ref.async.while.do), except that, by default, the [*whileCallback*](#ref.callback.whileCallback)\nis triggered at the end of the process rather than at the beginning.\nThis is equivalent to javascript code:\n```js\ndo {\n\t// do something\n} while ( expression )\n```\n\n\n\n<a name=\"ref.factories.conditional\"></a>\n## *Conditional* family factories\n\nThe following factories instanciate `async.Plan` of the *conditional* family.\nThere are few differencies with `async.Plan` of the *do* family.\n\nJobs have three type of outcome: true, false and error.\n\nJobs should trigger their callback this way: `callback( [error] , result )`.\nIn this case, you are not forced to pass the error argument first.\nHowever, if you pass only one argument, it will be assumed to be an error only if it is an instance of `Error`.\n\nIf an error occurs, it will stop processing any new jobs by default.\nIf *true* or *false* is the outcome, then it all depends on the type of conditional.\n\nThere are two mode: boolean or not.\nWhen boolean mode is used, any non-error outcome are cast to a boolean value.\nIn non-boolean mode, the final outcome is simply the outcome of the last processed job.\nThe non-boolean mode is in line with the way javascript handle expression like `myVar1 && myVar2`\n(it will produce *myVar1* if *myVar1* is falsy, else *myVar2*).\n\nBy default, jobs are performed in series, one at a time.\nIt is possible to parallelize jobs processing, but it can change the final outcome in non-boolean mode,\nthough the truthness of that outcome remains unchanged.\n\n\n\n<a name=\"ref.async.and\"></a>\n### async.and( jobsList )\n\n* jobsList `Array` or `Object`\n\nIt performs an async conditional *AND*, so it keeps processing jobs as long as the outcome is truthy.\n\nBy default, it uses the non-boolean mode, so the final outcome is the outcome of the last job.\n\n\n\n<a name=\"ref.async.or\"></a>\n### async.or( jobsList )\n\n* jobsList `Array` or `Object`\n\nIt performs an async conditional *OR*, so it keeps processing jobs as long as the outcome is falsy.\n\nBy default, it uses the non-boolean mode, so the final outcome is the outcome of the last job.\n\n\n\n<a name=\"ref.async.if.and\"></a>\n### async.if.and( jobsList )\n\n* jobsList `Array` or `Object`\n\nIt performs an async conditional *AND*, so it keeps processing jobs as long as the outcome is truthy.\n\nBy default, it uses the boolean mode, so the final outcome is a boolean.\n\n\n\n<a name=\"ref.async.if.or\"></a>\n### async.if.or( jobsList )\n\n* jobsList `Array` or `Object`\n\nIt performs an async conditional *OR*, so it keeps processing jobs as long as the outcome is falsy.\n\nBy default, it uses the boolean mode, so the final outcome is a boolean.\n\n\n\n<a name=\"ref.nested\"></a>\n### Nested condition\n\nWe can create nested conditional statement just like in native language. See the following example:\n\n```js\nasync.if.and( [\n\tifSomeConditionsAreMetAnd\n\tasync.or( [\n\t\tifSomeMoreConditionsAreMet\n\t\torIfSomeAlternativeConditionsAreMet\n\t] )\n] )\n.then( function() {\n\t// Do something if the async conditional statement is true\n} )\n.else( function() {\n\t// Do something if the async conditional statement is false\n} )\n.exec() ;\n```\n`ifSomeConditionsAreMetAnd`, `ifSomeMoreConditionsAreMet` and `orIfSomeAlternativeConditionsAreMet` \nare user functions asyncly checking if some conditions are met or not.\n\nThis works because if a job is an instance of `async.Plan`, the `.exec()` method will be used as a callback.\n\nWe can use as many nested async conditional as we want.\n\n\n\n<a name=\"ref.async.Plan\"></a>\n## Class async.Plan\n\nEach factory come with a default set of behaviour. \nAlmost all behaviours can be modified by methods.\n\nHowever, modifier methods have no effect as soon as an `.exec()` family method is used on the current `async.Plan`.\n\n\n\n<a name=\"ref.async.Plan.do\"></a>\n### .do( jobsList )\n\n* jobsList `Array` or `Object`\n\nIt set the job's list.\nMost of time, the job's list is already passed as the first argument of a factory, so we don't have to use this method.\n\nHowever, it is used in the [`async.while().do()`](#ref.async.while) scheme, to mimic common programming language syntax.\n\n\n\n<a name=\"ref.async.Plan.parallel\"></a>\n### .parallel( [parallelLimit] )\n\n* parallelLimit `Number`, if omited or true: `Infinity`, if false: 1\n\nIt set the parallel limit or concurrency limit.\nThis is the number of async jobs that can be running/pending at a time.\n\nUsing a parallel limit value of 1, jobs are processed one at a time, like `async.series()` factory does.\n\nUsing a parallel limit value of Infinity, jobs are processed all at once (if they are async),\nlike `async.parallel()` factory does.\n\nUsing a parellel limit value of 3, for example, the first three jobs will start at once, when one jobs\ntriggers its callback the fourth job starts, when another job triggers its callback then the fifth job starts,\nand so on...\n\n\n\n<a name=\"ref.async.Plan.race\"></a>\n### .race( raceMode )\n\n* raceMode `Boolean`, if omited: `true`\n\nSet the *race* mode.\n\nIn *race* mode, the whole jobs processing aborts when the first job finish without error.\n\nSee [`async.race()`](#ref.async.race) factory.\n\n\n\n<a name=\"ref.async.Plan.waterfall\"></a>\n### .waterfall( waterfallMode )\n\n* waterfallMode `Boolean`, if omited: `true`\n\nSet the *waterfall* mode.\n\nIn *waterfall* mode, each job is called with the previous job output as arguments,\nand the first job receives arguments directly from `.exec()`.\n\nSee [`async.waterfall()`](#ref.async.waterfall) factory.\n\n\n\n<a name=\"ref.async.Plan.while\"></a>\n### .while( whileCallback , whileActionBefore )\n\n* [whileCallback](#ref.callback.whileCallback) `Function( error , results , logicCallback )` triggered for checking if we have to continue or not, where:\n\t* error `mixed` any truthy means error\n\t* results `Array` or `Object` that maps the *jobsList*\n\t* logicCallback `Function( [error] , loopAgain )` where:\n\t\t* error `mixed` any truthy means error\n\t\t* loopAgain `Boolean` anything else is considered either *truthy* or *falsy*\n* whileActionBefore `Boolean`, if omited: `false`\n\nSet a *while* loop mode.\n\nThe argument *whileActionBefore* is used to define if the condition should be evaluated at the begining of the loop\nor at the end of the loop.\n\nSee [async.while().do()](#ref.async.while.do) (if *whileActionBefore* is true) or\n[async.do().while()](#ref.async.do.while) (if *whileActionBefore* is false) for details.\n\n\n\n<a name=\"ref.async.Plan.repeat\"></a>\n### .repeat( n )\n\n* n `Number`\n\nSet loop mode, the job's list will run *n* times.\n\nActually this is a shortcut, it simply set up a *while* loop with a trivial callback.\nAvoid to reinvent the wheel again and again.\n\nSee [.while()](#ref.async.Plan.while) for details.\n\n\n\n<a name=\"ref.async.Plan.fatal\"></a>\n### .fatal( [errorsAreFatal] )\n\n* errorsAreFatal `Boolean`, if omitted: true\n\nIf errors are fatal (the default in most factories), then whenever a job fails the whole process is aborted immediately.\n\nIf error are not fatal, others jobs will be processed even if some errors occurs.\n\n\n\n<a name=\"ref.async.Plan.boolean\"></a>\n### .boolean( [castToBoolean] )\n\n* castToBoolean `Boolean`, if omitted: true\n\nThis only have effects in *Conditional* family `async.Plan`.\n\nIf *castToBoolean* is true, the outcome of jobs and the final outcome is always `true` or `false`:\nthis is what happens with `async.if.and()` and `async.if.or()` factories by default.\n\nIf *castToBoolean* is false, the outcome of each job remains unchanged, and the final outcome is \nthe outcome of the last job: this is what happens with `async.and()` and `async.or()` factories by default.\n\n\n\n<a name=\"ref.async.Plan.transmitError\"></a>\n### .transmitError( [transmit] )\n\n* transmit `Boolean`, if omitted: true\n\nThis only have effects in waterfall mode, using `async.waterfall()` factory.\n\nIf *transmit* is true, each job received the *error* argument of the previous job.\n\nIf *transmit* is false, the *error* argument pass by the previous job is not transmitted.\n\nExample with `.transmitError`:\n```js\nasync.waterfall( [\n\tfunction( str , callback ) {\n\t\t// str equals 'oh', passed by .exec()'s first argument\n\t\tcallback( null , str + ' my' ) ;\n\t} ,\n\tfunction( lastError , str , callback ) {\n\t\t// lastError equals null\n\t\t// str equals 'oh my', passed by the previous job\n\t\tcallback( new Error() , str + ' wonderful' ) ;\n\t} ,\n\tfunction( lastError , str , callback ) {\n\t\t// lastError is now an instance of Error\n\t\t// str equals 'oh my wonderful', passed by the previous job\n\t\tcallback( null , str + ' result' ) ;\n\t}\n] )\n.transmitError( true )\n.fatal( false )\n.exec( 'oh' , function( error , results ) {\n\t// output 'oh my wonderful result'\n\tconsole.log( results ) ;\n} ) ;\n```\n\n\n\n<a name=\"ref.async.Plan.timeout\"></a>\n### .timeout( [jobsTimeout] )\n\n* jobsTimeout `undefined` or `Number` (in ms), if omited: `undefined`\n\nSet up a time limit for each job.\nIf a job doesn't trigger its callback within this time, its callback is triggered anyway automatically with an error:\n`new Error( 'Timeout' )`.\n\nIf the job triggers its callback later, it will be ignored.\n\nIt comes in handy in any network or service dependant async jobs, like database queries, HTTP request, and so on.\n\nAlso this is **IMPORTANT** to understand that this is the async-kit lib who is responsible for the timeout to kick in:\nthe user code is still in execution, it may be pending, waiting for I/O to perform some other tasks.\nThe timeout feature give us the chance to be sure that our callback get triggered within some time limit, **it doesn't\ninterupt the job in any way**.\n\n\n\n<a name=\"ref.async.Plan.retry\"></a>\n### .retry( [maxRetry] , [baseTimeout] , [multiply] , [maxTimeout] )\n\n* maxRetry `Number`, it doesn't update if omited\n* baseTimeout `Number` in **ms**, it doesn't update if omited\n* multiply `Number`, it doesn't update if omited\n* maxTimeout `Number`, in **ms**, it doesn't update if omited\n\nThis modifier allows jobs in error to be retried.\n\nThis is a very nice feature when dealing with other servers or external services, because they could be unavailable at any time,\nbut we don't want important tasks to fail.\n\nIt allows fine tuning:\n* maxRetry: the maximum number of times a job should be retried, before giving up with the last error\n* baseTimeout: the base timeout in **ms** before retrying, this is the timeout before the first retry\n* multiply: the timeout before retrying is multiplied by this value for each new retry\n* maxTimeout: the maximum timeout in **ms**, it will never be more despite the increasing retries with a multiply value > 1.\n\nFor example, assuming `maxRetry: 6, baseTimeout: 100, multiply: 1.5, maxTimeout: 500`, we will get for each retry \nthe timeout value:\n* 1st - 100ms\n* 2nd - 150ms (=100*1.5)\n* 3rd - 225ms (=150*1.5)\n* 4th - 338ms (=225*1.5)\n* 5th - 500ms (capped by maxTimeout)\n* 6th - 500ms (capped by maxTimeout)\n\nA good practice is to specify a low *baseTimeout*, around 10ms, and a high *multiply* value, at least 2.\nThis way, things keep reactive when a sporadic error occurs, but if something is really wrong with some of our servers,\nwe didn't flood them to death, we give them a chance to recover.\n\nIf *maxRetry* is high, we may consider using a *maxTimeout* value, between 10 seconds and 2 minutes.\nThis could be really bad if some actions are retried few hours or few days later, totally out of context.\n\nBy the way, those are general guidance, it all depends on the criticy of the tasks, wheither it involves local, lan, vlan\nor internet networks, and more importantly: if those actions take place behind the scene or if some end-user are currently\nexpecting results quickly.\n\nExample, with some *behind the scene* *cron*-like tasks, involving third-party services:\n```js\nasync.parallel( [\n\tretrieveSomeRSS ,\n\tquerySomeThirdPartyAPI ,\n\tqueryMoreThirdPartyAPI\n] )\n// At most 100 retries, starting with a 100 ms timeout before retrying,\n// multiplying timeout by 2 at each new try but capped at 10 minutes timeout\n.retry( 100 , 100 , 2 , 60000 )\n.exec( function( error , results ) {\n\t// update your local database or cache\n} ) ;\n```\n\n\n\n<a name=\"ref.mixing.timeout.retry\"></a>\n### Mixing .timeout() & .retry()\n\nMixing `.timeout()` and `.retry()` can be extremely powerful.\n\nSometime a task can end up pending a long time, because some bugs occurs, but a retry can eventually succeed immediately: \nprobably we sent a request on some third-party, we get load-balanced to a server that do not respond anymore, but issuing\na new request may end up to a server that still works well.\n\nThis is exactly what can achieve a mix of `.timeout()` and `.retry()`: when the *timeout* is reached for a job,\nit triggers its callback with a failed status (`new Error( 'Timeout' )`), then *retry* kick in and the job start over,\nit may hit the time limit again and be restarted again, until it succeeds or the retry countdown abort the whole process.\n\nAlso there are **IMPORTANT** drawback we need to be aware of:\n* when a timeout occurs, the job is **\\*NOT\\*** interupted in any way (see [`.timeout()`](#ref.async.Plan.timeout) for details)\n* so when successive retries kick in, the same job can run multiple times: our job's code should support that without\n  messing our database for example\n* also if a job timeout and is retried, the first try *may* finally succeed before the second try complete: our job's\n  code should support that case too\n\nAs a rule of thumb, if we plan to mix `.timeout()` and `.retry()`, we must isolate as much as possible critical code,\ncreating more jobs that perform small task is better.\n\nFor example, this is a **\\*VERY\\* bad** practice:\n```js\nasync.do( [\n\tqueryMultipleExternalServicesAndThenUpdateOurLocalDatabaseAccordingly\n] )\n.timeout( 100 )\n.retry( 100 , 100 , 2 , 60000 )\n.exec( function( error , results ) {\n\tconsole.log( 'Done!' ) ;\n} ) ;\n```\n\nWe have to consider rewriting it this way:\n```js\nasync.parallel( [\n\tqueryExternalService1 ,\n\tqueryExternalService2 ,\n\tqueryExternalService3\n] )\n.timeout( 100 )\n.retry( 100 , 100 , 2 , 60000 )\n.exec( function( error , results ) {\n\tif ( ! error ) {\n\t\tupdateOurLocalDatabaseAccordingly( results ) ;\n\t}\n} ) ;\n```\n\nIn the last snippet, we have isolated jobs that can timeout due to things that are out of our control.\nIf one query failed, we don't have to restart from scratch, re-doing queries that have already succeeded.\nFinally, moving `updateOurLocalDatabaseAccordingly()` into the [*finallyCallback*](#ref.callback.finallyCallback)\nof `.exec()` allows us to use the parallel mode, so the whole process perform faster.\nIf we had chosen to put this function into a job, we would have been constrained to use an `async.series()` factory.\nMore important: we are sure that the code that update our database will run once.\n\n\n\n<a name=\"ref.async.Plan.lastJobOnly\"></a>\n### .lastJobOnly( [returnLastJobOnly] )\n\n* returnLastJobOnly `boolean`, if omited: `true`\n\nIf set to `true`, only the last job pass its result to [*finallyCallback*](#ref.callback.finallyCallback),\n[*thenCallback*](#ref.callback.thenCallback) etc...\n\nWithout `.lastJobOnly()` (the default in most factories):\n```js\nasync.series( [\n\tfunction( callback ) { callback( null , 'my' ) ; } ,\n\tfunction( callback ) { callback( null , 'wonderful' ) ; } ,\n\tfunction( callback ) { callback( null , 'result' ) ; }\n] )\n.exec( function( error , result ) {\n\t// result equals `[ [ null , 'my' ], [ null , 'wonderful' ], [ null , 'result' ] ]`\n} ) ;\n```\n\nWith `.lastJobOnly()` (default in `async.waterfall()` and `async.race()` factories):\n```js\nasync.series( [\n\tfunction( callback ) { callback( null , 'my' ) ; } ,\n\tfunction( callback ) { callback( null , 'wonderful' ) ; } ,\n\tfunction( callback ) { callback( null , 'result' ) ; }\n] )\n.lastJobOnly()\n.exec( function( error , result ) {\n\t// result equals `'result'`\n} ) ;\n```\n\n**BE CAREFUL:** when using `.lastJobOnly()` in parallel mode, this is the job that finish last which transmits its results.\nThis is **\\*NOT\\* necessarly** the last job in the job's list.\nNote that `.lastJobOnly()` is used in `async.race()` factory, but here the whole process abort when the first job finish\nwithout error, so the first job and the last job are the same.\n\n\n\n<a name=\"ref.async.Plan.mapping1to1\"></a>\n### .mapping1to1( [returnMapping1to1] )\n\n* returnMapping1to1 `Boolean`, if omited: `true`\n\nIf set to `true`, the *results* directly map the *jobsList*.\nIt is used (and locked) in `async.map()` factory.\n\nIf set to `false`, the *results* contains for each entry, the whole argument's list\npassed by the job's callback.\n\nWithout `.mapping1to1()` (the default in most factories):\n```js\nasync.parallel( [\n\tfunction( callback ) { callback( null , 'my' ) ; } ,\n\tfunction( callback ) { callback( null , 'wonderful' ) ; } ,\n\tfunction( callback ) { callback( null , 'result' ) ; }\n] )\n.exec( function( error , results ) {\n\t// results equals `[ [ null , 'my' ], [ null , 'wonderful' ], [ null , 'result' ] ]`\n} ) ;\n```\n\nWith `.mapping1to1()` (the default in `async.map()` factory):\n```js\nasync.map( [\n\tfunction( callback ) { callback( null , 'my' ) ; } ,\n\tfunction( callback ) { callback( null , 'wonderful' ) ; } ,\n\tfunction( callback ) { callback( null , 'result' , 'extra argument that will be dropped' ) ; }\n] )\n.exec( function( error , results ) {\n\t// results equals `[ 'my' , 'wonderful' , 'result' ]`\n} ) ;\n```\n\n**Note:** when using `.mapping1to1()`, any extra arguments passed to the job's callback are ignored.\n\n\n\n<a name=\"ref.async.Plan.using\"></a>\n### .using( various )\n\n* various `Function`, `Array` or `Object`\n\nArgument passed to `.using()` is used in combination with the job's list.\nBehaviours all depend on the type of the arguments.\n\nIn the following `.using()` variation, `async.do()` can be replaced by any `async.Plan`'s factory.\n\n#### async.do( jobsData ).using( workerFunction )\n\n* jobsData `Array` (or `Object`) of `Array`\n* workerFunction `Function`\n\nWhen combining `.do()` and `.using()` this way, each job contains an array of arguments to pass to *workerFunction*.\n\nExample:\n\n```js\nasync.do( [\n\t[ 'http://example.com/' , 500 ] ,\n\t[ 'http://example.com/forum/' , 800 ] ,\n\t[ 'http://example.com/blog/' , 200 ]\n] )\n.using( function( url , timeout ) {\n\t// Async check of url, with some timeout\n} )\n.exec( function( error , results ) {\n\tif ( ! error )  { console.log( \"Success!\" ) ; }\n} ) ;\n```\n\nAlso, if your *workerFunction* only accepts one argument, you can avoid *Array of Array* construct:\n\n```js\nasync.do( [\n\t'http://example.com/' ,\n\t'http://example.com/forum/' ,\n\t'http://example.com/blog/'\n] )\n.using( function( url ) {\n\t// Async check of url\n} )\n.exec( function( error , results ) {\n\tif ( ! error )  { console.log( \"Success!\" ) ; }\n} ) ;\n```\n\n#### async.do( jobsList ).using( args )\n\n* jobsList `Array` (or `Object`) of `Function`\n* args `Array`\n\nThis is the opposite.\nHere we have a list of different function, but they take the same arguments.\n\n\nExample:\n```js\nasync.do( [\n\tdnsResolve ,\n\tping ,\n\thttpGet\n] )\n.using( 'http://example.com/' )\n.exec( function( error , results ) {\n\tif ( ! error )  { console.log( \"Success!\" ) ; }\n} ) ;\n```\n\nIn the previous snippet, `.using()` provide the data, and `.do()` provide the actions, where *dnsResolve*, *ping*\nand *httpGet* are three functions that take an URL as their first arguments. The *dnsResolve* function will convert\nthe URL into an IP addresse, then *ping* will er... ping this IP, and finally *httpGet* will forge an HTTP request\nand get the page content.\n\n\n\n<a name=\"ref.async.Plan.iterator\"></a>\n### .iterator( iteratorFunction )\n\n* iteratorFunction `Function( element , [key] , [container] , callback )` where:\n\t* element `mixed` the current array element or object's property value\n\t* key `Number` or `String` the current key (index for array, property name for object)\n\t* container `Array` or `Object`, this is the original container\n\t* callback `Function( error , [arg1] , [arg2] , ... )` a node-style callback to trigger on completion\n\nWith `.iterator( iteratorFunction )` our jobs become data for *iteratorFunction*. \nThis is close to the behaviour of `.using( workerFunction )`, except that an iterator function is not called the same way.\n\nRather than processing each element of the `Array` as an array of arguments, here the whole element is passed as the\nfirst argument of the iterator.\n\nIn fact, `async.do( container ).iterator( iteratorFunction )` is equal to `async.foreach( container , iteratorFunction )`.\n\nSee [async.foreach()](#ref.async.foreach) for details.\n\n\n\n<a name=\"ref.async.Plan.aggregator\"></a>\n### .aggregator( transmitAggregate , returnAggregate , defaultAggregate )\n\n* transmitAggregate `Boolean`, if omited: `true`\n* returnAggregate `Boolean`, if omited: `true`\n* defaultAggregate `mixed`, this is the default value\n\nThis set or unset the current `async.Plan` as an aggregator.\n\nNote that `async.do( container ).iterator( iterator ).aggregator( true , true , initialAggregatedValue )`\nis equal to `async.reduce( initialAggregatedValue , container , iterator )`.\nFor more details, see [async.reduce()](#ref.async.reduce).\n\nIf *transmitAggregate* is set, then the *iterator* (or job's function) receive the current *aggregatedValue*\nas its first argument, all other arguments being shifted to the right.\n\nIf *returnAggregate* is set, then the *results* passed to callback (*then*, *catch* and *finally* callback)\nonly contains the *aggregatedValue*.\n\nIf *defaultAggregate* is set, this is what will be used as the starting value for *aggregatedValue*.\n\n\n\n<a name=\"ref.async.Plan.nice\"></a>\n### .nice( niceness )\n\n* niceness `Number`, any number is ok but recommended values are between *-20* and *+20*\n\nThis try to mimic the unix command `nice` and `renice`.\nThis set up how the job's scheduler behaves.\n\nIt depends on the *niceness* value:\n* *<=-2* is for synchronous scheduling: the scheduler process as fast as possible, if jobs provided by user are synchronous,\n  everything will be synchronous and will be executed in one code flow for at most *N* recursion, where *N=1* for *nice=-2*,\n  *N=2* for *nice=-3*, *N=3* for *nice=-4*, and so on... When the maximum recursion counter is reached, the next job will\n  use `setImmediate()` internally. This prevent from the *Maximum call stack size exceeded* error when callbacks are synchronous,\n  and give some breath for I/O when dealing with CPU-bound tasks. As long as things are synchronous, there will be no\n  difference between `async.series()` or `async.parallel()`. \n* *-1* is for asynchronous scheduling, it uses `setImmediate()` internally. This scheduling allows I/O to be performed\n  (see [setImmediate()](http://nodejs.org/api/timers.html#timers_setimmediate_callback_arg) for details).\n* *>=0* is for asynchronous scheduling, it uses `setTimeout()` internally. This scheduling allows I/O to be performed\n  and much more. The *niceness* value is used as the delay for `setTimeout()`, so using `.nice(10)`\n  means that the scheduler will delay further action for 10ms\n  (see [setTimeout()](http://nodejs.org/api/timers.html#timers_settimeout_callback_delay_arg) for details).\n\nSee [NextGen Event nice feature](https://www.npmjs.com/package/nextgen-events#ref.note.nice) for references.\n\nBy default, if `.nice()` is not called, the nice value is -20 (i.e. synchronous for at most 19 recursions).\n\nFull synchronous scheduling may cause *Maximum call stack size exceeded* issues if loop, `.retry()` or just an huge job's\nlist is involved, because everything use nested callback the way we would have done it, those nested callback are just\nabstracted away by the lib, but still remains behind the scene.\nThat's why **starting at v0.6.0**, there isn't full synchronous scheduling anymore: once in a while, an asynchronous call\nwill be triggered. Do not drop the nice value below -20, which provide at most 19 recursions.\n\nAsynchronous scheduling uses the javascript's *event loop*, so there is no more infinite nested callback possible.\nIt can scale better for big job's list, loop and `.retry()`...\n\nIf we have a big synchronous task to do, we can divide it into many jobs, then use for example:\n```js\nasync.series( jobsList ).nice( 0 ).exec() ;\n```\n... to *asyncify* it a bit. This can be very important for services: our application must keep accepting\nnew request during the big task processing. Also if the task is really that big, it is usually a good practice \nto spawn a process or create a new specific service for this particular task anyway.\n\n\n\n<a name=\"ref.async.Plan.then\"></a>\n### .then( thenCallback )\n\n* [thenCallback](#ref.callback.thenCallback) `Function( results )`\n\t* results `mixed`, depends on options\n\nThis set up a *then* callback part of the `async.Plan` itself.\nSee [thenCallback](#ref.callback.thenCallback) for details.\n\n\n\n<a name=\"ref.async.Plan.else\"></a>\n### .else( elseCallback )\n\n* [elseCallback](#ref.callback.elseCallback) `Function( results )`\n\t* results `mixed`, depends on options\n\nThis set up an *else* callback part of the `async.Plan` itself.\nSee [elseCallback](#ref.callback.elseCallback) for details.\n\nThis has no effect for *Do* family `async.Plan`.\n\n\n\n<a name=\"ref.async.Plan.catch\"></a>\n### .catch( catchCallback )\n\n* [catchCallback](#ref.callback.catchCallback) `Function( error , results )`\n\t* error `mixed`, depends on jobs' code\n\t* results `mixed`, depends on options\n\nThis set up a *catch* callback part of the `async.Plan` itself.\nSee [catchCallback](#ref.callback.catchCallback) for details.\n\n\n\n<a name=\"ref.async.Plan.finally\"></a>\n### .finally( finallyCallback )\n\n* [finallyCallback](#ref.callback.finallyCallback) `Function( error , results )`\n\t* error `mixed`, depends on jobs' code\n\t* results `mixed`, depends on options\n\nThis set up a *finally* callback part of the `async.Plan` itself.\nSee [finallyCallback](#ref.callback.finallyCallback) for details.\n\n\n\n<a name=\"ref.async.Plan.clone\"></a>\n### .clone()\n\nThis method is used to clone an `async.Plan` and return it.\n\nThe cloned `async.Plan` is **unlocked**: we can use its modifier methods even if the original `async.Plan` is locked\nor is currently under execution.\n\n\n\n<a name=\"ref.async.Plan.export\"></a>\n### .export( [execMethod] )\n\n* execMethod `String`, one of *'exec'*, *'execKV'*, *'execFinally'*, *'execThenCatch'*, *'execThenElse'*, *'execThenElseCatch'*\n  and *'execArgs'*... if omited: 'exec'\n\nThis export and return an `async.Plan` as a function.\n\nBy default, the exported function behaves exactly like the `.exec()` method of the `async.Plan`.\nIf we want to export a different `.exec()`-like method, we can provide the method's name as the argument of `.export()`.\n\nSince the `async.Plan` is internally cloned, changes made on the original `async.Plan` do **not** change how the exported function behaves.\n\n\n\n<a name=\"ref.async.Plan.exec\"></a>\n### .exec( ... )\n\nThis method execute the `async.Plan`.\n\nUntil an exec-like method is called, nothing happens at all, previous methods mostly configure the `async.Plan`.\n\nArguments passed to `.exec()` depend on factories by default, and can be modified by [`.execMapping()`](#ref.async.Plan.execMapping).\n\nHowever, most factories use this scheme:\n\n`.exec( [arg1] , [arg2] , ... , [finallyCallback](#ref.callback.finallyCallback) )`.\n\n* arg1, arg2, ... `mixed` : arguments to pass to all the jobs (or to the first job only in *waterfall* mode)\n* [finallyCallback](#ref.callback.finallyCallback) `Function( error , results )`\n\t* error `mixed`, depends on jobs' code\n\t* results `mixed`, depends on options\n\nFollowing `.exec()`-like methods have a static scheme, and are not modified by [`.execMapping()`](#ref.async.Plan.execMapping).\n\n\n\n<a name=\"ref.async.Plan.execFinally\"></a>\n### .execFinally( finallyCallback )\n\n* [finallyCallback](#ref.callback.finallyCallback) `Function( error , results )`\n\t* error `mixed`, depends on jobs' code\n\t* results `mixed`, depends on options\n\nThis method execute the `async.Plan`, just like [`.exec()`](#ref.async.Plan.exec).\nIt only accepts one argument: the [finallyCallback](#ref.callback.finallyCallback).\n\n\n\n<a name=\"ref.async.Plan.execThenCatch\"></a>\n### .execThenCatch( thenCallback , catchCallback , [finallyCallback] )\n\n* [thenCallback](#ref.callback.thenCallback) `Function( results )`\n\t* results `mixed`, depends on options\n* [catchCallback](#ref.callback.catchCallback) `Function( error , results )`\n\t* error `mixed`, depends on jobs' code\n\t* results `mixed`, depends on options\n* [finallyCallback](#ref.callback.finallyCallback) `Function( error , results )`\n\t* error `mixed`, depends on jobs' code\n\t* results `mixed`, depends on options\n\nThis method execute the `async.Plan`, just like [`.exec()`](#ref.async.Plan.exec).\nLike the name suggests, the first argument should be the [thenCallback](#ref.callback.thenCallback), and\n[catchCallback](#ref.callback.catchCallback) as the second.\n\nHowever, the [finallyCallback](#ref.callback.finallyCallback) can still be passed as the third argument.\n\n\n\n<a name=\"ref.async.Plan.execThenElse\"></a>\n### .execThenElse( thenCallback , elseCallback , [finallyCallback] )\n\n* [thenCallback](#ref.callback.thenCallback) `Function( results )`\n\t* results `mixed`, depends on options\n* [elseCallback](#ref.callback.elseCallback) `Function( results )`\n\t* results `mixed`, depends on options\n* [finallyCallback](#ref.callback.finallyCallback) `Function( error , results )`\n\t* error `mixed`, depends on jobs' code\n\t* results `mixed`, depends on options\n\nThis method execute the `async.Plan`, just like [`.exec()`](#ref.async.Plan.exec).\nLike the name suggests, the first argument should be the [thenCallback](#ref.callback.thenCallback), and\n[elseCallback](#ref.callback.elseCallback) as the second.\n\nHowever, the [finallyCallback](#ref.callback.finallyCallback) can still be passed as the third argument.\n\n\n\n<a name=\"ref.async.Plan.execThenElseCatch\"></a>\n### .execThenCatch( thenCallback , elseCallback , catchCallback , [finallyCallback] )\n\n* [thenCallback](#ref.callback.thenCallback) `Function( results )`\n\t* results `mixed`, depends on options\n* [elseCallback](#ref.callback.elseCallback) `Function( results )`\n\t* results `mixed`, depends on options\n* [catchCallback](#ref.callback.catchCallback) `Function( error , results )`\n\t* error `mixed`, depends on jobs' code\n\t* results `mixed`, depends on options\n* [finallyCallback](#ref.callback.finallyCallback) `Function( error , results )`\n\t* error `mixed`, depends on jobs' code\n\t* results `mixed`, depends on options\n\nThis method execute the `async.Plan`, just like [`.exec()`](#ref.async.Plan.exec).\nLike the name suggests, the first argument should be the [thenCallback](#ref.callback.thenCallback),\n[elseCallback](#ref.callback.elseCallback) as the second, and [catchCallback](#ref.callback.catchCallback) as the third.\n\nHowever, the [finallyCallback](#ref.callback.finallyCallback) can still be passed as the fourth argument.\n\n\n\n<a name=\"ref.async.Plan.execArgs\"></a>\n### .execArgs( [arg1] , [arg2] , ... )\n\n* arg1, arg2, ... `mixed`\n\nThis method execute the `async.Plan`, just like [`.exec()`](#ref.async.Plan.exec).\nAll arguments passed to this method are passed to all the jobs (except in *waterfall* mode, where they are passed only to the first job).\n\n\n\n<a name=\"ref.async.Plan.execMapping\"></a>\n### .execMapping( config )\n\n* config `Object`\n\t* .aggregateArg `Boolean`, if omited: `false`\n\t* .minInputs `Number` (integer), if omited: 0\n\t* .maxInputs `Number` (integer), if omited: 0\n\t* .inputsName `Array` of `String` describing each input (only used for function signature), if omited: `[]`\n\t* .callbacks `Array` of `String` (can only be: 'then', 'else', 'catch' and 'finally'), if omited: `[]`\n\nThis method is used to configure [`.exec()`](#ref.async.Plan.exec)'s behaviour.\n\nIf `config.aggregateArg` is `true`, the first argument of `.exec()` is the aggregate's value.\n\nIf `config.maxInputs` is greater than 0, the next arguments of `.exec()` **\\*MAY\\*** be inputs for jobs (arguments passed to them).\nIf `config.minInputs` is greater than 0, the next arguments of `.exec()` **\\*MUST\\*** be inputs for jobs.\nIn fact, `.exec()` supports variable number of arguments.\n\nNote that in *waterfall* mode, inputs arguments are only passed to the first job.\n\nFinally, if `config.callbacks` is not an empty array, the last arguments are callback, strictly in the order defined.\n\n`.exec()` supports variable number of arguments:\n\n* if `config.minInputs` and `config.maxInputs` are equals, the number of inputs arguments are fixed,\n  so the number of callback is variable: some callback could be omited\n\n* if `config.minInputs` and `config.maxInputs` are **\\*NOT\\*** equals, the number of inputs arguments are variable,\n  so the number of callback is fixed (if it wasn't, we couldn't have a clue weither an argument is an input or a callback)\n\n\nExample using the `async.Plan` property `.execMappingSignature` to get the **signature** of `.exec()`, here with variable number of inputs:\n```js\nvar plan = async.do( [\n\t// Some jobs\n] )\n.execMapping( {\n\tcallbacks: [ 'then' , 'catch' ] ,\n\tminInputs: 0 ,\n\tmaxInputs: 2 ,\n\tinputsName: [ 'firstArg' , 'secondArg' ]\n} ) ;\n\nconsole.log( plan.execMappingSignature ) ;\n// produce: ( [firstArg], [secondArg], thenCallback, catchCallback )\n```\n\n\nExample with fixed number of inputs:\n```js\nvar plan = async.do( [\n\t// Some jobs\n] )\n.execMapping( {\n\tcallbacks: [ 'then' , 'catch' ] ,\n\tminInputs: 2 ,\n\tmaxInputs: 2 ,\n\tinputsName: [ 'firstArg' , 'secondArg' ]\n} ) ;\n\nconsole.log( plan.execMappingSignature ) ;\n// produce: ( firstArg, secondArg, [thenCallback], [catchCallback] )\n```\n\n\nExample with `config.aggregateArg` set to `true`:\n```js\nvar plan = async.do( [\n\t// Some jobs\n] )\n.execMapping( {\n\taggregateArg: true ,\n\tcallbacks: [ 'then' , 'catch' ] ,\n\tminInputs: 2 ,\n\tmaxInputs: 2 ,\n\tinputsName: [ 'firstArg' , 'secondArg' ]\n} ) ;\n\nconsole.log( plan.execMappingSignature ) ;\n// produce: ( aggregateValue, firstArg, secondArg, [thenCallback], [catchCallback] )\n```\n\n\n\n<a name=\"ref.async.Plan.execKV\"></a>\n### .execKV( KeyValuePairs )\n\n* KeyValuePairs `Object`\n\t* .inputs `Array` input arguments for jobs, if omited: `[]`\n\t* .aggegate `mixed` optionnal aggregate initial value\n\t* .then `Function` optionnal [thenCallback](#ref.callback.thenCallback)\n\t* .else `Function` optionnal [elseCallback](#ref.callback.elseCallback)\n\t* .catch `Function` optionnal [catchCallback](#ref.callback.catchCallback)\n\t* .finally `Function` optionnal [finallyCallback](#ref.callback.finallyCallback)\n\nThis method execute the `async.Plan`, just like [`.exec()`](#ref.async.Plan.exec).\nRather than passing arguments in a predefined order, `.execKV()` accepts an object of key-value pairs.\nThis is an alternative to `.execMapping()` & `.exec()`.\n\nPro:\n* it improves greatly the readability\n* more straightforward, no need to remember the signature of `.exec()`\n\nCons:\n* With `.execMapping()`, `.exec()` can raise error if misused, for example it constraints a number of input's arguments\n\n\n\n<a name=\"ref.callbacks\"></a>\n## Callbacks\n\nThose callbacks are triggered (if conditions are met) when the `async.Plan` is resolved.\nNote that if we don't use [`.timeout()`](#ref.async.Plan.timeout) and a job is pending forever, the `async.Plan` will never being resolved,\nthus no callback will be ever triggered.\n\nThere are two stages of callback.\n\n* The first stage are callbacks defined in the `async.Plan` itself. Those callback are **\\*ALWAYS\\*** triggered before the second stage.\n\n* The second stage are callbacks of the `.exec()`-like methods.\n\n\n\n<a name=\"ref.callback.thenCallback\"></a>\n### thenCallback\n\n* thenCallback `Function( results )`\n\t* results `mixed`, depends on options\n\nFor *Do* family, this callback is triggered if the `async.Plan`'s execution succeed. The *success* depends on factory and options used.\nUsually, an `async.Plan` succeed if no error happened. But jobs on error can be retried if [`.retry()`](#ref.async.Plan.retry) is used, and finally succeed,\n[`async.race`](#ref.async.race) succeed as long as one job succeed, and so on.\n\nFurthermore, for *Conditional* family, the final result should be `true` or *truthy* for this callback to be triggered.\n\nThe *results* argument's format passed to this callback depends on many factor.\nSee related factories and modifier.\n\n\n\n<a name=\"ref.callback.elseCallback\"></a>\n### elseCallback\n\n* elseCallback `Function( results )`\n\t* results `mixed`, depends on options\n\nIt never triggers for *Do* family `async.Plan`.\n\nFor *Conditional* family, it will trigger if the final result is `false` or *falsy*.\nHowever, if **no** [*catchCallback*](#ref.callback.catchCallback) exists for this stage (see [callbacks introduction](#ref.callbacks) for what a callback stage is),\n**it will trigger if the final outcome is an error too**.\n\n\n\n<a name=\"ref.callback.catchCallback\"></a>\n### catchCallback\n\n* catchCallback `Function( error , results )`\n\t* error `mixed`, depends on jobs' code\n\t* results `mixed`, depends on options\n\nThis callback is triggered when the final outcome is an error.\n\n\n\n<a name=\"ref.callback.finallyCallback\"></a>\n### finallyCallback\n\n* finallyCallback `Function( error , results )`\n\t* error `mixed`, depends on jobs' code\n\t* results `mixed`, depends on options\n\nThis callback is **\\*ALWAYS\\*** triggered.\nThis is the **last** callback of a stage to be triggered.\n\n\n\n<a name=\"ref.callback.whileCallback\"></a>\n### whileCallback\n\n* whileCallback `Function( error , results , logicCallback )`, where:\n\t* error `mixed` any truthy means error\n\t* results `Array` or `Object` that maps the *jobsList*\n\t* logicCallback `Function( [error] , loopAgain )` where:\n\t\t* error `mixed` any truthy means error\n\t\t* loopAgain `Boolean` anything else is considered either *truthy* or *falsy*\n\nThis callback is used for while loop.\n\nThe last iteration's *error* and *results* are passed to this function. \n\nThen the internal *logicCallback* function can be triggered, if a *truthy* value is passed as the *loopAgain* argument,\na new loop iteration will be performed, if a *falsy* value is passed, no new loop iteration will take place:\ncompletion callback (*thenCallback*, *elseCallback*, *catchCallback*, *finallyCallback*) will be triggered\ndepending on the current (last) iteration's outcome.\n\n\n\n<a name=\"ref.async.ExecContext\"></a>\n## Class async.ExecContext\n\nAn instance of `async.ExecContext` is returned by each `exec()`-like methods.\nWe can use this object to listen to some useful event.\n\n\n\n<a name=\"ref.async.ExecContext.getJobsStatus\"></a>\n### .getJobsStatus()\n\nThis method provide insightful real-time information about the status of each jobs.\nThis is designed for flow-control debugging/logging purpose, other uses are discouraged.\n\nIt returns an `Object` or an `Array` that map the jobs' list.\nFor each job, an object is given where:\n\n* job `mixed` the original job, e.g. `Function`, `Array`, `async.Plan`, etc...\n* status `string` the current status of the job, one of the following: \n\t* 'waiting': the job has not started yet, it is queued\n\t* 'pending': the job","_attachments":{},"homepage":"https://github.com/cronvel/async-kit#readme","bugs":{"url":"https://github.com/cronvel/async-kit/issues"},"license":"MIT"}