{"_id":"stepup","_rev":"33-3e14846f99dc92b2519e8c41485f367c","name":"stepup","description":"A simple control-flow library for Node that makes parallel execution, serial execution, and error handling painless.","dist-tags":{"latest":"1.1.2"},"versions":{"0.0.6":{"name":"stepup","version":"0.0.6","description":"A simple control-flow library for node.JS that makes parallel execution, serial execution, and error handling painless.","engine":["node >=0.1.90"],"author":{"name":"Adam Crabtree","email":"dude@noderiety.com"},"repository":{"type":"git","url":"git://github.com/creationix/stepup.git"},"main":"lib/stepup","dependencies":{},"devDependencies":{},"_id":"stepup@0.0.6","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rcFINAL","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"25a2c53c59652ecb5cc8604e8bf541cfbcb12c6a","tarball":"https://registry.npmjs.org/stepup/-/stepup-0.0.6.tgz","integrity":"sha512-u4HSf/SbzDlIjbC5y4e6ZEMJ9L23fySh3YdXnApNrvkjiSBSJQo2bNa9OZSheNuGF9pHRrmCwxj6t1fCT34WOg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC+1AYy29uMIWHTK2OgZAmhfy4704pPGc8gtkrujKnTKwIgN/UKOaBwXBAsoK8DQCHvQ6ABjfyV1trwYTFuor0bBgE="}]},"scripts":{},"maintainers":[{"name":"crabdude","email":"dude@noderiety.com"}],"directories":{}},"0.0.7":{"name":"stepup","version":"0.0.7","description":"A simple control-flow library for node.JS that makes parallel execution, serial execution, and error handling painless.","engine":["node >=0.1.90"],"author":{"name":"Adam Crabtree","email":"dude@noderiety.com"},"repository":{"type":"git","url":"git://github.com/creationix/stepup.git"},"main":"lib/stepup","dependencies":{},"devDependencies":{},"_id":"stepup@0.0.7","engines":{"node":"*"},"_engineSupported":true,"_npmVersion":"1.0.1rcFINAL","_nodeVersion":"v0.4.5","_defaultsLoaded":true,"dist":{"shasum":"998e1c5cb291927d5c9a7f3b6ff0062c6e8b7635","tarball":"https://registry.npmjs.org/stepup/-/stepup-0.0.7.tgz","integrity":"sha512-GWRrZPVaUEkDnqX3inE2MFW138tW0J2eFlx+kUjmAf+QOdMQxPdi2JHoLa2nkXr95dqXKv1JYrizBNbof8/B3A==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBg0REY77+yeK0NagkEbandIq5xR9wpiKTKk61EA/tBwAiB3q4pjOFuMlnn5r5OKEWBYKGFzIn+nnJCeCC0JlCsi/Q=="}]},"scripts":{},"maintainers":[{"name":"crabdude","email":"dude@noderiety.com"}],"directories":{}},"0.0.9":{"name":"stepup","version":"0.0.9","description":"A simple control-flow library for node.JS that makes parallel execution, serial execution, and error handling painless.","homepage":"http://github.com/CrabDude/stepup","repository":{"type":"git","url":"git://github.com/CrabDude/stepup.git"},"bugs":{"url":"http://github.com/CrabDude/stepup/issues"},"author":{"name":"Adam Crabtree","email":"dude@noderiety.com"},"main":"lib/stepup","engines":{"node":">=0.2.0"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.html"}],"dependencies":{"trycatch":">=0.0.8 <0.1"},"keywords":["error","exception","control","flow","async","series"],"_npmUser":{"name":"crabdude","email":"dude@noderiety.com"},"_id":"stepup@0.0.9","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.5.8","_defaultsLoaded":true,"dist":{"shasum":"106bff5825418cb4f69dbe542663524ee7e3f407","tarball":"https://registry.npmjs.org/stepup/-/stepup-0.0.9.tgz","integrity":"sha512-j35sByROXhfXm5Ci692b/8VWVHR8tskjjs44dKPvTFm0CUFcMJ+lsQKvEmRZudMLmz571EMu/EQpimPeI2nGsQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFdXE98dXCLCeTKjUV8K2k7YaGHgX7tB/UM1Q4c+MrS3AiEAjuOBjdSA4dmlgD2Qy6amcjOuxac0lFlow0sMe7C13lc="}]},"maintainers":[{"name":"crabdude","email":"dude@noderiety.com"}],"directories":{}},"0.0.11":{"name":"stepup","version":"0.0.11","description":"A simple control-flow library for node.JS that makes parallel execution, serial execution, and error handling painless.","homepage":"http://github.com/CrabDude/stepup","repository":{"type":"git","url":"git://github.com/CrabDude/stepup.git"},"bugs":{"url":"http://github.com/CrabDude/stepup/issues"},"author":{"name":"Adam Crabtree","email":"dude@noderiety.com"},"main":"lib/stepup","engines":{"node":">=0.2.0"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.html"}],"dependencies":{"trycatch":">=0.0.8 <0.1"},"keywords":["error","exception","control","flow","async","series"],"_npmUser":{"name":"crabdude","email":"dude@noderiety.com"},"_id":"stepup@0.0.11","devDependencies":{},"_engineSupported":true,"_npmVersion":"1.0.94","_nodeVersion":"v0.4.12","_defaultsLoaded":true,"dist":{"shasum":"a4792db7c245722bced95f383e42d2f3a298d06d","tarball":"https://registry.npmjs.org/stepup/-/stepup-0.0.11.tgz","integrity":"sha512-mCmB772AkYCtFHX8xcVyEGk8ZAAv/XsLafr2ouPbLcRJem6nwzIoFAwhGUsc4asTX5PHIdjmMgxdcMBnUXjBdQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCdS25Q4q7yEEIT94dxGq77J8qCWcFQJXeTkSqdKx+l8QIhAJecaaXGG4LmtX8NldbvYz1ExhZioXFrT5dKBWmQP7rE"}]},"maintainers":[{"name":"crabdude","email":"dude@noderiety.com"}],"directories":{}},"0.0.12":{"name":"stepup","version":"0.0.12","description":"A simple control-flow library for node.JS that makes parallel execution, serial execution, and error handling painless.","homepage":"http://github.com/CrabDude/stepup","repository":{"type":"git","url":"git://github.com/CrabDude/stepup.git"},"bugs":{"url":"http://github.com/CrabDude/stepup/issues"},"author":{"name":"Adam Crabtree","email":"dude@noderiety.com"},"main":"lib/stepup","engines":{"node":">=0.2.0"},"licenses":[{"type":"MIT","url":"http://www.opensource.org/licenses/mit-license.html"}],"dependencies":{"trycatch":"0.1.x"},"keywords":["error","exception","control","flow","async","series"],"readme":"# Stepup\n\nA simple control-flow library for node.JS that makes parallel execution, serial execution, and error handling painless.\n\nAdditionally, stepup provides error coalescing, [asynchronous try catch](http://github.com/Crabdude/trycatch), and long stack traces.\n\n## How to install\n\n\tnpm install stepup\n\t\nOr, simply copy or link the lib/stepup.js file into your `$HOME/.node_libraries` folder.\n\n## How to use\n\nThe stepup library exports a single function I call `step`.\tIt accepts any number of functions as arguments and runs them in serial order using the passed in `this` context as the callback to the next step.\n\n\tstep(\n\t\tfunction readSelf() {\n\t\t\tfs.readFile(__filename, this);\n\t\t},\n\t\tfunction capitalize(err, text) {\n\t\t\tif (err) throw err;\n\t\t\treturn text.toUpperCase();\n\t\t},\n\t\tfunction showIt(err, newText) {\n\t\t\tif (err) throw err;\n\t\t\tconsole.log(newText);\n\t\t}\n\t);\n\nNotice that we pass in `this` as the callback to `fs.readFile`.\tWhen the file read completes, Stepup will send the result as the arguments to the next function in the chain.\tThen in the `capitalize` function we're doing synchronous work so we can simple return the new value and Stepup will route it as if we called the callback.\n\nThe first parameter is reserved for errors since this is the node standard.\tAlso any exceptions thrown are caught and passed as the first argument to the next function.\tAs long as you don't nest callback functions inline your main functions this prevents there from ever being any uncaught exceptions.\tThis is very important for long running node.JS servers since a single uncaught exception can bring the whole server down.\n\nAlso there is support for parallel actions:\n\n\tstep(\n\t\t// Loads two files in parallel\n\t\tfunction loadStuff() {\n\t\t\tfs.readFile(__filename, this.parallel());\n\t\t\tfs.readFile(\"/etc/passwd\", this.parallel());\n\t\t},\n\t\t// Show the result when done\n\t\tfunction showStuff(err, code, users) {\n\t\t\tif (err) throw err;\n\t\t\tconsole.log(code);\n\t\t\tconsole.log(users);\n\t\t}\n\t)\n\nHere we pass `this.parallel()` instead of `this` as the callback.\tIt internally keeps track of the number of callbacks issued and preserves their order then giving the result to the next step after all have finished.\tIf there is an error in any of the parallel actions, it will be passed as the first argument to the next step.\n\nAlso you can use group with a dynamic number of common tasks.\n\n\tstep(\n\t\tfunction readDir() {\n\t\t\tfs.readdir(__dirname, this);\n\t\t},\n\t\tfunction readFiles(err, results) {\n\t\t\tif (err) throw err;\n\t\t\t// Create a new group\n\t\t\tvar group = this.group();\n\t\t\tresults.forEach(function (filename) {\n\t\t\t\tif (/\\.js$/.test(filename)) {\n\t\t\t\t\tfs.readFile(__dirname + \"/\" + filename, 'utf8', group());\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\tfunction showAll(err , files) {\n\t\t\tif (err) throw err;\n\t\t\tconsole.log(files);\n\t\t}\n\t);\n\n*Note* that we both call `this.group()` and `group()`.\tThe first reserves a slot in the parameters of the next step, then calling `group()` generates the individual callbacks and increments the internal counter.\n\n<a name=\"pookie\"/>\n### Error Handling\n\nStepup also supports robust asynchronous error handling and error coalescing. If the first step function contains one or more arguments, it is treated as the error handler for al steps. Any error generated by a step will coalesce up to the error handler with the option to continue by calling `next` or `this`. When an errorHandler is provided, errors will not be passed into steps as they normally would.\n\n\tstep(\n\t\tfunction errorHandler(err, next) {\n\t\t\t// log and ignore\n\t\t\tconsole.log('\\nThis is the long stack trace from an async error: \\n', err.stack);\n\t\t\tnext('some data');\n\t\t},\n\t\tfunction readSelf() {\n\t\t\tfs.readFile(__filename, this);\n\t\t},\n\t\tfunction capitalize(text) {\n\t\t\treturn (''+text).toUpperCase();\n\t\t},\n\t\tfunction showIt(newText) {\n\t\t\tconsole.log(newText);\n\t\t\tthrow new Error('fail.');\n\t\t},\n\t\tfunction afterError(data) {\n\t\t\tconsole.log('\\nThis is after errorHandler has been called: \\n', data);\n\t\t}\n\t);\n\nOutput:\n\n<img src=\"http://i.imgur.com/oIJA2.png\" border=\"1\" style=\"border: 1px black solid\"/>","_id":"stepup@0.0.12","dist":{"shasum":"b5608c121541eb93d0185bf923acebc185a73435","tarball":"https://registry.npmjs.org/stepup/-/stepup-0.0.12.tgz","integrity":"sha512-aT6wXBqPu1QHUORWE3ocvOz/3lp2D+otrKYAGLvladUCQVR/Kol3vLyi0JY17zJDX4BBGha2hmSkvsMAbZtumQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQChV+NauxuRPEy05FXsjUUoDm3CCD70DEKZxzhkKLQigAIgcoOwBgsoBPyQ9gStwl8Dh5KEm8Bu/Fcp+LLVNthNQCI="}]},"maintainers":[{"name":"crabdude","email":"dude@noderiety.com"}],"directories":{}},"0.1.0":{"name":"stepup","version":"0.1.0","description":"A simple control-flow library for Node that makes parallel execution, serial execution, and error handling painless.","homepage":"http://github.com/CrabDude/stepup","repository":{"type":"git","url":"git://github.com/CrabDude/stepup.git"},"author":{"name":"Adam Crabtree","email":"dude@noderiety.com"},"main":"lib/stepup","engines":{"node":">=0.2.0"},"dependencies":{"trycatch":">=0.1.0 <0.3.0"},"devDependencies":{"mocha":"~1.6.0","chai":"~1.3.0","survey":"~0.2.2"},"keywords":["error","exception","control","flow","async","series"],"directories":{"example":"examples","test":"test"},"scripts":{"test":"mocha --reporter spec","bench":"survey ./bench/stepup"},"license":"MIT","optionalDependencies":{"trycatch":">=0.1.0 <0.3.0"},"readme":"# stepup\n\nA simple control-flow library for node.JS that makes parallel execution, serial execution, and error handling painless.\n\n## How to install\n\n    npm install stepup\n\n## Basic Usage (Serial)\n\nstepup exports a single function:\n\n    var $$ = require('stepup')\n    $$(steps, [options], [callback])\n","readmeFilename":"README.md","_id":"stepup@0.1.0","dist":{"shasum":"56eebe69915bec90c58db5a0ba5af3716bc9a738","tarball":"https://registry.npmjs.org/stepup/-/stepup-0.1.0.tgz","integrity":"sha512-a5OIrKKQy5xJxBNMihCZSOETGNEk7zFQNECAam+Nvn+nbpO3h9KxIumryV1dn58hBALJwxayh/kWTffW8dQVQg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIARsSTdUniyE7SemZ8Zm1rLFYLR3fUXp59AC0/vXfSN7AiEA2HkZHixkul94UinOxWij6EQSWdxohGxssa+Ze/Gvo3s="}]},"_from":".","_npmVersion":"1.2.15","_npmUser":{"name":"crabdude","email":"dude@noderiety.com"},"maintainers":[{"name":"crabdude","email":"dude@noderiety.com"}]},"1.0.0":{"name":"stepup","version":"1.0.0","description":"A simple control-flow library for Node that makes parallel execution, serial execution, and error handling painless.","homepage":"http://github.com/CrabDude/stepup","repository":{"type":"git","url":"git://github.com/CrabDude/stepup.git"},"author":{"name":"Adam Crabtree","email":"dude@noderiety.com"},"main":"lib/stepup","engines":{"node":">=0.2.0"},"dependencies":{"trycatch":">=0.1.0 <0.3.0"},"devDependencies":{"mocha":"~1.6.0","chai":"~1.3.0","survey":"~0.2.2"},"keywords":["error","exception","control","flow","async","series"],"directories":{"example":"examples","test":"test"},"scripts":{"test":"mocha --reporter spec","bench":"survey ./bench/stepup"},"license":"MIT","optionalDependencies":{"trycatch":">=0.1.0 <0.3.0"},"readme":"# stepup\n\nA simple control-flow library for node.js that makes parallel execution, serial execution, and error handling painless.\n\n## Install\n\n    npm install stepup\n\n## Basic Usage\n\n_For a complete overview of functionality, [see the unit tests](https://github.com/CrabDude/stepup/blob/master/test/stepup.js)._\n\nstepup exports a single function:\n\n    var $$ = require('stepup')\n    $$(steps, [options], [callback])\n    \nWhich can be used to execute an array of functions or \"steps\"\n\n    $$([\n      function stepOne($) {\n        var valueOne = 'a synchronous value'\n        return valueOne\n      }\n    , function stepTwo($, valueOne) {\n        fs.readFile('someFile.txt', $.first())\n      }\n    , function stepThree($, someFileTxt) {\n        // ...\n      }\n    ])\n    \nThe first argument is the context object, `$`. `$` contains functions for generating callbacks. When all generated callbacks have been called, synchronously or asynchronously, the next step will be called.\n\nNote:\n\n* Any number of callbacks may be generated in a given step.\n* If no callbacks are generated (e.g., a value is returned), the next step will proceed.\n\nAdditionally, there are many types of generator functions\n    \n    $$([\n      function($) {\n        // Pass the first non-error argument\n        $.first()(null, 'firstValue')\n        \n        // Pass all arguments as an array\n        $.collapse()(null, 'collapseA', 'collapseB', 'collapseC')\n        \n        // Pass the first argument from an event (error-less) handler\n        $.event()('eventValue')\n                \n        // Don't pass any arguments\n        $.none()(null, 'noneA', 'noneB')\n        \n        // Don't pass any arguments AND ignore the error value\n        $.ignore()(new Error('Don't care.'), 'ignoreA', 'ignoreB')\n        \n        // Pass all arguments spread across multiple values\n        $.spread()(null, 'spreadA', 'spreadB')\n      }\n    , function($, firstValue, collapseValues, eventValue, spreadA, spreadB) {\n        // collapseValues === ['collapseA', 'collapseB', 'collapseC']\n        \n    \t// Errors will be passed to the callback and remaining steps will be skipped\n    \t$.first()(null, 'This value will never be seen.')\n    \t$.first()(new Error('Pass this to the callback'))\n      }\n    , function ignoredStep($) {\n        // Skipped because error was passed\n      }\n    ], function callback(err) {\n      // err.message === 'Pass this to the callback'\n    })\n    \nThe group generator is convenient for waiting on a set of async calls\n    \n    $$([\n      function($) {\n        var files = ['A.txt', 'B.txt', 'C.txt', 'D.txt']\n        // Create a group generator, type is optional and defaults to 'first'\n        // (e.g., 'first', 'collapse', 'event', 'none', etc...)\n        var group = $.group('first')\n        \n        files.forEach(function(fileName) {\n          // Generate a callback for each file in the list\n          fs.readFile(fileName, group())\n        )\n      }\n    , function($, groupValues) {\n        // ...\n      }\n    ])\n    \n## Error Handling\n\nThe first error is always passed to the callback, with all remaining results, errors, or steps ignored. If you this is undesirable, considering using `$.ignore` or wrapping a callback\n\n    $$([\n      function($) {\n        var next = $.first()\n        \n        fs.readFile(fileName, function(err, data) {\n          // Ignore the error if it exists\n          next(null, data)\n        })\n      }\n      // ...\n    ])\n    \nAdditionally, stepup uses the `trycatch` async try/catch library to catch all errors. To disable, call `$.config({useAsyncTrycatch: false})`\n\n\n## Extras\n\n### $.end    \nUseful for skipping the remaining steps and passing values to the callback\n\n    $$([\n      function($) {\n        if (cachedValue) {\n          return $.end(null, cachedValue)\n        }\n        fs.readFile('someFile.txt', $.first())\n      }\n    , function($, someFileTxt) {\n        // Skipped when cachedValue is truthy\n      }\n    ], callback)\n    \n### $.data\nIs an object useful for storing state across steps\n     \n    $$([\n      function($) {\n        $.data.foo = true\n        fs.readFile('someFile.txt', $.first())\n      }\n    , function($, someFileTxt) {\n        // $.data.foo === true\n      }\n    ], callback)\n    \n### $.run\nIs a convenience function for nesting steps\n\n    $$([\n      function($) {\n        $.run([\n          function(_$) {\n            // ...\n          }\n        , function(_$) {\n            // ...\n          }\n        ], $.first())\n        \n        fs.readFile('someFile.txt', $.first())\n      }\n    , function($, subStepResult, someFileTxt) {\n        // ...\n      }\n    ], callback)\n        \n## Options\n\n### timeout\nUse to guarantee a callback is called after a timeout period\n\n    $$([\n      function($) {\n        var next = $.first()\n\n        setTimeout(function() {\n          next()\n        }, 2000)\n      }\n    , function($) {\n        // Never called because of timeout\n      }\n    ], {timeout: 1000}, callback)","readmeFilename":"README.md","bugs":{"url":"https://github.com/CrabDude/stepup/issues"},"_id":"stepup@1.0.0","dist":{"shasum":"b99e7f956d2497cf564b39e6d8cbbcd5d7cf0800","tarball":"https://registry.npmjs.org/stepup/-/stepup-1.0.0.tgz","integrity":"sha512-XQFtX1cUz4rqShstz1NLhWBXFqZkVfjazwzTbm5ZT+Kl/wu1Oc9S31FkIOUKQFC8qPF8w+9hJCsuY1qHGsZHlg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB8N6dGWMMBHhooN2kmbGWZePqIKgXIY4A3rmH9FtQyyAiEA7AU39wxF23sFLTGtb8gOdTfKneBV2OiOhjIDXqg5IqQ="}]},"_from":".","_npmVersion":"1.3.8","_npmUser":{"name":"crabdude","email":"dude@noderiety.com"},"maintainers":[{"name":"crabdude","email":"dude@noderiety.com"}]},"1.0.1":{"name":"stepup","version":"1.0.1","description":"A simple control-flow library for Node that makes parallel execution, serial execution, and error handling painless.","homepage":"http://github.com/CrabDude/stepup","repository":{"type":"git","url":"git://github.com/CrabDude/stepup.git"},"author":{"name":"Adam Crabtree","email":"dude@noderiety.com"},"main":"lib/stepup","engines":{"node":">=0.2.0"},"dependencies":{"trycatch":">=0.1.0 <0.3.0"},"devDependencies":{"mocha":"~1.6.0","chai":"~1.3.0","survey":"~0.2.2"},"keywords":["error","exception","control","flow","async","series"],"directories":{"example":"examples","test":"test"},"scripts":{"test":"mocha --reporter spec","bench":"survey ./bench/stepup"},"license":"MIT","optionalDependencies":{"trycatch":">=0.1.0 <0.3.0"},"readme":"# stepup\n\nA simple control-flow library for node.js that makes parallel execution, serial execution, and error handling painless.\n\n## Install\n\n    npm install stepup\n\n## Basic Usage\n\n_For a complete overview of functionality, [see the unit tests](https://github.com/CrabDude/stepup/blob/master/test/stepup.js)._\n\nstepup exports a single function:\n\n    var $$ = require('stepup')\n    $$(steps, [options], [callback])\n    \nWhich can be used to execute an array of functions or \"steps\"\n\n    $$([\n      function stepOne($) {\n        var valueOne = 'a synchronous value'\n        return valueOne\n      }\n    , function stepTwo($, valueOne) {\n        fs.readFile('someFile.txt', $.first())\n      }\n    , function stepThree($, someFileTxt) {\n        // ...\n      }\n    ])\n    \nThe first argument is the context object, `$`. `$` contains functions for generating callbacks. When all generated callbacks have been called, synchronously or asynchronously, the next step will be called.\n\nNote:\n\n* Any number of callbacks may be generated in a given step.\n* If no callbacks are generated (e.g., a value is returned), the next step will proceed.\n\nAdditionally, there are many types of generator functions\n    \n    $$([\n      function($) {\n        // Pass the first non-error argument\n        $.first()(null, 'firstValue')\n        \n        // Pass all arguments as an array\n        $.collapse()(null, 'collapseA', 'collapseB', 'collapseC')\n        \n        // Pass the first argument from an event (error-less) handler\n        $.event()('eventValue')\n                \n        // Don't pass any arguments\n        $.none()(null, 'noneA', 'noneB')\n        \n        // Don't pass any arguments AND ignore the error value\n        $.ignore()(new Error('Don't care.'), 'ignoreA', 'ignoreB')\n        \n        // Pass all arguments spread across multiple values\n        $.spread()(null, 'spreadA', 'spreadB')\n      }\n    , function($, firstValue, collapseValues, eventValue, spreadA, spreadB) {\n        // collapseValues === ['collapseA', 'collapseB', 'collapseC']\n        \n    \t// Errors will be passed to the callback and remaining steps will be skipped\n    \t$.first()(null, 'This value will never be seen.')\n    \t$.first()(new Error('Pass this to the callback'))\n      }\n    , function ignoredStep($) {\n        // Skipped because error was passed\n      }\n    ], function callback(err) {\n      // err.message === 'Pass this to the callback'\n    })\n    \nThe group generator is convenient for waiting on a set of async calls\n    \n    $$([\n      function($) {\n        var files = ['A.txt', 'B.txt', 'C.txt', 'D.txt']\n        // Create a group generator, type is optional and defaults to 'first'\n        // (e.g., 'first', 'collapse', 'event', 'none', etc...)\n        var group = $.group('first')\n        \n        files.forEach(function(fileName) {\n          // Generate a callback for each file in the list\n          fs.readFile(fileName, group())\n        )\n      }\n    , function($, groupValues) {\n        // ...\n      }\n    ])\n    \n## Error Handling\n\nThe first error is always passed to the callback, with all remaining results, errors, or steps ignored. If you this is undesirable, considering using `$.ignore` or wrapping a callback\n\n    $$([\n      function($) {\n        var next = $.first()\n        \n        fs.readFile(fileName, function(err, data) {\n          // Ignore the error if it exists\n          next(null, data)\n        })\n      }\n      // ...\n    ])\n    \nAdditionally, stepup uses the `trycatch` async try/catch library to catch all errors. To disable, call `$.config({useAsyncTrycatch: false})`\n\n\n## Extras\n\n### $.end    \nUseful for skipping the remaining steps and passing values to the callback\n\n    $$([\n      function($) {\n        if (cachedValue) {\n          return $.end(null, cachedValue)\n        }\n        fs.readFile('someFile.txt', $.first())\n      }\n    , function($, someFileTxt) {\n        // Skipped when cachedValue is truthy\n      }\n    ], callback)\n    \n### $.data\nIs an object useful for storing state across steps\n     \n    $$([\n      function($) {\n        $.data.foo = true\n        fs.readFile('someFile.txt', $.first())\n      }\n    , function($, someFileTxt) {\n        // $.data.foo === true\n      }\n    ], callback)\n    \n### $.run\nIs a convenience function for nesting steps\n\n    $$([\n      function($) {\n        $.run([\n          function(_$) {\n            // ...\n          }\n        , function(_$) {\n            // ...\n          }\n        ], $.first())\n        \n        fs.readFile('someFile.txt', $.first())\n      }\n    , function($, subStepResult, someFileTxt) {\n        // ...\n      }\n    ], callback)\n        \n## Options\n\n### timeout\nUse to guarantee a callback is called after a timeout period\n\n    $$([\n      function($) {\n        var next = $.first()\n\n        setTimeout(function() {\n          next()\n        }, 2000)\n      }\n    , function($) {\n        // Never called because of timeout\n      }\n    ], {timeout: 1000}, callback)","readmeFilename":"README.md","bugs":{"url":"https://github.com/CrabDude/stepup/issues"},"_id":"stepup@1.0.1","dist":{"shasum":"f39d177961f78528cd32e5532996bc99196a3135","tarball":"https://registry.npmjs.org/stepup/-/stepup-1.0.1.tgz","integrity":"sha512-aEKF26JypROtNIg3RaH2XdoyrRMGD+Y1ddNsGXSriwHjjTbQNVaabI5gK1ftFAM77Ri+gNj8fC+m+X10qz3oMw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDk6sFV4ITrXahIjG9GKi1/mk+ZZSFjBKq75AYP6fWUKgIgCqCaJtKlDZLd3BUSgzGMO8zFjw+2MfN7V089nwPgMU8="}]},"_from":".","_npmVersion":"1.3.8","_npmUser":{"name":"crabdude","email":"dude@noderiety.com"},"maintainers":[{"name":"crabdude","email":"dude@noderiety.com"}]},"1.1.0":{"name":"stepup","version":"1.1.0","description":"A simple control-flow library for Node that makes parallel execution, serial execution, and error handling painless.","homepage":"http://github.com/CrabDude/stepup","repository":{"type":"git","url":"git://github.com/CrabDude/stepup.git"},"author":{"name":"Adam Crabtree","email":"dude@noderiety.com"},"main":"lib/stepup","engines":{"node":">=0.2.0"},"dependencies":{"trycatch":">=0.1.0 <0.3.0"},"devDependencies":{"mocha":"~1.6.0","chai":"~1.3.0","survey":"~0.2.2"},"keywords":["error","exception","control","flow","async","series"],"directories":{"example":"examples","test":"test"},"scripts":{"test":"mocha --reporter spec","bench":"survey ./bench/stepup"},"license":"MIT","optionalDependencies":{"trycatch":">=0.1.0 <0.3.0"},"readme":"# stepup\n\nA simple control-flow library for node.js that makes parallel execution, serial execution, and error handling painless.\n\n## Install\n\n    npm install stepup\n\n## Basic Usage\n\n_For a complete overview of functionality, [see the unit tests](https://github.com/CrabDude/stepup/blob/master/test/stepup.js)._\n\nstepup exports a single function:\n\n    var $$ = require('stepup')\n    $$(steps, [options], [callback])\n    \nWhich can be used to execute an array of functions or \"steps\"\n\n    $$([\n      function stepOne($) {\n        var valueOne = 'a synchronous value'\n        return valueOne\n      }\n    , function stepTwo($, valueOne) {\n        fs.readFile('someFile.txt', $.first())\n      }\n    , function stepThree($, someFileTxt) {\n        // ...\n      }\n    ])\n    \nThe first argument is the context object, `$`. `$` contains functions for generating callbacks. When all generated callbacks have been called, synchronously or asynchronously, the next step will be called.\n\nNote:\n\n* Any number of callbacks may be generated in a given step.\n* If no callbacks are generated (e.g., a value is returned), the next step will proceed.\n\nAdditionally, there are many types of generator functions\n    \n    $$([\n      function($) {\n        // Pass the first non-error argument\n        $.first()(null, 'firstValue')\n        \n        // Pass all arguments as an array\n        $.collapse()(null, 'collapseA', 'collapseB', 'collapseC')\n        \n        // Pass the first argument from an event (error-less) handler\n        $.event()('eventValue')\n                \n        // Don't pass any arguments\n        $.none()(null, 'noneA', 'noneB')\n        \n        // Don't pass any arguments AND ignore the error value\n        $.ignore()(new Error('Don't care.'), 'ignoreA', 'ignoreB')\n        \n        // Pass all arguments spread across multiple values\n        $.spread()(null, 'spreadA', 'spreadB')\n      }\n    , function($, firstValue, collapseValues, eventValue, spreadA, spreadB) {\n        // collapseValues === ['collapseA', 'collapseB', 'collapseC']\n        \n    \t// Errors will be passed to the callback and remaining steps will be skipped\n    \t$.first()(null, 'This value will never be seen.')\n    \t$.first()(new Error('Pass this to the callback'))\n      }\n    , function ignoredStep($) {\n        // Skipped because error was passed\n      }\n    ], function callback(err) {\n      // err.message === 'Pass this to the callback'\n    })\n    \nThe group generator is convenient for waiting on a set of async calls\n    \n    $$([\n      function($) {\n        var files = ['A.txt', 'B.txt', 'C.txt', 'D.txt']\n        // Create a group generator, type is optional and defaults to 'first'\n        // (e.g., 'first', 'collapse', 'event', 'none', etc...)\n        var group = $.group('first')\n        \n        files.forEach(function(fileName) {\n          // Generate a callback for each file in the list\n          fs.readFile(fileName, group())\n        )\n      }\n    , function($, groupValues) {\n        // ...\n      }\n    ])\n    \n## Error Handling\n\nThe first error is always passed to the callback, with all remaining results, errors, or steps ignored. If you this is undesirable, considering using `$.ignore` or wrapping a callback\n\n    $$([\n      function($) {\n        var next = $.first()\n        \n        fs.readFile(fileName, function(err, data) {\n          // Ignore the error if it exists\n          next(null, data)\n        })\n      }\n      // ...\n    ])\n    \nAdditionally, stepup uses the `trycatch` async try/catch library to catch all errors. To disable, call `$.config({useAsyncTrycatch: false})`\n\n\n## Extras\n\n### $.end    \nUseful for skipping the remaining steps and passing values to the callback\n\n    $$([\n      function($) {\n        if (cachedValue) {\n          return $.end(null, cachedValue)\n        }\n        fs.readFile('someFile.txt', $.first())\n      }\n    , function($, someFileTxt) {\n        // Skipped when cachedValue is truthy\n      }\n    ], callback)\n    \n### $.data\nIs an object useful for storing state across steps\n     \n    $$([\n      function($) {\n        $.data.foo = true\n        fs.readFile('someFile.txt', $.first())\n      }\n    , function($, someFileTxt) {\n        // $.data.foo === true\n      }\n    ], callback)\n    \n### $.run\nIs a convenience function for nesting steps\n\n    $$([\n      function($) {\n        $.run([\n          function(_$) {\n            // ...\n          }\n        , function(_$) {\n            // ...\n          }\n        ], $.first())\n        \n        fs.readFile('someFile.txt', $.first())\n      }\n    , function($, subStepResult, someFileTxt) {\n        // ...\n      }\n    ], callback)\n        \n## Options\n\n### timeout\nUse to guarantee a callback is called after a timeout period\n\n    $$([\n      function($) {\n        var next = $.first()\n\n        setTimeout(function() {\n          next()\n        }, 2000)\n      }\n    , function($) {\n        // Never called because of timeout\n      }\n    ], {timeout: 1000}, callback)","readmeFilename":"README.md","_id":"stepup@1.1.0","dist":{"shasum":"eac12f7f17c926a33b8ac75ca2447ad8029f5bc3","tarball":"https://registry.npmjs.org/stepup/-/stepup-1.1.0.tgz","integrity":"sha512-PbDo8LDfi1MGfMwBZevvRNxiEK4ZacBgjYVe0+w1GOd05fY1SOc7MAxEwT8URVSVubByaslwk1q9trL8vffLaQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCkRF4cq4aA4dc6VKrf4fMG0nOsbu43fHoEIB0xgPdiVgIhALkJr2mN9B4olCxGS27znkpvX8g5IisygQ4c2+jnp/RI"}]},"_from":".","_npmVersion":"1.2.14","_npmUser":{"name":"crabdude","email":"atcrabtree@gmail.com"},"maintainers":[{"name":"crabdude","email":"dude@noderiety.com"}]},"1.1.1":{"name":"stepup","version":"1.1.1","description":"A simple control-flow library for Node that makes parallel execution, serial execution, and error handling painless.","homepage":"http://github.com/CrabDude/stepup","repository":{"type":"git","url":"git://github.com/CrabDude/stepup.git"},"author":{"name":"Adam Crabtree","email":"dude@noderiety.com"},"main":"lib/stepup","engines":{"node":">=0.2.0"},"dependencies":{"trycatch":">=0.1.0 <0.3.0"},"devDependencies":{"mocha":"~1.6.0","chai":"~1.3.0","survey":"~0.2.2"},"keywords":["error","exception","control","flow","async","series"],"directories":{"example":"examples","test":"test"},"scripts":{"test":"mocha --reporter spec","bench":"survey ./bench/stepup"},"license":"MIT","optionalDependencies":{"trycatch":">=0.1.0 <0.3.0"},"readme":"# stepup\n\nA simple control-flow library for node.js that makes parallel execution, serial execution, and error handling painless.\n\n## Install\n\n    npm install stepup\n\n## Basic Usage\n\n_For a complete overview of functionality, [see the unit tests](https://github.com/CrabDude/stepup/blob/master/test/stepup.js)._\n\nstepup exports a single function:\n\n    var $$ = require('stepup')\n    $$(steps, [options], [callback])\n    \nWhich can be used to execute an array of functions or \"steps\"\n\n    $$([\n      function stepOne($) {\n        var valueOne = 'a synchronous value'\n        return valueOne\n      }\n    , function stepTwo($, valueOne) {\n        fs.readFile('someFile.txt', $.first())\n      }\n    , function stepThree($, someFileTxt) {\n        // ...\n      }\n    ])\n    \nThe first argument is the context object, `$`. `$` contains functions for generating callbacks. When all generated callbacks have been called, synchronously or asynchronously, the next step will be called.\n\nNote:\n\n* Any number of callbacks may be generated in a given step.\n* If no callbacks are generated (e.g., a value is returned), the next step will proceed.\n\nAdditionally, there are many types of generator functions\n    \n    $$([\n      function($) {\n        // Pass the first non-error argument\n        $.first()(null, 'firstValue')\n        \n        // Pass all arguments as an array\n        $.collapse()(null, 'collapseA', 'collapseB', 'collapseC')\n        \n        // Pass the first argument from an event (error-less) handler\n        $.event()('eventValue')\n                \n        // Don't pass any arguments\n        $.none()(null, 'noneA', 'noneB')\n        \n        // Don't pass any arguments AND ignore the error value\n        $.ignore()(new Error('Don't care.'), 'ignoreA', 'ignoreB')\n        \n        // Pass all arguments spread across multiple values\n        $.spread()(null, 'spreadA', 'spreadB')\n      }\n    , function($, firstValue, collapseValues, eventValue, spreadA, spreadB) {\n        // collapseValues === ['collapseA', 'collapseB', 'collapseC']\n        \n    \t// Errors will be passed to the callback and remaining steps will be skipped\n    \t$.first()(null, 'This value will never be seen.')\n    \t$.first()(new Error('Pass this to the callback'))\n      }\n    , function ignoredStep($) {\n        // Skipped because error was passed\n      }\n    ], function callback(err) {\n      // err.message === 'Pass this to the callback'\n    })\n    \nThe group generator is convenient for waiting on a set of async calls\n    \n    $$([\n      function($) {\n        var files = ['A.txt', 'B.txt', 'C.txt', 'D.txt']\n        // Create a group generator, type is optional and defaults to 'first'\n        // (e.g., 'first', 'collapse', 'event', 'none', etc...)\n        var group = $.group('first')\n        \n        files.forEach(function(fileName) {\n          // Generate a callback for each file in the list\n          fs.readFile(fileName, group())\n        )\n      }\n    , function($, groupValues) {\n        // ...\n      }\n    ])\n    \n## Error Handling\n\nThe first error is always passed to the callback, with all remaining results, errors, or steps ignored. If you this is undesirable, considering using `$.ignore` or wrapping a callback\n\n    $$([\n      function($) {\n        var next = $.first()\n        \n        fs.readFile(fileName, function(err, data) {\n          // Ignore the error if it exists\n          next(null, data)\n        })\n      }\n      // ...\n    ])\n    \nAdditionally, stepup uses the `trycatch` async try/catch library to catch all errors. To disable, call `$.config({useAsyncTrycatch: false})`\n\n\n## Extras\n\n### $.end    \nUseful for skipping the remaining steps and passing values to the callback\n\n    $$([\n      function($) {\n        if (cachedValue) {\n          return $.end(null, cachedValue)\n        }\n        fs.readFile('someFile.txt', $.first())\n      }\n    , function($, someFileTxt) {\n        // Skipped when cachedValue is truthy\n      }\n    ], callback)\n    \n### $.data\nIs an object useful for storing state across steps\n     \n    $$([\n      function($) {\n        $.data.foo = true\n        fs.readFile('someFile.txt', $.first())\n      }\n    , function($, someFileTxt) {\n        // $.data.foo === true\n      }\n    ], callback)\n    \n### $.run\nIs a convenience function for nesting steps\n\n    $$([\n      function($) {\n        $.run([\n          function(_$) {\n            // ...\n          }\n        , function(_$) {\n            // ...\n          }\n        ], $.first())\n        \n        fs.readFile('someFile.txt', $.first())\n      }\n    , function($, subStepResult, someFileTxt) {\n        // ...\n      }\n    ], callback)\n        \n## Options\n\n### timeout\nUse to guarantee a callback is called after a timeout period\n\n    $$([\n      function($) {\n        var next = $.first()\n\n        setTimeout(function() {\n          next()\n        }, 2000)\n      }\n    , function($) {\n        // Never called because of timeout\n      }\n    ], {timeout: 1000}, callback)","readmeFilename":"README.md","_id":"stepup@1.1.1","dist":{"shasum":"9128491aa67689e75ddd3c2b0e452b4f06a30d9c","tarball":"https://registry.npmjs.org/stepup/-/stepup-1.1.1.tgz","integrity":"sha512-b8WWHO9nC+ZMQyFQqpgzOv2aAr4Nb5gsy7tkXITXPobur0LigVAYT6g9R2TZb2al4UyzDX4OB+amPdPBmK9hiA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDtJh6QaXNwzWXUXeNHztkwAkuUZf5UF4maiHY7QNjxfwIgMVbcVwFeCRzPb5QWOII2N5xJfnLG9q1t5uhsfMiKJ1o="}]},"_from":".","_npmVersion":"1.2.14","_npmUser":{"name":"crabdude","email":"atcrabtree@gmail.com"},"maintainers":[{"name":"crabdude","email":"dude@noderiety.com"}]},"1.1.2":{"name":"stepup","version":"1.1.2","description":"A simple control-flow library for Node that makes parallel execution, serial execution, and error handling painless.","homepage":"http://github.com/CrabDude/stepup","repository":{"type":"git","url":"git://github.com/CrabDude/stepup.git"},"author":{"name":"Adam Crabtree","email":"dude@noderiety.com"},"main":"lib/stepup","engines":{"node":">=0.2.0"},"dependencies":{"trycatch":"~1.0.3"},"devDependencies":{"mocha":"~1.6.0","chai":"~1.3.0","survey":"~0.2.2"},"keywords":["error","exception","control","flow","async","series"],"directories":{"example":"examples","test":"test"},"scripts":{"test":"mocha --reporter spec","bench":"survey ./bench/stepup"},"license":"MIT","readme":"# stepup\n\nA simple control-flow library for node.js that makes parallel execution, serial execution, and error handling painless.\n\n## Install\n\n    npm install stepup\n\n## Basic Usage\n\n_For a complete overview of functionality, [see the unit tests](https://github.com/CrabDude/stepup/blob/master/test/stepup.js)._\n\nstepup exports a single function:\n\n    var $$ = require('stepup')\n    $$(steps, [options], [callback])\n    \nWhich can be used to execute an array of functions or \"steps\"\n\n    $$([\n      function stepOne($) {\n        var valueOne = 'a synchronous value'\n        return valueOne\n      }\n    , function stepTwo($, valueOne) {\n        fs.readFile('someFile.txt', $.first())\n      }\n    , function stepThree($, someFileTxt) {\n        // ...\n      }\n    ])\n    \nThe first argument is the context object, `$`. `$` contains functions for generating callbacks. When all generated callbacks have been called, synchronously or asynchronously, the next step will be called.\n\nNote:\n\n* Any number of callbacks may be generated in a given step.\n* If no callbacks are generated (e.g., a value is returned), the next step will proceed.\n\nAdditionally, there are many types of generator functions\n    \n    $$([\n      function($) {\n        // Pass the first non-error argument\n        $.first()(null, 'firstValue')\n        \n        // Pass all arguments as an array\n        $.collapse()(null, 'collapseA', 'collapseB', 'collapseC')\n        \n        // Pass the first argument from an event (error-less) handler\n        $.event()('eventValue')\n                \n        // Don't pass any arguments\n        $.none()(null, 'noneA', 'noneB')\n        \n        // Don't pass any arguments AND ignore the error value\n        $.ignore()(new Error('Don't care.'), 'ignoreA', 'ignoreB')\n        \n        // Pass all arguments spread across multiple values\n        $.spread()(null, 'spreadA', 'spreadB')\n      }\n    , function($, firstValue, collapseValues, eventValue, spreadA, spreadB) {\n        // collapseValues === ['collapseA', 'collapseB', 'collapseC']\n        \n    \t// Errors will be passed to the callback and remaining steps will be skipped\n    \t$.first()(null, 'This value will never be seen.')\n    \t$.first()(new Error('Pass this to the callback'))\n      }\n    , function ignoredStep($) {\n        // Skipped because error was passed\n      }\n    ], function callback(err) {\n      // err.message === 'Pass this to the callback'\n    })\n    \nThe group generator is convenient for waiting on a set of async calls\n    \n    $$([\n      function($) {\n        var files = ['A.txt', 'B.txt', 'C.txt', 'D.txt']\n        // Create a group generator, type is optional and defaults to 'first'\n        // (e.g., 'first', 'collapse', 'event', 'none', etc...)\n        var group = $.group('first')\n        \n        files.forEach(function(fileName) {\n          // Generate a callback for each file in the list\n          fs.readFile(fileName, group())\n        )\n      }\n    , function($, groupValues) {\n        // ...\n      }\n    ])\n    \n## Error Handling\n\nThe first error is always passed to the callback, with all remaining results, errors, or steps ignored. If you this is undesirable, considering using `$.ignore` or wrapping a callback\n\n    $$([\n      function($) {\n        var next = $.first()\n        \n        fs.readFile(fileName, function(err, data) {\n          // Ignore the error if it exists\n          next(null, data)\n        })\n      }\n      // ...\n    ])\n    \nAdditionally, stepup uses the `trycatch` async try/catch library to catch all errors. To disable, call `$.config({useAsyncTrycatch: false})`\n\n\n## Extras\n\n### $.end    \nUseful for skipping the remaining steps and passing values to the callback\n\n    $$([\n      function($) {\n        if (cachedValue) {\n          return $.end(null, cachedValue)\n        }\n        fs.readFile('someFile.txt', $.first())\n      }\n    , function($, someFileTxt) {\n        // Skipped when cachedValue is truthy\n      }\n    ], callback)\n    \n### $.data\nIs an object useful for storing state across steps\n     \n    $$([\n      function($) {\n        $.data.foo = true\n        fs.readFile('someFile.txt', $.first())\n      }\n    , function($, someFileTxt) {\n        // $.data.foo === true\n      }\n    ], callback)\n    \n### $.run\nIs a convenience function for nesting steps\n\n    $$([\n      function($) {\n        $.run([\n          function(_$) {\n            // ...\n          }\n        , function(_$) {\n            // ...\n          }\n        ], $.first())\n        \n        fs.readFile('someFile.txt', $.first())\n      }\n    , function($, subStepResult, someFileTxt) {\n        // ...\n      }\n    ], callback)\n        \n## Options\n\n### timeout\nUse to guarantee a callback is called after a timeout period\n\n    $$([\n      function($) {\n        var next = $.first()\n\n        setTimeout(function() {\n          next()\n        }, 2000)\n      }\n    , function($) {\n        // Never called because of timeout\n      }\n    ], {timeout: 1000}, callback)","readmeFilename":"README.md","_id":"stepup@1.1.2","dist":{"shasum":"9a87178ee1a31566dcea01b9be2696fd212075a8","tarball":"https://registry.npmjs.org/stepup/-/stepup-1.1.2.tgz","integrity":"sha512-br5KHZStfqwExweXbY3PwjJlw3vOwTt3qeRot3c3wo/v5nYF11dNKm7O4lhWEb1ivK/unB5gG25Kb2Lfnt67/Q==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC9JS/mb/UGIgPlhfqmfNAyRxGTW53cgAaGLRTX/xSspgIhAPI1Q86i5fu/8/sGfwN8S5pmpjBvf0mc0pKuw6X6R6zM"}]},"_from":".","_npmVersion":"1.2.14","_npmUser":{"name":"crabdude","email":"atcrabtree@gmail.com"},"maintainers":[{"name":"crabdude","email":"dude@noderiety.com"}]}},"maintainers":[{"name":"crabdude","email":"dude@noderiety.com"}],"time":{"modified":"2022-06-27T00:21:48.095Z","created":"2011-10-01T00:34:40.025Z","0.0.6":"2011-10-01T00:34:40.481Z","0.0.7":"2011-10-01T00:37:36.637Z","0.0.9":"2011-10-12T18:24:37.863Z","0.0.11":"2011-11-22T20:52:18.299Z","0.0.12":"2012-08-23T16:55:57.477Z","0.1.0":"2013-04-04T00:49:12.161Z","1.0.0":"2013-09-23T18:45:18.929Z","1.0.1":"2013-09-23T22:22:44.089Z","1.0.2":"2013-10-14T22:31:45.737Z","1.1.0":"2013-10-14T22:40:32.735Z","1.1.1":"2013-10-14T23:48:12.496Z","1.1.2":"2013-10-18T18:06:01.962Z"},"author":{"name":"Adam Crabtree","email":"dude@noderiety.com"},"repository":{"type":"git","url":"git://github.com/CrabDude/stepup.git"}}