{"_id":"repeat","_rev":"46-b71aa56d3330a9a949310cb2f3b8fa10","name":"repeat","description":"create repeating task chains","dist-tags":{"latest":"2.0.4"},"versions":{"0.0.1":{"name":"repeat","version":"0.0.1","description":["Repeat.js is a javascript library that makes working with repeated actions pure joy by ","removing the need for setTimeout/setInterval and somewhat error prone timer references"],"homepage":"https://github.com/bjoerge/repeat.js","author":{"name":"Bjørge Næss","email":"bjoerge@gmail.com"},"keywords":["Repetition","Repeat","Timed","Timer","setInterval","setTimeout","clearTimeout","asyncronous","promise","deferred"],"dependencies":{"dfrrd":"latest"},"devDependencies":{"mocha":"latest","expect.js":"latest","jquery":"git://github.com/bjoerge/jquery-node.git#v1.8.0","jsdom":"latest","coffee-script":"latest","moment":"latest","sinon":"latest","jshint":"latest","node-minify":"latest"},"scripts":{"test":"make test","test-browser":"./node_modules/.bin/browserify -r expect.js -o tmp/browser.js -e extra/browser.coffee;coffee -o ./tmp -c ./test;open test/browser.html"},"main":"index.js","repository":{"type":"git","url":"https://github.com/bjoerge/repeat.js.git"},"bugs":{"url":"https://github.com/bjoerge/repeat.js/issues"},"licenses":[{"type":"MIT"}],"readme":"<pre>\n ____                                     __\n/\\  _`\\                                  /\\ \\__       __\n\\ \\ \\L\\ \\     __   _____      __     __  \\ \\ ,_\\     /\\_\\    ____\n \\ \\ ,  /   /'__`\\/\\ '__`\\  /'__`\\ /'__`\\ \\ \\ \\/     \\/\\ \\  /',__\\\n  \\ \\ \\\\ \\ /\\  __/\\ \\ \\L\\ \\/\\  __//\\ \\L\\.\\_\\ \\ \\_  __ \\ \\ \\/\\__, `\\\n   \\ \\_\\ \\_\\ \\____\\\\ \\ ,__/\\ \\____\\ \\__/.\\_\\\\ \\__\\/\\_\\_\\ \\ \\/\\____/\n    \\/_/\\/ /\\/____/ \\ \\ \\/  \\/____/\\/__/\\/_/ \\/__/\\/_/\\ \\_\\ \\/___/\n                     \\ \\_\\                           \\ \\____/\n                      \\/_/                            \\/___/\n\nTimed actions in JavaScript simplified\n</pre>\n\n# Summary\nRepeat.js is a tiny (< 2kb minified and gzipped) javascript library for timing function calls.\n\n- It abstracts away the need for dealing with setTimeout and setInterval, and the somewhat error prone timer and interval IDs\n\n- It provides an simple, intuitive and flexible chained api.\n\n- It is ideal for polling, performing asynchronous updates, doing timed UI updates or executing expensive tasks asynchronously .\n\n- It does not have any dependencies, but plays nicely with jQuery.\n\n- It is built on top of a Deferred/promise implemetation for even greater flexibility\n\n- It is tested in IE 7-9, Firefox 10, Chrome 16, Safari 5.1 and Opera 11.61.\n\n## Examples\n\n### Basic example\n```javascript\nfunction sayHello() {\n  console.log(\"Hello world!\");\n};\n\nRepeat(sayHello).every(500, 'ms').for(2, 'minutes').start.in(5, 'sec');\n// -> Now wait for 5 seconds and keep a watchful eye on the javascript console\n```\n\n### Live display of relative time with jQuery and moment.js\n\n```javascript\njQuery(function() {\n  (function mockDOM() { // This is just for creating some example DOM elements\n    var ul = jQuery(\"<ul></ul>\"), now = (new Date().getTime()), elem_count = 100;\n    while (elem_count--) {;\n      ul.append(jQuery('<li class=\"live-time\" data-timestamp=\"'+\n         (now+(Math.random()*100000)*(Math.random() > 0.5 ? -1 : 1)) +\n        '\"></li>'))\n    }\n    ul.appendTo(jQuery(\"body\")); \n  }());\n\n  var elems = jQuery(\".live-time\");\n  Repeat(function() {\n    elems.each(function(i, elem) {\n      elem = jQuery(elem);\n      var time = moment(elem.data(\"timestamp\"));\n      elem.html('Displaying '+ time.format(\"dddd, MMMM Do YYYY, h:mm:ss a\") +' as \"<b>'+ time.fromNow()+'</b>\"');\n    });\n  }).every(1000, 'ms').start.now();\n});\n```\n\n### Asynchronous polling with jQuery \n\nPolling a server every second, but wait for the request to complete before proceeding\n\n```javascript\n\nRepeat(function(done) {\n         jQuery.ajax({\n           url: 'http://www.example.com',\n           success: function(data) {console.log(data);},\n           complete: function() {\n             done(); // will wait for this to be called before continuing\n           }\n         });\n       })\n       .every(1000, 'ms')\n       .for(2, 'minutes')\n       .start.in(3, 'secs');\n```\n\n### Monitoring changes in an objects' state with console.monitor\n\nAdd a function to the console object, that allows for monitoring a property of any object.\n\n```javascript\nconsole.monitor = function(object, property) {\n  var last_value = object[property];\n  return Repeat(function() {\n    var current_value = object[property];\n    if (last_value !== current_value) {\n      console.log('Property changed from \"'+last_value+'\" to \"'+current_value+'\"!');\n      last_value = current_value;\n    }\n    else {\n      console.log(\"No change\");\n    }\n  });\n};\n\nvar myObject = {someProperty: \"Something\"};\nconsole.monitor(myObject, 'someProperty').every(500, 'ms').for(10, 'seconds').start();\nsetTimeout(function() {myObject.someProperty = \"Changed value\"}, 3000);\n```\n\n### Execute expensive operations asynchronously\nA common trick in order to keep the UI responsive while executing expensive operations\nis to split up the parts of the operation into smaller subtasks that can be executed asynchronously using timers.\n\nThe illustrating example from Nicholas C. Zakas' High Performance Javascript (loc. 3215) could be rewritten like this:\n\n```javascript\nfunction saveDocument(id) {\n  var tasks = [openDocument, writeText, closeDocument, updateUI]; // these are the expensive functions\n  return Repeat(function() {\n      var task = tasks.shift();\n      task(id);\n    })\n    .async().until(function() {\n      return tasks.length == 0;\n    }).start.now();        \n}\n```\n\n# Promise support\nThe functions `start()` `now()` `in()` and `wait()` will all return a read-only [Promise](http://en.wikipedia.org/wiki/Futures_and_promises) instance.\n\n- If used with jQuery, it will return an instance of jQuery's [Promise](http://api.jquery.com/Types/#Promise).\n- If used standalone, a [minimalistic](https://github.com/bjoerge/dfrrd.js) implementation of the CommonJS [Promises/A](http://wiki.commonjs.org/wiki/Promises/A) spec will be used.\n\nBasic example:\n\n```javascript\nRepeat(function() { console.log(\"W00t\"); })\n  .every(1, 's')\n  .for(20, 's')\n  .start.now()\n  .then(function() {\n    console.log(\"I'm done w00t'n\");\n  });\n```\n\n## Error handling and promise callbacks\n\n- Any errors thrown in the task function will cause the promise to be rejected with the error object as value\n- The promise's progress listeners be notified after each task invocation with the returned value as parameter\n- When done, the promise will be resolved with an array of the tasks return value for each invocation\n\nThe following example illustrates use of success/progress/error listeners:\n\n```javascript\nvar onSuccess = function(results) {\n  console.log(\"All good\", results);\n};\nvar onFailure = function(exception) {\n  console.error(\"Error\", exception);\n};\nvar onProgress = function(result) {\n  console.log(\"Progress: \", result);\n};\nRepeat(function() {\n        var v = Math.random();\n        if (v > 0.8) throw new Error(\"Ouch!\");\n        return v;\n    })\n  .every(1, 's')\n  .for(10, 's')\n  .start()\n  .then(onSuccess, onFailure, onProgress);\n```\n\nIf used standalone or with jQuery, the promise object also provides more convenient `progress` and `fail` functions for adding callbacks in separate steps.\nAdditionaly, there's also an `always` method to add callback functions for whenever the promise is either resolved or rejected.\n\nThe above example using the jQuery or standalone version could be written like this:\n\n```javascript\nvar repeat = Repeat(function() {\n        var v = Math.random();\n        if (v > 0.8) throw new Error(\"Ouch!\");\n        return v;\n    })\n  .every(1, 's')\n  .for(5, 's')\n  .start();\n\nrepeat.then(function() { console.log('Resolved!'); });\nrepeat.fail(function() { console.log('Rejected!'); });\nrepeat.always(function() { console.log('Done! (either resolved or rejected)'); });\n```\n\n## Compatibility notes\n\n- If you are targeting older browsers, you probably want to use any of the ECMAScript 5 polyfill libraries\nlisted here: https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-Browser-Polyfills (in particular\n [ddr-ecma5](http://code.google.com/p/ddr-ecma5/), [augmentjs](http://augmentjs.com/) or\n  [es5-shim](https://github.com/kriskowal/es5-shim/))\n\n- Some older browsers and environments (IE 6 - 8) doesn't support using reserved words\nas property names (and may throw an error when referencing functions like \"for\", \"while\" and \"in\"),\nRepeat.js offers alternative function names for code targeted for such environments:\n\n  - `for`   => `lasting`\n  - `while` => `during`\n  - `in`    => `wait`\n  - `if`    => `provided`\n\nExample:\n\n```javascript\nRepeat(function() {\n  console.log(\"I'm safe\");\n })\n .every(2, 'sec')\n .lasting(2, 'min')                                   // lasting instead of for\n .during(function() { return Math.random() > .5; })   // during instead of while\n .provided(function() { return Math.random() > .5; }) // provided instead of if\n .wait(5, 'sec');                                     // wait instead of in\n```\n\nAnother less readable (and not recommended) workaround would be to reference these methods using bracket notation:\n\n```javascript\nRepeat(function() { console.log(\"Hello\"); })\n.every(2, 's')\n['for'](2, 'm')\n['if'](function() { return Math.random() > .5; })\n['while'](function() {  return Math.random() > .5; })\n['in'](5, 's');\n```\n\n# License\nCopyright (C) 2012 Bjørge Næss\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","_id":"repeat@0.0.1","dist":{"shasum":"924be0210356d6d76d3f69e7cc7a03080489c1be","tarball":"https://registry.npmjs.org/repeat/-/repeat-0.0.1.tgz","integrity":"sha512-0W2Q0j4ezNDU8/NIkq59rHz76exD9eOLS8/MfgIbGPiPMCCS9JCsyIDtkfZ9lHc9t23Kj0JnmW0vycJ4s6OkGw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID2qzfsr1UeZow9OWH9kn/MuC1PynarOl1J4rQYfbeF0AiBl8LuAOLURKndsC1ji2fcuGq4OxBAkoxA8ihLedmlpkA=="}]},"maintainers":[{"name":"bjoerge","email":"bjoerge@gmail.com"}],"directories":{}},"0.0.2":{"name":"repeat","version":"0.0.2","description":["Repeat.js is a javascript library that makes working with repeated actions pure joy by ","removing the need for setTimeout/setInterval and somewhat error prone timer references"],"homepage":"https://github.com/bjoerge/repeat.js","author":{"name":"Bjørge Næss","email":"bjoerge@gmail.com"},"keywords":["Repetition","Repeat","Timed","Timer","setInterval","setTimeout","clearTimeout","asyncronous","promise","deferred"],"dependencies":{"dfrrd":"latest"},"devDependencies":{"mocha":"latest","expect.js":"latest","jquery":"git://github.com/bjoerge/jquery-node.git#v1.8.0","jsdom":"latest","coffee-script":"latest","moment":"latest","sinon":"latest","jshint":"latest","node-minify":"latest"},"scripts":{"test":"make test","test-browser":"./node_modules/.bin/browserify -r expect.js -o tmp/browser.js -e extra/browser.coffee;coffee -o ./tmp -c ./test;open test/browser.html"},"main":"index.js","repository":{"type":"git","url":"https://github.com/bjoerge/repeat.js.git"},"bugs":{"url":"https://github.com/bjoerge/repeat.js/issues"},"licenses":[{"type":"MIT"}],"readme":"<pre>\n ____                                     __\n/\\  _`\\                                  /\\ \\__       __\n\\ \\ \\L\\ \\     __   _____      __     __  \\ \\ ,_\\     /\\_\\    ____\n \\ \\ ,  /   /'__`\\/\\ '__`\\  /'__`\\ /'__`\\ \\ \\ \\/     \\/\\ \\  /',__\\\n  \\ \\ \\\\ \\ /\\  __/\\ \\ \\L\\ \\/\\  __//\\ \\L\\.\\_\\ \\ \\_  __ \\ \\ \\/\\__, `\\\n   \\ \\_\\ \\_\\ \\____\\\\ \\ ,__/\\ \\____\\ \\__/.\\_\\\\ \\__\\/\\_\\_\\ \\ \\/\\____/\n    \\/_/\\/ /\\/____/ \\ \\ \\/  \\/____/\\/__/\\/_/ \\/__/\\/_/\\ \\_\\ \\/___/\n                     \\ \\_\\                           \\ \\____/\n                      \\/_/                            \\/___/\n\nTimed actions in JavaScript simplified\n</pre>\n\n# Summary\nRepeat.js is a tiny (< 2kb minified and gzipped) javascript library for timing function calls.\n\n- It abstracts away the need for dealing with setTimeout and setInterval, and the somewhat error prone timer and interval IDs\n\n- It provides an simple, intuitive and flexible chained api.\n\n- It is ideal for polling, performing asynchronous updates, doing timed UI updates or executing expensive tasks asynchronously .\n\n- It can be used standalone or with jQuery.\n\n- It is built on top of a Deferred/promise implemetation for even greater flexibility\n\n- It is tested in IE 7-9, Firefox 10, Chrome 16, Safari 5.1 and Opera 11.61.\n\n## Examples\n\n### Basic example\n```javascript\nfunction sayHello() {\n  console.log(\"Hello world!\");\n};\n\nRepeat(sayHello).every(500, 'ms').for(2, 'minutes').start.in(5, 'sec');\n// -> Now wait for 5 seconds and keep a watchful eye on the javascript console\n```\n\n### Live display of relative time with jQuery and moment.js\n\n```javascript\njQuery(function() {\n  (function mockDOM() { // This is just for creating some example DOM elements\n    var ul = jQuery(\"<ul></ul>\"), now = (new Date().getTime()), elem_count = 100;\n    while (elem_count--) {;\n      ul.append(jQuery('<li class=\"live-time\" data-timestamp=\"'+\n         (now+(Math.random()*100000)*(Math.random() > 0.5 ? -1 : 1)) +\n        '\"></li>'))\n    }\n    ul.appendTo(jQuery(\"body\")); \n  }());\n\n  var elems = jQuery(\".live-time\");\n  Repeat(function() {\n    elems.each(function(i, elem) {\n      elem = jQuery(elem);\n      var time = moment(elem.data(\"timestamp\"));\n      elem.html('Displaying '+ time.format(\"dddd, MMMM Do YYYY, h:mm:ss a\") +' as \"<b>'+ time.fromNow()+'</b>\"');\n    });\n  }).every(1000, 'ms').start.now();\n});\n```\n\n### Asynchronous polling with jQuery \n\nPolling a server every second, but wait for the request to complete before proceeding\n\n```javascript\n\nRepeat(function(done) {\n         jQuery.ajax({\n           url: 'http://www.example.com',\n           success: function(data) {console.log(data);},\n           complete: function() {\n             done(); // will wait for this to be called before continuing\n           }\n         });\n       })\n       .every(1000, 'ms')\n       .for(2, 'minutes')\n       .start.in(3, 'secs');\n```\n\n### Monitoring changes in an objects' state with console.monitor\n\nAdd a function to the console object, that allows for monitoring a property of any object.\n\n```javascript\nconsole.monitor = function(object, property) {\n  var last_value = object[property];\n  return Repeat(function() {\n    var current_value = object[property];\n    if (last_value !== current_value) {\n      console.log('Property changed from \"'+last_value+'\" to \"'+current_value+'\"!');\n      last_value = current_value;\n    }\n    else {\n      console.log(\"No change\");\n    }\n  });\n};\n\nvar myObject = {someProperty: \"Something\"};\nconsole.monitor(myObject, 'someProperty').every(500, 'ms').for(10, 'seconds').start();\nsetTimeout(function() {myObject.someProperty = \"Changed value\"}, 3000);\n```\n\n### Execute expensive operations asynchronously\nA common trick in order to keep the UI responsive while executing expensive operations\nis to split up the parts of the operation into smaller subtasks that can be executed asynchronously using timers.\n\nThe illustrating example from Nicholas C. Zakas' High Performance Javascript (loc. 3215) could be rewritten like this:\n\n```javascript\nfunction saveDocument(id) {\n  var tasks = [openDocument, writeText, closeDocument, updateUI]; // these are the expensive functions\n  return Repeat(function() {\n      var task = tasks.shift();\n      task(id);\n    })\n    .async().until(function() {\n      return tasks.length == 0;\n    }).start.now();        \n}\n```\n\n# Promise support\nThe functions `start()` `now()` `in()` and `wait()` will all return a read-only [Promise](http://en.wikipedia.org/wiki/Futures_and_promises) instance.\n\n- If used with jQuery, it will return an instance of jQuery's [Promise](http://api.jquery.com/Types/#Promise).\n- If used standalone, a [minimalistic](https://github.com/bjoerge/dfrrd.js) implementation of the CommonJS [Promises/A](http://wiki.commonjs.org/wiki/Promises/A) spec will be used.\n\nBasic example:\n\n```javascript\nRepeat(function() { console.log(\"W00t\"); })\n  .every(1, 's')\n  .for(20, 's')\n  .start.now()\n  .then(function() {\n    console.log(\"I'm done w00t'n\");\n  });\n```\n\n## Error handling and promise callbacks\n\n- Any errors thrown in the task function will cause the promise to be rejected with the error object as value\n- The promise's progress listeners be notified after each task invocation with the returned value as parameter\n- When done, the promise will be resolved with an array of the tasks return value for each invocation\n\nThe following example illustrates use of success/progress/error listeners:\n\n```javascript\nvar onSuccess = function(results) {\n  console.log(\"All good\", results);\n};\nvar onFailure = function(exception) {\n  console.error(\"Error\", exception);\n};\nvar onProgress = function(result) {\n  console.log(\"Progress: \", result);\n};\nRepeat(function() {\n        var v = Math.random();\n        if (v > 0.8) throw new Error(\"Ouch!\");\n        return v;\n    })\n  .every(1, 's')\n  .for(10, 's')\n  .start()\n  .then(onSuccess, onFailure, onProgress);\n```\n\nIf used standalone or with jQuery, the promise object also provides more convenient `progress` and `fail` functions for adding callbacks in separate steps.\nAdditionaly, there's also an `always` method to add callback functions for whenever the promise is either resolved or rejected.\n\nThe above example using the jQuery or standalone version could be written like this:\n\n```javascript\nvar repeat = Repeat(function() {\n        var v = Math.random();\n        if (v > 0.8) throw new Error(\"Ouch!\");\n        return v;\n    })\n  .every(1, 's')\n  .for(5, 's')\n  .start();\n\nrepeat.then(function() { console.log('Resolved!'); });\nrepeat.fail(function() { console.log('Rejected!'); });\nrepeat.always(function() { console.log('Done! (either resolved or rejected)'); });\n```\n\n## Compatibility notes\n\n- If you are targeting older browsers, you probably want to use any of the ECMAScript 5 polyfill libraries\nlisted here: https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-Browser-Polyfills (in particular\n [ddr-ecma5](http://code.google.com/p/ddr-ecma5/), [augmentjs](http://augmentjs.com/) or\n  [es5-shim](https://github.com/kriskowal/es5-shim/))\n\n- Some older browsers and environments (IE 6 - 8) doesn't support using reserved words\nas property names (and may throw an error when referencing functions like \"for\", \"while\" and \"in\"),\nRepeat.js offers alternative function names for code targeted for such environments:\n\n  - `for`   => `lasting`\n  - `while` => `during`\n  - `in`    => `wait`\n  - `if`    => `provided`\n\nExample:\n\n```javascript\nRepeat(function() {\n  console.log(\"I'm safe\");\n })\n .every(2, 'sec')\n .lasting(2, 'min')                                   // lasting instead of for\n .during(function() { return Math.random() > .5; })   // during instead of while\n .provided(function() { return Math.random() > .5; }) // provided instead of if\n .wait(5, 'sec');                                     // wait instead of in\n```\n\nAnother less readable (and not recommended) workaround would be to reference these methods using bracket notation:\n\n```javascript\nRepeat(function() { console.log(\"Hello\"); })\n.every(2, 's')\n['for'](2, 'm')\n['if'](function() { return Math.random() > .5; })\n['while'](function() {  return Math.random() > .5; })\n['in'](5, 's');\n```\n\n# License\nCopyright (C) 2012 Bjørge Næss\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","_id":"repeat@0.0.2","dist":{"shasum":"273705cb79a9e6727d2b7ac8e55b119916563276","tarball":"https://registry.npmjs.org/repeat/-/repeat-0.0.2.tgz","integrity":"sha512-QjjUpID+f5YeDe5KWammOc1LogUuIMgQERKkQ2CGRH4EB0CgskzkKT4C9G5kSNBoAHfYvZdwXQCCE3orLpETNg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAqhCTD0ZZg+6wpReJWVqLJotjUahsz/2Bto8/owsob1AiEA/fAXdnVOoEZbzGHvfG4+vYG3YIzGa6OxJ/iuYkgNUrI="}]},"maintainers":[{"name":"bjoerge","email":"bjoerge@gmail.com"}],"directories":{}},"0.0.3":{"name":"repeat","version":"0.0.3","description":["Repeat.js is a javascript library that makes working with repeated actions pure joy by ","removing the need for setTimeout/setInterval and somewhat error prone timer references"],"homepage":"https://github.com/bjoerge/repeat.js","author":{"name":"Bjørge Næss","email":"bjoerge@gmail.com"},"keywords":["Repetition","Repeat","Timed","Timer","setInterval","setTimeout","clearTimeout","asyncronous","promise","deferred"],"dependencies":{"dfrrd":"latest"},"devDependencies":{"mocha":"latest","expect.js":"latest","jquery":"git://github.com/bjoerge/jquery-node.git#v1.8.0","jsdom":"latest","coffee-script":"latest","moment":"latest","sinon":"latest","jshint":"latest","node-minify":"latest"},"scripts":{"test":"make test","test-browser":"./node_modules/.bin/browserify -r expect.js -o tmp/browser.js -e extra/browser.coffee;coffee -o ./tmp -c ./test;open test/browser.html"},"main":"index.js","repository":{"type":"git","url":"https://github.com/bjoerge/repeat.js.git"},"bugs":{"url":"https://github.com/bjoerge/repeat.js/issues"},"licenses":[{"type":"MIT"}],"readme":"<pre>\n ____                                     __\n/\\  _`\\                                  /\\ \\__       __\n\\ \\ \\L\\ \\     __   _____      __     __  \\ \\ ,_\\     /\\_\\    ____\n \\ \\ ,  /   /'__`\\/\\ '__`\\  /'__`\\ /'__`\\ \\ \\ \\/     \\/\\ \\  /',__\\\n  \\ \\ \\\\ \\ /\\  __/\\ \\ \\L\\ \\/\\  __//\\ \\L\\.\\_\\ \\ \\_  __ \\ \\ \\/\\__, `\\\n   \\ \\_\\ \\_\\ \\____\\\\ \\ ,__/\\ \\____\\ \\__/.\\_\\\\ \\__\\/\\_\\_\\ \\ \\/\\____/\n    \\/_/\\/ /\\/____/ \\ \\ \\/  \\/____/\\/__/\\/_/ \\/__/\\/_/\\ \\_\\ \\/___/\n                     \\ \\_\\                           \\ \\____/\n                      \\/_/                            \\/___/\n\nTimed actions in JavaScript simplified\n</pre>\n\n# Summary\nRepeat.js is a tiny (< 2kb minified and gzipped) javascript library for timing function calls.\n\n- It abstracts away the need for dealing with setTimeout and setInterval, and the somewhat error prone timer and interval IDs\n\n- It provides an simple, intuitive and flexible chained api.\n\n- It is ideal for polling, performing asynchronous updates, doing timed UI updates or executing expensive tasks asynchronously .\n\n- It can be used standalone or with jQuery.\n\n- It is built on top of a Deferred/promise implemetation for even greater flexibility\n\n- It is tested in IE 7-9, Firefox 10, Chrome 16, Safari 5.1 and Opera 11.61.\n\n## Examples\n\n### Basic example\n```javascript\nfunction sayHello() {\n  console.log(\"Hello world!\");\n};\n\nRepeat(sayHello).every(500, 'ms').for(2, 'minutes').start.in(5, 'sec');\n// -> Now wait for 5 seconds and keep a watchful eye on the javascript console\n```\n\n### Live display of relative time with jQuery and moment.js\n\n```javascript\njQuery(function() {\n  (function mockDOM() { // This is just for creating some example DOM elements\n    var ul = jQuery(\"<ul></ul>\"), now = (new Date().getTime()), elem_count = 100;\n    while (elem_count--) {;\n      ul.append(jQuery('<li class=\"live-time\" data-timestamp=\"'+\n         (now+(Math.random()*100000)*(Math.random() > 0.5 ? -1 : 1)) +\n        '\"></li>'))\n    }\n    ul.appendTo(jQuery(\"body\")); \n  }());\n\n  var elems = jQuery(\".live-time\");\n  Repeat(function() {\n    elems.each(function(i, elem) {\n      elem = jQuery(elem);\n      var time = moment(elem.data(\"timestamp\"));\n      elem.html('Displaying '+ time.format(\"dddd, MMMM Do YYYY, h:mm:ss a\") +' as \"<b>'+ time.fromNow()+'</b>\"');\n    });\n  }).every(1000, 'ms').start.now();\n});\n```\n\n### Asynchronous polling with jQuery \n\nPolling a server every second, but wait for the request to complete before proceeding\n\n```javascript\n\nRepeat(function(done) {\n         jQuery.ajax({\n           url: 'http://www.example.com',\n           success: function(data) {console.log(data);},\n           complete: function() {\n             done(); // will wait for this to be called before continuing\n           }\n         });\n       })\n       .every(1000, 'ms')\n       .for(2, 'minutes')\n       .start.in(3, 'secs');\n```\n\n### Monitoring changes in an objects' state with console.monitor\n\nAdd a function to the console object, that allows for monitoring a property of any object.\n\n```javascript\nconsole.monitor = function(object, property) {\n  var last_value = object[property];\n  return Repeat(function() {\n    var current_value = object[property];\n    if (last_value !== current_value) {\n      console.log('Property changed from \"'+last_value+'\" to \"'+current_value+'\"!');\n      last_value = current_value;\n    }\n    else {\n      console.log(\"No change\");\n    }\n  });\n};\n\nvar myObject = {someProperty: \"Something\"};\nconsole.monitor(myObject, 'someProperty').every(500, 'ms').for(10, 'seconds').start();\nsetTimeout(function() {myObject.someProperty = \"Changed value\"}, 3000);\n```\n\n### Execute expensive operations asynchronously\nA common trick in order to keep the UI responsive while executing expensive operations\nis to split up the parts of the operation into smaller subtasks that can be executed asynchronously using timers.\n\nThe illustrating example from Nicholas C. Zakas' High Performance Javascript (loc. 3215) could be rewritten like this:\n\n```javascript\nfunction saveDocument(id) {\n  var tasks = [openDocument, writeText, closeDocument, updateUI]; // these are the expensive functions\n  return Repeat(function() {\n      var task = tasks.shift();\n      task(id);\n    })\n    .async().until(function() {\n      return tasks.length == 0;\n    }).start.now();        \n}\n```\n\n# Promise support\nThe functions `start()` `now()` `in()` and `wait()` will all return a read-only [Promise](http://en.wikipedia.org/wiki/Futures_and_promises) instance.\n\n- If used with jQuery, it will return an instance of jQuery's [Promise](http://api.jquery.com/Types/#Promise).\n- If used standalone, a [minimalistic](https://github.com/bjoerge/dfrrd.js) implementation of the CommonJS [Promises/A](http://wiki.commonjs.org/wiki/Promises/A) spec will be used.\n\nBasic example:\n\n```javascript\nRepeat(function() { console.log(\"W00t\"); })\n  .every(1, 's')\n  .for(20, 's')\n  .start.now()\n  .then(function() {\n    console.log(\"I'm done w00t'n\");\n  });\n```\n\n## Error handling and promise callbacks\n\n- Any errors thrown in the task function will cause the promise to be rejected with the error object as value\n- The promise's progress listeners be notified after each task invocation with the returned value as parameter\n- When done, the promise will be resolved with an array of the tasks return value for each invocation\n\nThe following example illustrates use of success/progress/error listeners:\n\n```javascript\nvar onSuccess = function(results) {\n  console.log(\"All good\", results);\n};\nvar onFailure = function(exception) {\n  console.error(\"Error\", exception);\n};\nvar onProgress = function(result) {\n  console.log(\"Progress: \", result);\n};\nRepeat(function() {\n        var v = Math.random();\n        if (v > 0.8) throw new Error(\"Ouch!\");\n        return v;\n    })\n  .every(1, 's')\n  .for(10, 's')\n  .start()\n  .then(onSuccess, onFailure, onProgress);\n```\n\nIf used standalone or with jQuery, the promise object also provides more convenient `progress` and `fail` functions for adding callbacks in separate steps.\nAdditionaly, there's also an `always` method to add callback functions for whenever the promise is either resolved or rejected.\n\nThe above example using the jQuery or standalone version could be written like this:\n\n```javascript\nvar repeat = Repeat(function() {\n        var v = Math.random();\n        if (v > 0.8) throw new Error(\"Ouch!\");\n        return v;\n    })\n  .every(1, 's')\n  .for(5, 's')\n  .start();\n\nrepeat.then(function() { console.log('Resolved!'); });\nrepeat.fail(function() { console.log('Rejected!'); });\nrepeat.always(function() { console.log('Done! (either resolved or rejected)'); });\n```\n\n## Compatibility notes\n\n- If you are targeting older browsers, you probably want to use any of the ECMAScript 5 polyfill libraries\nlisted here: https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-Browser-Polyfills (in particular\n [ddr-ecma5](http://code.google.com/p/ddr-ecma5/), [augmentjs](http://augmentjs.com/) or\n  [es5-shim](https://github.com/kriskowal/es5-shim/))\n\n- Some older browsers and environments (IE 6 - 8) doesn't support using reserved words\nas property names (and may throw an error when referencing functions like \"for\", \"while\" and \"in\"),\nRepeat.js offers alternative function names for code targeted for such environments:\n\n  - `for`   => `lasting`\n  - `while` => `during`\n  - `in`    => `wait`\n  - `if`    => `provided`\n\nExample:\n\n```javascript\nRepeat(function() {\n  console.log(\"I'm safe\");\n })\n .every(2, 'sec')\n .lasting(2, 'min')                                   // lasting instead of for\n .during(function() { return Math.random() > .5; })   // during instead of while\n .provided(function() { return Math.random() > .5; }) // provided instead of if\n .wait(5, 'sec');                                     // wait instead of in\n```\n\nAnother less readable (and not recommended) workaround would be to reference these methods using bracket notation:\n\n```javascript\nRepeat(function() { console.log(\"Hello\"); })\n.every(2, 's')\n['for'](2, 'm')\n['if'](function() { return Math.random() > .5; })\n['while'](function() {  return Math.random() > .5; })\n['in'](5, 's');\n```\n\n# License\nCopyright (C) 2012 Bjørge Næss\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","_id":"repeat@0.0.3","dist":{"shasum":"de96851e060638369446cbdfe587cbd49d08aa45","tarball":"https://registry.npmjs.org/repeat/-/repeat-0.0.3.tgz","integrity":"sha512-0LXoryMgr9o6RwhD0ronpkj1vYEYOqBACrdo/+bl3236NSj2qQHdYhI1V+x6VWR0yWJoHfqnIk77xy3VSbrbJA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQClJNR7/ho96nw1W8QF/Tg7hqMttuhGxXFW5mu1mJve7AIgULNN487FXbslT6n8PlVtu0+YNFgVMOd7yeuFdoZSKTQ="}]},"maintainers":[{"name":"bjoerge","email":"bjoerge@gmail.com"}],"directories":{}},"0.0.4":{"name":"repeat","version":"0.0.4","description":"Repeat.js is a javascript library that makes working with repeated actions pure joy by removing the need for setTimeout/setInterval and somewhat error prone timer references","homepage":"https://github.com/bjoerge/repeat.js","author":{"name":"Bjørge Næss","email":"bjoerge@gmail.com"},"keywords":["Repetition","Repeat","Timed","Timer","setInterval","setTimeout","clearTimeout","asyncronous","promise","deferred"],"dependencies":{"dfrrd":"latest"},"devDependencies":{"mocha":"latest","expect.js":"latest","jquery":"git://github.com/bjoerge/jquery-node.git#v1.8.0","jsdom":"latest","coffee-script":"latest","moment":"latest","sinon":"latest","jshint":"latest","node-minify":"latest"},"scripts":{"test":"make test","test-browser":"./node_modules/.bin/browserify -r expect.js -o tmp/browser.js -e extra/browser.coffee;coffee -o ./tmp -c ./test;open test/browser.html"},"main":"index.js","repository":{"type":"git","url":"https://github.com/bjoerge/repeat.js.git"},"bugs":{"url":"https://github.com/bjoerge/repeat.js/issues"},"licenses":[{"type":"MIT"}],"readme":"<pre>\n ____                                     __\n/\\  _`\\                                  /\\ \\__       __\n\\ \\ \\L\\ \\     __   _____      __     __  \\ \\ ,_\\     /\\_\\    ____\n \\ \\ ,  /   /'__`\\/\\ '__`\\  /'__`\\ /'__`\\ \\ \\ \\/     \\/\\ \\  /',__\\\n  \\ \\ \\\\ \\ /\\  __/\\ \\ \\L\\ \\/\\  __//\\ \\L\\.\\_\\ \\ \\_  __ \\ \\ \\/\\__, `\\\n   \\ \\_\\ \\_\\ \\____\\\\ \\ ,__/\\ \\____\\ \\__/.\\_\\\\ \\__\\/\\_\\_\\ \\ \\/\\____/\n    \\/_/\\/ /\\/____/ \\ \\ \\/  \\/____/\\/__/\\/_/ \\/__/\\/_/\\ \\_\\ \\/___/\n                     \\ \\_\\                           \\ \\____/\n                      \\/_/                            \\/___/\n\nTimed actions in JavaScript simplified\n</pre>\n\n# Summary\nRepeat.js is a tiny (< 2kb minified and gzipped) javascript library for timing function calls.\n\n- It abstracts away the need for dealing with setTimeout and setInterval, and the somewhat error prone timer and interval IDs\n\n- It provides an simple, intuitive and flexible chained api.\n\n- It is ideal for polling, performing asynchronous updates, doing timed UI updates or executing expensive tasks asynchronously .\n\n- It can be used standalone or with jQuery.\n\n- It is built on top of a Deferred/promise implemetation for even greater flexibility\n\n- It is tested in IE 7-9, Firefox 10, Chrome 16, Safari 5.1 and Opera 11.61.\n\n## Examples\n\n### Basic example\n```javascript\nfunction sayHello() {\n  console.log(\"Hello world!\");\n};\n\nRepeat(sayHello).every(500, 'ms').for(2, 'minutes').start.in(5, 'sec');\n// -> Now wait for 5 seconds and keep a watchful eye on the javascript console\n```\n\n### Live display of relative time with jQuery and moment.js\n\n```javascript\njQuery(function() {\n  (function mockDOM() { // This is just for creating some example DOM elements\n    var ul = jQuery(\"<ul></ul>\"), now = (new Date().getTime()), elem_count = 100;\n    while (elem_count--) {;\n      ul.append(jQuery('<li class=\"live-time\" data-timestamp=\"'+\n         (now+(Math.random()*100000)*(Math.random() > 0.5 ? -1 : 1)) +\n        '\"></li>'))\n    }\n    ul.appendTo(jQuery(\"body\")); \n  }());\n\n  var elems = jQuery(\".live-time\");\n  Repeat(function() {\n    elems.each(function(i, elem) {\n      elem = jQuery(elem);\n      var time = moment(elem.data(\"timestamp\"));\n      elem.html('Displaying '+ time.format(\"dddd, MMMM Do YYYY, h:mm:ss a\") +' as \"<b>'+ time.fromNow()+'</b>\"');\n    });\n  }).every(1000, 'ms').start.now();\n});\n```\n\n### Asynchronous polling with jQuery \n\nPolling a server every second, but wait for the request to complete before proceeding\n\n```javascript\n\nRepeat(function(done) {\n         jQuery.ajax({\n           url: 'http://www.example.com',\n           success: function(data) {console.log(data);},\n           complete: function() {\n             done(); // will wait for this to be called before continuing\n           }\n         });\n       })\n       .every(1000, 'ms')\n       .for(2, 'minutes')\n       .start.in(3, 'secs');\n```\n\n### Monitoring changes in an objects' state with console.monitor\n\nAdd a function to the console object, that allows for monitoring a property of any object.\n\n```javascript\nconsole.monitor = function(object, property) {\n  var last_value = object[property];\n  return Repeat(function() {\n    var current_value = object[property];\n    if (last_value !== current_value) {\n      console.log('Property changed from \"'+last_value+'\" to \"'+current_value+'\"!');\n      last_value = current_value;\n    }\n    else {\n      console.log(\"No change\");\n    }\n  });\n};\n\nvar myObject = {someProperty: \"Something\"};\nconsole.monitor(myObject, 'someProperty').every(500, 'ms').for(10, 'seconds').start();\nsetTimeout(function() {myObject.someProperty = \"Changed value\"}, 3000);\n```\n\n### Execute expensive operations asynchronously\nA common trick in order to keep the UI responsive while executing expensive operations\nis to split up the parts of the operation into smaller subtasks that can be executed asynchronously using timers.\n\nThe illustrating example from Nicholas C. Zakas' High Performance Javascript (loc. 3215) could be rewritten like this:\n\n```javascript\nfunction saveDocument(id) {\n  var tasks = [openDocument, writeText, closeDocument, updateUI]; // these are the expensive functions\n  return Repeat(function() {\n      var task = tasks.shift();\n      task(id);\n    })\n    .async().until(function() {\n      return tasks.length == 0;\n    }).start.now();        \n}\n```\n\n# Promise support\nThe functions `start()` `now()` `in()` and `wait()` will all return a read-only [Promise](http://en.wikipedia.org/wiki/Futures_and_promises) instance.\n\n- If used with jQuery, it will return an instance of jQuery's [Promise](http://api.jquery.com/Types/#Promise).\n- If used standalone, a [minimalistic](https://github.com/bjoerge/dfrrd.js) implementation of the CommonJS [Promises/A](http://wiki.commonjs.org/wiki/Promises/A) spec will be used.\n\nBasic example:\n\n```javascript\nRepeat(function() { console.log(\"W00t\"); })\n  .every(1, 's')\n  .for(20, 's')\n  .start.now()\n  .then(function() {\n    console.log(\"I'm done w00t'n\");\n  });\n```\n\n## Error handling and promise callbacks\n\n- Any errors thrown in the task function will cause the promise to be rejected with the error object as value\n- The promise's progress listeners be notified after each task invocation with the returned value as parameter\n- When done, the promise will be resolved with an array of the tasks return value for each invocation\n\nThe following example illustrates use of success/progress/error listeners:\n\n```javascript\nvar onSuccess = function(results) {\n  console.log(\"All good\", results);\n};\nvar onFailure = function(exception) {\n  console.error(\"Error\", exception);\n};\nvar onProgress = function(result) {\n  console.log(\"Progress: \", result);\n};\nRepeat(function() {\n        var v = Math.random();\n        if (v > 0.8) throw new Error(\"Ouch!\");\n        return v;\n    })\n  .every(1, 's')\n  .for(10, 's')\n  .start()\n  .then(onSuccess, onFailure, onProgress);\n```\n\nIf used standalone or with jQuery, the promise object also provides more convenient `progress` and `fail` functions for adding callbacks in separate steps.\nAdditionaly, there's also an `always` method to add callback functions for whenever the promise is either resolved or rejected.\n\nThe above example using the jQuery or standalone version could be written like this:\n\n```javascript\nvar repeat = Repeat(function() {\n        var v = Math.random();\n        if (v > 0.8) throw new Error(\"Ouch!\");\n        return v;\n    })\n  .every(1, 's')\n  .for(5, 's')\n  .start();\n\nrepeat.then(function() { console.log('Resolved!'); });\nrepeat.fail(function() { console.log('Rejected!'); });\nrepeat.always(function() { console.log('Done! (either resolved or rejected)'); });\n```\n\n## Compatibility notes\n\n- If you are targeting older browsers, you probably want to use any of the ECMAScript 5 polyfill libraries\nlisted here: https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-Browser-Polyfills (in particular\n [ddr-ecma5](http://code.google.com/p/ddr-ecma5/), [augmentjs](http://augmentjs.com/) or\n  [es5-shim](https://github.com/kriskowal/es5-shim/))\n\n- Some older browsers and environments (IE 6 - 8) doesn't support using reserved words\nas property names (and may throw an error when referencing functions like \"for\", \"while\" and \"in\"),\nRepeat.js offers alternative function names for code targeted for such environments:\n\n  - `for`   => `lasting`\n  - `while` => `during`\n  - `in`    => `wait`\n  - `if`    => `provided`\n\nExample:\n\n```javascript\nRepeat(function() {\n  console.log(\"I'm safe\");\n })\n .every(2, 'sec')\n .lasting(2, 'min')                                   // lasting instead of for\n .during(function() { return Math.random() > .5; })   // during instead of while\n .provided(function() { return Math.random() > .5; }) // provided instead of if\n .wait(5, 'sec');                                     // wait instead of in\n```\n\nAnother less readable (and not recommended) workaround would be to reference these methods using bracket notation:\n\n```javascript\nRepeat(function() { console.log(\"Hello\"); })\n.every(2, 's')\n['for'](2, 'm')\n['if'](function() { return Math.random() > .5; })\n['while'](function() {  return Math.random() > .5; })\n['in'](5, 's');\n```\n\n# License\nCopyright (C) 2012 Bjørge Næss\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","_id":"repeat@0.0.4","dist":{"shasum":"382685667ecb26a3bbaecae7aaffae1c2bb4bda3","tarball":"https://registry.npmjs.org/repeat/-/repeat-0.0.4.tgz","integrity":"sha512-EXxoeoTTIb/BXm4UITMGGvzhPOruuC7zlxaCz2wJjM0C2QJwxy2MwsdALoId2J+jlX4FBWPXaalxUeQncqu3bA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD+3t/EqCSI5VFurzs3Y9u72QTp/K2dQGMCmJuUQJHq/gIhAOUqDumB5oJGaoqBnt76xTogh2tIBqUQfIEcpLaVD6Lw"}]},"maintainers":[{"name":"bjoerge","email":"bjoerge@gmail.com"}],"directories":{}},"0.0.5":{"name":"repeat","version":"0.0.5","description":"Repeat.js is a javascript library that makes working with repeated actions pure joy by removing the need for setTimeout/setInterval and somewhat error prone timer references","homepage":"https://github.com/bjoerge/repeat.js","author":{"name":"Bjørge Næss","email":"bjoerge@gmail.com"},"keywords":["Repetition","Repeat","Timed","Timer","setInterval","setTimeout","clearTimeout","asyncronous","promise","deferred"],"dependencies":{"dfrrd":"latest"},"devDependencies":{"mocha":"latest","expect.js":"latest","jquery":"git://github.com/bjoerge/jquery-node.git#v1.8.0","jsdom":"latest","coffee-script":"latest","moment":"latest","uglify-js":"latest","sinon":"latest","jshint":"latest","node-minify":"latest"},"scripts":{"test":"make test","test-browser":"./node_modules/.bin/browserify -r expect.js -o tmp/browser.js -e extra/browser.coffee;coffee -o ./tmp -c ./test;open test/browser.html"},"main":"index.js","repository":{"type":"git","url":"https://github.com/bjoerge/repeat.js.git"},"bugs":{"url":"https://github.com/bjoerge/repeat.js/issues"},"licenses":[{"type":"MIT"}],"readme":"<pre>\n ____                                     __\n/\\  _`\\                                  /\\ \\__       __\n\\ \\ \\L\\ \\     __   _____      __     __  \\ \\ ,_\\     /\\_\\    ____\n \\ \\ ,  /   /'__`\\/\\ '__`\\  /'__`\\ /'__`\\ \\ \\ \\/     \\/\\ \\  /',__\\\n  \\ \\ \\\\ \\ /\\  __/\\ \\ \\L\\ \\/\\  __//\\ \\L\\.\\_\\ \\ \\_  __ \\ \\ \\/\\__, `\\\n   \\ \\_\\ \\_\\ \\____\\\\ \\ ,__/\\ \\____\\ \\__/.\\_\\\\ \\__\\/\\_\\_\\ \\ \\/\\____/\n    \\/_/\\/ /\\/____/ \\ \\ \\/  \\/____/\\/__/\\/_/ \\/__/\\/_/\\ \\_\\ \\/___/\n                     \\ \\_\\                           \\ \\____/\n                      \\/_/                            \\/___/\n\nTimed actions in JavaScript simplified\n</pre>\n\n[![Build Status](https://secure.travis-ci.org/bjoerge/repeat.js.png)](http://travis-ci.org/bjoerge/repeat.js)\n\n# Summary\nRepeat.js is a tiny (< 2kb minified and gzipped) javascript library for timing function calls.\n\n- It abstracts away the need for dealing with setTimeout and setInterval, and the somewhat error prone timer and interval IDs\n\n- It provides an simple, intuitive and flexible chained api.\n\n- It is ideal for polling, performing asynchronous updates, doing timed UI updates or executing expensive tasks asynchronously .\n\n- It can be used standalone or with jQuery.\n\n- It is built on top of a Deferred/promise implemetation for even greater flexibility\n\n- It is tested in IE 7-9, Firefox 10, Chrome 16, Safari 5.1 and Opera 11.61.\n\n## Examples\n\n### Basic example\n```javascript\nfunction sayHello() {\n  console.log(\"Hello world!\");\n};\n\nRepeat(sayHello).every(500, 'ms').for(2, 'minutes').start.in(5, 'sec');\n// -> Now wait for 5 seconds and keep a watchful eye on the javascript console\n```\n\n### Live display of relative time with jQuery and moment.js\n\n```javascript\njQuery(function() {\n  (function mockDOM() { // This is just for creating some example DOM elements\n    var ul = jQuery(\"<ul></ul>\"), now = (new Date().getTime()), elem_count = 100;\n    while (elem_count--) {;\n      ul.append(jQuery('<li class=\"live-time\" data-timestamp=\"'+\n         (now+(Math.random()*100000)*(Math.random() > 0.5 ? -1 : 1)) +\n        '\"></li>'))\n    }\n    ul.appendTo(jQuery(\"body\")); \n  }());\n\n  var elems = jQuery(\".live-time\");\n  Repeat(function() {\n    elems.each(function(i, elem) {\n      elem = jQuery(elem);\n      var time = moment(elem.data(\"timestamp\"));\n      elem.html('Displaying '+ time.format(\"dddd, MMMM Do YYYY, h:mm:ss a\") +' as \"<b>'+ time.fromNow()+'</b>\"');\n    });\n  }).every(1000, 'ms').start.now();\n});\n```\n\n### Asynchronous polling with jQuery \n\nPolling a server every second, but wait for the request to complete before proceeding\n\n```javascript\n\nRepeat(function(done) {\n         jQuery.ajax({\n           url: 'http://www.example.com',\n           success: function(data) {console.log(data);},\n           complete: function() {\n             done(); // will wait for this to be called before continuing\n           }\n         });\n       })\n       .every(1000, 'ms')\n       .for(2, 'minutes')\n       .start.in(3, 'secs');\n```\n\n### Monitoring changes in an objects' state with console.monitor\n\nAdd a function to the console object, that allows for monitoring a property of any object.\n\n```javascript\nconsole.monitor = function(object, property) {\n  var last_value = object[property];\n  return Repeat(function() {\n    var current_value = object[property];\n    if (last_value !== current_value) {\n      console.log('Property changed from \"'+last_value+'\" to \"'+current_value+'\"!');\n      last_value = current_value;\n    }\n    else {\n      console.log(\"No change\");\n    }\n  });\n};\n\nvar myObject = {someProperty: \"Something\"};\nconsole.monitor(myObject, 'someProperty').every(500, 'ms').for(10, 'seconds').start();\nsetTimeout(function() {myObject.someProperty = \"Changed value\"}, 3000);\n```\n\n### Execute expensive operations asynchronously\nA common trick in order to keep the UI responsive while executing expensive operations\nis to split up the parts of the operation into smaller subtasks that can be executed asynchronously using timers.\n\nThe illustrating example from Nicholas C. Zakas' High Performance Javascript (loc. 3215) could be rewritten like this:\n\n```javascript\nfunction saveDocument(id) {\n  var tasks = [openDocument, writeText, closeDocument, updateUI]; // these are the expensive functions\n  return Repeat(function() {\n      var task = tasks.shift();\n      task(id);\n    })\n    .async().until(function() {\n      return tasks.length == 0;\n    }).start.now();        \n}\n```\n\n# Promise support\nThe functions `start()` `now()` `in()` and `wait()` will all return a read-only [Promise](http://en.wikipedia.org/wiki/Futures_and_promises) instance.\n\n- If used with jQuery, it will return an instance of jQuery's [Promise](http://api.jquery.com/Types/#Promise).\n- If used standalone, a [minimalistic](https://github.com/bjoerge/dfrrd.js) implementation of the CommonJS [Promises/A](http://wiki.commonjs.org/wiki/Promises/A) spec will be used.\n\nBasic example:\n\n```javascript\nRepeat(function() { console.log(\"W00t\"); })\n  .every(1, 's')\n  .for(20, 's')\n  .start.now()\n  .then(function() {\n    console.log(\"I'm done w00t'n\");\n  });\n```\n\n## Error handling and promise callbacks\n\n- Any errors thrown in the task function will cause the promise to be rejected with the error object as value\n- The promise's progress listeners be notified after each task invocation with the returned value as parameter\n- When done, the promise will be resolved with an array of the tasks return value for each invocation\n\nThe following example illustrates use of success/progress/error listeners:\n\n```javascript\nvar onSuccess = function(results) {\n  console.log(\"All good\", results);\n};\nvar onFailure = function(exception) {\n  console.error(\"Error\", exception);\n};\nvar onProgress = function(result) {\n  console.log(\"Progress: \", result);\n};\nRepeat(function() {\n        var v = Math.random();\n        if (v > 0.8) throw new Error(\"Ouch!\");\n        return v;\n    })\n  .every(1, 's')\n  .for(10, 's')\n  .start()\n  .then(onSuccess, onFailure, onProgress);\n```\n\nIf used standalone or with jQuery, the promise object also provides more convenient `progress` and `fail` functions for adding callbacks in separate steps.\nAdditionaly, there's also an `always` method to add callback functions for whenever the promise is either resolved or rejected.\n\nThe above example using the jQuery or standalone version could be written like this:\n\n```javascript\nvar repeat = Repeat(function() {\n        var v = Math.random();\n        if (v > 0.8) throw new Error(\"Ouch!\");\n        return v;\n    })\n  .every(1, 's')\n  .for(5, 's')\n  .start();\n\nrepeat.then(function() { console.log('Resolved!'); });\nrepeat.fail(function() { console.log('Rejected!'); });\nrepeat.always(function() { console.log('Done! (either resolved or rejected)'); });\n```\n\n## Compatibility notes\n\n- If you are targeting older browsers, you probably want to use any of the ECMAScript 5 polyfill libraries\nlisted here: https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-Browser-Polyfills (in particular\n [ddr-ecma5](http://code.google.com/p/ddr-ecma5/), [augmentjs](http://augmentjs.com/) or\n  [es5-shim](https://github.com/kriskowal/es5-shim/))\n\n- Some older browsers and environments (IE 6 - 8) doesn't support using reserved words\nas property names (and may throw an error when referencing functions like \"for\", \"while\" and \"in\"),\nRepeat.js offers alternative function names for code targeted for such environments:\n\n  - `for`   => `lasting`\n  - `while` => `during`\n  - `in`    => `wait`\n  - `if`    => `provided`\n\nExample:\n\n```javascript\nRepeat(function() {\n  console.log(\"I'm safe\");\n })\n .every(2, 'sec')\n .lasting(2, 'min')                                   // lasting instead of for\n .during(function() { return Math.random() > .5; })   // during instead of while\n .provided(function() { return Math.random() > .5; }) // provided instead of if\n .wait(5, 'sec');                                     // wait instead of in\n```\n\nAnother less readable (and not recommended) workaround would be to reference these methods using bracket notation:\n\n```javascript\nRepeat(function() { console.log(\"Hello\"); })\n.every(2, 's')\n['for'](2, 'm')\n['if'](function() { return Math.random() > .5; })\n['while'](function() {  return Math.random() > .5; })\n['in'](5, 's');\n```\n\n# License\nCopyright (C) 2012 Bjørge Næss\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","_id":"repeat@0.0.5","dist":{"shasum":"4a2573a0e8ece0a6d1b2eab8efd7247437498e9f","tarball":"https://registry.npmjs.org/repeat/-/repeat-0.0.5.tgz","integrity":"sha512-ztAj9/NLASpXU8jC+/bJFI90tg4pCT09xDe3Zt3O/P7XoWMqnuOzjkZ7U+o/DriFJKcTOr1PGv7HLYGa8BE9Fw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC+jHH9gqqLwRW7IAuGgDPGhgeoVpyQDFJXzJfJ/uWqYwIgIQVsL22zbIFUwr7yZ4KYrk8arOJXjmjLLICorUsblWU="}]},"_npmVersion":"1.1.62","_npmUser":{"name":"bjoerge","email":"bjoerge@gmail.com"},"maintainers":[{"name":"bjoerge","email":"bjoerge@gmail.com"}],"directories":{}},"0.0.6":{"name":"repeat","version":"0.0.6","description":"Repeat.js is a javascript library that makes working with repeated actions pure joy by removing the need for setTimeout/setInterval and somewhat error prone timer references","homepage":"https://github.com/bjoerge/repeat.js","author":{"name":"Bjørge Næss","email":"bjoerge@gmail.com"},"keywords":["Repetition","Repeat","Timed","Timer","setInterval","setTimeout","clearTimeout","asyncronous","promise","deferred"],"dependencies":{"dfrrd":"latest"},"devDependencies":{"mocha":"latest","expect.js":"latest","jquery":"git://github.com/bjoerge/jquery-node.git#v1.8.0","jsdom":"latest","coffee-script":"latest","moment":"latest","uglify-js":"latest","sinon":"latest","jshint":"latest","node-minify":"latest"},"scripts":{"test":"make test","test-browser":"./node_modules/.bin/browserify -r expect.js -o tmp/browser.js -e extra/browser.coffee;coffee -o ./tmp -c ./test;open test/browser.html"},"main":"index.js","repository":{"type":"git","url":"https://github.com/bjoerge/repeat.js.git"},"bugs":{"url":"https://github.com/bjoerge/repeat.js/issues"},"licenses":[{"type":"MIT"}],"readme":"<pre>\n ____                                     __\n/\\  _`\\                                  /\\ \\__       __\n\\ \\ \\L\\ \\     __   _____      __     __  \\ \\ ,_\\     /\\_\\    ____\n \\ \\ ,  /   /'__`\\/\\ '__`\\  /'__`\\ /'__`\\ \\ \\ \\/     \\/\\ \\  /',__\\\n  \\ \\ \\\\ \\ /\\  __/\\ \\ \\L\\ \\/\\  __//\\ \\L\\.\\_\\ \\ \\_  __ \\ \\ \\/\\__, `\\\n   \\ \\_\\ \\_\\ \\____\\\\ \\ ,__/\\ \\____\\ \\__/.\\_\\\\ \\__\\/\\_\\_\\ \\ \\/\\____/\n    \\/_/\\/ /\\/____/ \\ \\ \\/  \\/____/\\/__/\\/_/ \\/__/\\/_/\\ \\_\\ \\/___/\n                     \\ \\_\\                           \\ \\____/\n                      \\/_/                            \\/___/\n\nTimed actions in JavaScript simplified\n</pre>\n\n[![Build Status](https://secure.travis-ci.org/bjoerge/repeat.js.png)](http://travis-ci.org/bjoerge/repeat.js)\n\n# Summary\nRepeat.js is a tiny (< 2kb minified and gzipped) javascript library for timing function calls.\n\n- It abstracts away the need for dealing with setTimeout and setInterval, and the somewhat error prone timer and interval IDs\n\n- It provides an simple, intuitive and flexible chained api.\n\n- It is ideal for polling, performing asynchronous updates, doing timed UI updates or executing expensive tasks asynchronously .\n\n- It can be used standalone or with jQuery.\n\n- It is built on top of a Deferred/promise implemetation for even greater flexibility\n\n- It is tested in IE 7-9, Firefox 10, Chrome 16, Safari 5.1 and Opera 11.61.\n\n## Examples\n\n### Basic example\n```javascript\nfunction sayHello() {\n  console.log(\"Hello world!\");\n};\n\nRepeat(sayHello).every(500, 'ms').for(2, 'minutes').start.in(5, 'sec');\n// -> Now wait for 5 seconds and keep a watchful eye on the javascript console\n```\n\n### Live display of relative time with jQuery and moment.js\n\n```javascript\njQuery(function() {\n  (function mockDOM() { // This is just for creating some example DOM elements\n    var ul = jQuery(\"<ul></ul>\"), now = (new Date().getTime()), elem_count = 100;\n    while (elem_count--) {;\n      ul.append(jQuery('<li class=\"live-time\" data-timestamp=\"'+\n         (now+(Math.random()*100000)*(Math.random() > 0.5 ? -1 : 1)) +\n        '\"></li>'))\n    }\n    ul.appendTo(jQuery(\"body\")); \n  }());\n\n  var elems = jQuery(\".live-time\");\n  Repeat(function() {\n    elems.each(function(i, elem) {\n      elem = jQuery(elem);\n      var time = moment(elem.data(\"timestamp\"));\n      elem.html('Displaying '+ time.format(\"dddd, MMMM Do YYYY, h:mm:ss a\") +' as \"<b>'+ time.fromNow()+'</b>\"');\n    });\n  }).every(1000, 'ms').start.now();\n});\n```\n\n### Asynchronous polling with jQuery \n\nPolling a server every second, but wait for the request to complete before proceeding\n\n```javascript\n\nRepeat(function(done) {\n         jQuery.ajax({\n           url: 'http://www.example.com',\n           success: function(data) {console.log(data);},\n           complete: function() {\n             done(); // will wait for this to be called before continuing\n           }\n         });\n       })\n       .every(1000, 'ms')\n       .for(2, 'minutes')\n       .start.in(3, 'secs');\n```\n\n### Monitoring changes in an objects' state with console.monitor\n\nAdd a function to the console object, that allows for monitoring a property of any object.\n\n```javascript\nconsole.monitor = function(object, property) {\n  var last_value = object[property];\n  return Repeat(function() {\n    var current_value = object[property];\n    if (last_value !== current_value) {\n      console.log('Property changed from \"'+last_value+'\" to \"'+current_value+'\"!');\n      last_value = current_value;\n    }\n    else {\n      console.log(\"No change\");\n    }\n  });\n};\n\nvar myObject = {someProperty: \"Something\"};\nconsole.monitor(myObject, 'someProperty').every(500, 'ms').for(10, 'seconds').start();\nsetTimeout(function() {myObject.someProperty = \"Changed value\"}, 3000);\n```\n\n### Execute expensive operations asynchronously\nA common trick in order to keep the UI responsive while executing expensive operations\nis to split up the parts of the operation into smaller subtasks that can be executed asynchronously using timers.\n\nThe illustrating example from Nicholas C. Zakas' High Performance Javascript (loc. 3215) could be rewritten like this:\n\n```javascript\nfunction saveDocument(id) {\n  var tasks = [openDocument, writeText, closeDocument, updateUI]; // these are the expensive functions\n  return Repeat(function() {\n      var task = tasks.shift();\n      task(id);\n    })\n    .async().until(function() {\n      return tasks.length == 0;\n    }).start.now();        \n}\n```\n\n# Promise support\nThe functions `start()` `now()` `in()` and `wait()` will all return a read-only [Promise](http://en.wikipedia.org/wiki/Futures_and_promises) instance.\n\n- If used with jQuery, it will return an instance of jQuery's [Promise](http://api.jquery.com/Types/#Promise).\n- If used standalone, a [minimalistic](https://github.com/bjoerge/dfrrd.js) implementation of the CommonJS [Promises/A](http://wiki.commonjs.org/wiki/Promises/A) spec will be used.\n\nBasic example:\n\n```javascript\nRepeat(function() { console.log(\"W00t\"); })\n  .every(1, 's')\n  .for(20, 's')\n  .start.now()\n  .then(function() {\n    console.log(\"I'm done w00t'n\");\n  });\n```\n\n## Error handling and promise callbacks\n\n- Any errors thrown in the task function will cause the promise to be rejected with the error object as value\n- The promise's progress listeners be notified after each task invocation with the returned value as parameter\n- When done, the promise will be resolved with an array of the tasks return value for each invocation\n\nThe following example illustrates use of success/progress/error listeners:\n\n```javascript\nvar onSuccess = function(results) {\n  console.log(\"All good\", results);\n};\nvar onFailure = function(exception) {\n  console.error(\"Error\", exception);\n};\nvar onProgress = function(result) {\n  console.log(\"Progress: \", result);\n};\nRepeat(function() {\n        var v = Math.random();\n        if (v > 0.8) throw new Error(\"Ouch!\");\n        return v;\n    })\n  .every(1, 's')\n  .for(10, 's')\n  .start()\n  .then(onSuccess, onFailure, onProgress);\n```\n\nIf used standalone or with jQuery, the promise object also provides more convenient `progress` and `fail` functions for adding callbacks in separate steps.\nAdditionaly, there's also an `always` method to add callback functions for whenever the promise is either resolved or rejected.\n\nThe above example using the jQuery or standalone version could be written like this:\n\n```javascript\nvar repeat = Repeat(function() {\n        var v = Math.random();\n        if (v > 0.8) throw new Error(\"Ouch!\");\n        return v;\n    })\n  .every(1, 's')\n  .for(5, 's')\n  .start();\n\nrepeat.then(function() { console.log('Resolved!'); });\nrepeat.fail(function() { console.log('Rejected!'); });\nrepeat.always(function() { console.log('Done! (either resolved or rejected)'); });\n```\n\n## Compatibility notes\n\n- If you are targeting older browsers, you probably want to use any of the ECMAScript 5 polyfill libraries\nlisted here: https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-Browser-Polyfills (in particular\n [ddr-ecma5](http://code.google.com/p/ddr-ecma5/), [augmentjs](http://augmentjs.com/) or\n  [es5-shim](https://github.com/kriskowal/es5-shim/))\n\n- Some older browsers and environments (IE 6 - 8) doesn't support using reserved words\nas property names (and may throw an error when referencing functions like \"for\", \"while\" and \"in\"),\nRepeat.js offers alternative function names for code targeted for such environments:\n\n  - `for`   => `lasting`\n  - `while` => `during`\n  - `in`    => `wait`\n  - `if`    => `provided`\n\nExample:\n\n```javascript\nRepeat(function() {\n  console.log(\"I'm safe\");\n })\n .every(2, 'sec')\n .lasting(2, 'min')                                   // lasting instead of for\n .during(function() { return Math.random() > .5; })   // during instead of while\n .provided(function() { return Math.random() > .5; }) // provided instead of if\n .wait(5, 'sec');                                     // wait instead of in\n```\n\nAnother less readable (and not recommended) workaround would be to reference these methods using bracket notation:\n\n```javascript\nRepeat(function() { console.log(\"Hello\"); })\n.every(2, 's')\n['for'](2, 'm')\n['if'](function() { return Math.random() > .5; })\n['while'](function() {  return Math.random() > .5; })\n['in'](5, 's');\n```\n\n# License\nCopyright (C) 2012 Bjørge Næss\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","_id":"repeat@0.0.6","dist":{"shasum":"6c9d8133eb8ceaf8e380f06c69b51417b7cb0e8d","tarball":"https://registry.npmjs.org/repeat/-/repeat-0.0.6.tgz","integrity":"sha512-aDzIjjJfg4ntGaMJXOasXV6RbMXesq498tu7r3O9Hz9u+vjmbcx4Xc/NPIhdX77rwF2cj5s1IkToB0pct95O/w==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHC3gq6n2XhkuKtotBYPluObV61LbEeXZrKH567PltF3AiAYktvXr9yTK4QtLUp+MUzCtNWQh+ndWgqUMhL12k1HIQ=="}]},"_npmVersion":"1.1.62","_npmUser":{"name":"bjoerge","email":"bjoerge@gmail.com"},"maintainers":[{"name":"bjoerge","email":"bjoerge@gmail.com"}],"directories":{}},"1.0.0":{"name":"repeat","version":"1.0.0","description":"create repeating task chains","main":"dist/src","scripts":{"test":"ava dist/test --verbose","build":"tsc"},"author":{"name":"detach"},"license":"MIT","keywords":["task","repeating","chain","tasks","scheduler","loop","repeat"],"repository":{"type":"git","url":"git+https://github.com/117/repeat.git"},"bugs":{"url":"https://github.com/117/repeat/issues"},"homepage":"https://github.com/117/repeat#readme","dependencies":{},"devDependencies":{},"gitHead":"4e7b713f0486ca9e42eef49accd0023e30ac7e95","_id":"repeat@1.0.0","_npmVersion":"6.4.1","_nodeVersion":"10.15.1","_npmUser":{"name":"detach","email":"infinite4457234@gmail.com"},"dist":{"integrity":"sha512-TPZwpWLg9oUhfIa/YPrHbnEswawScNeIbP2/fHOleCak7xh4s8BWqOfM2gzHcm8VHh0BKgotNAqGyWhfZJag2Q==","shasum":"526296270720543058ace1b6ad7ed8719de48133","tarball":"https://registry.npmjs.org/repeat/-/repeat-1.0.0.tgz","fileCount":10,"unpackedSize":8057,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJciYv+CRA9TVsSAnZWagAAQJIQAIVZgWKnE5uiRTOXP0q8\n8Rmh+P2jgJ8HAOARmsARbT06wXELAJQV4ayuwQGvaKU/f1t44mJb+x8EJDbt\nfJcQWgQCFWMwbxC3MxcvT6jQgzEJ7yAOJ35tTidIDFjlVxaioMPWa24SIzE+\nNggbpuZcfET032fwdbwiZmottuEpKOcF4zPNTjZeMITuzVefLPtezns3f3Yp\nf0aiRYq8IQoPnf+6KFJ6/Q2Sp5DQWShepB78GH4iswR8ppy+NdnF7iGfKXca\neRMp2ncSosN9IejCVSxAs7M3KMaqBdd436Cr9SDYzqMevWZnQbjse+RjO25W\nxUU7ch3xJXWwP4ACnJD3v4RfnjxfSuEnXWZBDjVGNW7luFaWBDs711dkaBpz\nVblZIQxNSv8u1DMSk+MToSbFIkMIYp3klIsBs2okud2RR/adr+0oIZVXpTsE\ncndWzjLcRPogYsOWy+spPLZ40xssmlAUbuVRD9hV9Of9DDexVrs7GtP/8CZb\nrvTetdWN2eFjG6bAByqzxc9FyYibIkv6CDHcc85VwNRN9W5jAVCBOVQyZdnF\npo46fi2c4BQazaYBFdtzKJPo2L/qZGHYFjutpoyV9LyTnadOtrubWPgOKRsI\nRV+fybtLPPlggzwr0LwKfdGaxKnTtp1Us1LgwMG1LNc3+dUDiJP5QNK5YZHK\nDup8\r\n=77jV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCQd20X/8of6oaCWQRB0iKCi5VGJ8tCKaJMCRiWCb56lQIhAKqAyz903fhzseOHVLhAuh08JYpeipTeqQUmn+/MUivS"}]},"maintainers":[{"email":"infinite4457234@gmail.com","name":"detach"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/repeat_1.0.0_1552518141573_0.7847316605962926"},"_hasShrinkwrap":false},"1.0.1":{"name":"repeat","version":"1.0.1","description":"create repeating task chains","main":"dist/src","scripts":{"test":"ava dist/test --verbose","build":"tsc"},"author":{"name":"detach"},"license":"MIT","keywords":["task","repeating","chain","tasks","scheduler","loop","repeat"],"repository":{"type":"git","url":"git+https://github.com/117/repeat.git"},"bugs":{"url":"https://github.com/117/repeat/issues"},"homepage":"https://github.com/117/repeat#readme","dependencies":{},"devDependencies":{},"gitHead":"a2bcac4792e250a947b4aee48c024a7803fd962f","_id":"repeat@1.0.1","_npmVersion":"6.4.1","_nodeVersion":"10.15.1","_npmUser":{"name":"detach","email":"infinite4457234@gmail.com"},"dist":{"integrity":"sha512-htVjtyZrjowjNTFsi93OwACWaECLLVrsy9WEiZS8rTr/WE1Fd5KWnCgeHzrpsNMsQXXpFGObdt3qMLZaeAO8cA==","shasum":"8be2e16aceb784106de6c4c8485e5b24ff135e6a","tarball":"https://registry.npmjs.org/repeat/-/repeat-1.0.1.tgz","fileCount":10,"unpackedSize":8053,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJciYxoCRA9TVsSAnZWagAAEnAP/0r1h8bLpZw0ba4aBCha\nl0jj+Wx/zAS/5Qct/Wx/yI8tlJ/CPh1GK4I3v48+BkcjG2d2SZOnVpOSTFgV\nVCxhRD9EXQ4NZc0VScSskfLab0FGComauU5eUhePMGUnbiklyO6I7muh5+Cj\n7LdPRafSb+emH1Igm48C6mKQaT2NDlIHCZkP4uBUWbj+a6h0Q3mSVbC4T4S6\nDgbHg7JK8mbsUURxPnw2ZqZxo2kKqYbiRciju+xcXjUbUqooQfGIFnh1FGVS\nquBggQxQziBFtwZ8u8/Ou+8YZD/Upltu+uU2eZgrScHoniHcoGIY5Qmrdevd\n0cr8dwtYIcKEHLLyV2s5YY+jwBJty9KcmSC53JeA/wFgNpKvPYRsBkCRasw6\nnbYi/sRcOB1PC82VM7dykiEDOxEmq7H11V8+0Ow2TXurbwZ843mryVIHuHWz\nRri5qKsF0184xG6TfTcSxRmQo4R4a2Etsz7fbBJrGtpm0b7NGOjV6zOA3T44\nVXOJVI5/3+aO1dS0c2W32dUJ0EgS1cKzLxBalcZh6tmmhDGx6WDpjeRKEk9k\natX8U+wOqpMgc/y7NrPknSiP1cUTlrMbF5FdTC0aRe9Y3jZ80jMlfi9EC1YH\nefUZZuoBIkBgNFjY69b+8qIBCfwmWgpDYGHv7mSnPd9E7RVEVAx3N1j1BlXF\nFTfT\r\n=Yf5o\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDa5xexRDPXkMXwch+Bqbl0ZMuOHzYwxZwuwi4veoSIuAiEAmaFg87qf1IAs1fZDgKojRdN4BhKUgMdqH0pfVYkijOY="}]},"maintainers":[{"email":"infinite4457234@gmail.com","name":"detach"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/repeat_1.0.1_1552518247761_0.3324787068399737"},"_hasShrinkwrap":false},"1.0.2":{"name":"repeat","version":"1.0.2","description":"create repeating task chains","main":"dist/src","scripts":{"test":"ava dist/test --verbose","build":"tsc"},"author":{"name":"detach"},"license":"MIT","keywords":["task","repeating","chain","tasks","scheduler","loop","repeat"],"repository":{"type":"git","url":"git+https://github.com/117/repeat.git"},"bugs":{"url":"https://github.com/117/repeat/issues"},"homepage":"https://github.com/117/repeat#readme","dependencies":{},"devDependencies":{},"gitHead":"a2bcac4792e250a947b4aee48c024a7803fd962f","_id":"repeat@1.0.2","_npmVersion":"6.4.1","_nodeVersion":"10.15.1","_npmUser":{"name":"detach","email":"infinite4457234@gmail.com"},"dist":{"integrity":"sha512-vAbVyK3+a017v+HQYFuRwKABLuLiosdTVbNIfZNlR+holbMevcEqEsVm4hnxt+ureAVomecvVmaAEgxL10Ok9Q==","shasum":"c6b73ba5b5839cc5e8078d236ef06806501d0cb0","tarball":"https://registry.npmjs.org/repeat/-/repeat-1.0.2.tgz","fileCount":10,"unpackedSize":8035,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJciY0mCRA9TVsSAnZWagAASSUP/0UXC6qh/ZtFHa2MxkJC\nFZWBtc5MGnJZ50HV7/wx5O8+D4ZankhpJ3P5r04dPSxSez3ObZU6wbNJlOJb\nih85I1/F9K2zKhDHblInp4npAmIV068iWt6zS/DY610ws0x3dUIuQFC3QOYF\n6mcYaxTYig5Zw59T1vpXy2ZpxYUB9s+1l5AoHdGPNlHRMU7QxGStBE5Ak8Dw\nPsrCGqe+TRVUHSdMBTyIxrEJvbT+qmFKX09iojIEtycfwFt6kOaW31kc4HeN\nuZER0IDSmlNIH2K6kIXkkRMfxnoqcxpS0izsYaZ+TWSvQwOCfOMh1PeGywvZ\n1W7kQSD5L+9HS81VVURMamhgO/hn5LUUmOLEOfdWq0dsxDnDPsAnNBJ9lgPU\nAC55d5yZQrkT6H2ewyF+StEVcqFy3PuNE+l/xF/J8ZqgUJdfDKLdWmGA1Vp9\nmEPM7HkgwRtT6fh8WvvL/cdB/hSEvuyYOWQnZopu0wE5FVJgYralYmlUL646\nIzLJtbCK9kdZcqh8ceviRYae6ZDsAcI2eZfqkRiZbzW/Jnc2vs1ovaFwSzDk\noL34siWPR7Hnx6rNfzwUBLszWyy1bw/v/AKH7nec//fFM7t+QyQ6N2IY4zYp\nEeQADaPqCa5pq5z+w0h077fNuELHSr6LhNK0SzUDpDvoXt5EqzFIIDpXQ/XZ\nSmdC\r\n=IWOR\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDx7gAwfN58TGqEgXvUZatGcSXZ+lCEDsqoKMhKhEooVwIgKRjhuz8nKceSn5BpHO2H6dg3dRXT3EMuP+x32mycX/k="}]},"maintainers":[{"email":"infinite4457234@gmail.com","name":"detach"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/repeat_1.0.2_1552518438458_0.18081981614414544"},"_hasShrinkwrap":false},"1.0.3":{"name":"repeat","version":"1.0.3","description":"create repeating task chains","main":"dist/src","scripts":{"test":"ava dist/test --verbose","build":"tsc"},"author":{"name":"detach"},"license":"MIT","keywords":["task","repeating","chain","tasks","scheduler","loop","repeat"],"repository":{"type":"git","url":"git+https://github.com/117/repeat.git"},"bugs":{"url":"https://github.com/117/repeat/issues"},"homepage":"https://github.com/117/repeat#readme","dependencies":{},"devDependencies":{},"gitHead":"e1792653a77f4c6308637b214e330fb07bfe646b","_id":"repeat@1.0.3","_npmVersion":"6.4.1","_nodeVersion":"10.15.1","_npmUser":{"name":"detach","email":"infinite4457234@gmail.com"},"dist":{"integrity":"sha512-GdTYl4IORt4dJUN2NHQkrJlHdiNNYtfmExbvjKsnWTqQCErmweL6fmlaBwDkmADyJqXJoattQUHURfV1gOwTJg==","shasum":"04b18b497d3ce0d2a0708063dbe89d623dc4f7e1","tarball":"https://registry.npmjs.org/repeat/-/repeat-1.0.3.tgz","fileCount":10,"unpackedSize":8167,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJciY8NCRA9TVsSAnZWagAA9M8P/Al+NUD5JUnW4M1+beKE\nlTVV5PWhn06Jr4SvzRh8GCTIV+CdBs7lIfwQou8cNTLQw87mfI1M4tDg+OkX\ngUroAyAchEl/usTuv7bA2/l0KVjCP2aNNKiR5Pe1VJT5v9sce5aXI2XEfZLL\naovWeBxbqG5qWcg4Wfw8kk22i31S0JCv1CnAq/8MqlgZLtgW8exj+1d28+BU\nEsKDnG9V4d8AJUcQZVhXSjGyoWeVO2emj90mQiySAprLgqACHH8jxAfJEES6\nAPqMGSfssmNfrJDRkYU0cYoMLf8VSOJdnDLt8XmAn0e54xt92ouz1bVZbEru\nSXn0xIV63QsRAFUbe3fvlaRHLeDI/QuYv2abXMm88Le5u+T4mo5XlN1bPYSA\nEjM1BqD8zf50pXRI2cC0zyEH61CawC7BDYMJHqBGzUa90AR9VO0Ri5ujsoBD\nBDilTIZ9X/98DzclgeOXGKcpBP72WfV7Rs7oJS0AuQXwjeAf5IL/vvyeRLoZ\nIiV0QTkb7IRMovIXSGoHCTp82EhR3IimkAjJXFkLaIfFvGCu54VAslX2SNfy\n9f33qGnZPp1mpKib2pKYmH4Q9bRAyRT5YrnQqGQ4aBGdHI+ut24gDjjFFhEQ\noExSoUh+rY9lU6XpfPyuaRKYzjwNpGYKd/kvt9iTrg8GbsbwClvPVcl4C+ep\nL5LM\r\n=ZGyw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDNka2Az/I555J5TnaFt1XWNvieijcGACrqEJHGl4s5qQIhAJaNWrKKhAymJaFnZgKdAEXu9ygNabdrI3wo2/iE8gV/"}]},"maintainers":[{"email":"infinite4457234@gmail.com","name":"detach"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/repeat_1.0.3_1552518924486_0.3706374520540494"},"_hasShrinkwrap":false},"1.1.0":{"name":"repeat","version":"1.1.0","description":"create repeating task chains","main":"dist/src","scripts":{"test":"ava dist/test --verbose","build":"tsc"},"author":{"name":"detach"},"license":"MIT","keywords":["task","repeating","chain","tasks","scheduler","loop","repeat"],"repository":{"type":"git","url":"git+https://github.com/117/repeat.git"},"bugs":{"url":"https://github.com/117/repeat/issues"},"homepage":"https://github.com/117/repeat#readme","dependencies":{"dormant":"^3.0.0"},"devDependencies":{},"gitHead":"61aac788f444b17ea462305e8438e5bc973395ff","_id":"repeat@1.1.0","_npmVersion":"6.4.1","_nodeVersion":"10.15.1","_npmUser":{"name":"detach","email":"infinite4457234@gmail.com"},"dist":{"integrity":"sha512-8sWa1qp5loz1kDtGxC79P9uU8tDKzq26wQupMSf62Jelw/jtkHPSV7vM5lZy9iebGRA0/ldhPZnEKpRosokwRg==","shasum":"4a431e6637690682e631a24f6f30789bc7d03525","tarball":"https://registry.npmjs.org/repeat/-/repeat-1.1.0.tgz","fileCount":16,"unpackedSize":9095,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcjDxbCRA9TVsSAnZWagAAXnAP/3E74Y9kio9LyaVr1zRo\nr5UXZ9emtS0dPzenSEQWDHka7bvnDKqxMGAqWGY3T14an8cojscISjX5zZqE\nKBlPis9CWNiJzh1oZ4QmV6H/rwTIqlLfEisDGejSpaPyA4XCm5LNZeaUXcS1\nMELzsT+r1H1FX74VCbbgw4lRlGwr7hgH3BrWYUIg5rFY/lE1HMZuLNuIcIG9\n4xhheqwvVGugm7ALuweiw8pK3pPHQaRurqOJIJi33EVxjdFQ8hJdtVOQzz4l\nHDnxH4jelmXXTybeR9EVJ7xvJ1+YqqOBdlfRYwEZ0Wq2flnwM4HE+yIH0Vyu\nP1xu9wpai2POjBYquT+liSYX6gFLGtHNj4Px7fXYpBhs1Kb+tm+i6986Bauu\n0GyqHof2CR98sadRvpbtES1wHgQBJ9kEPFUYNnTlKa//qYl9E+/EKcHFuvtQ\nlS9o9Aj4HjELTn06ETaDjTuuy6YeMVe67emnz1fad/S2QlxfL9QNzZAYvDB6\n5LrFBpFiGdjshnKMfq91alJz7s70f/ZEGhvDPODY5OJ5F9j9Cdk8D+6mXOHD\nosCAgBEUE+JQdHxeM8bdEVrb1wEMCdD+G1OkNo26nH/7ViqrgzhAonFwyU5p\nt3jcxdoLn14U0QJeiQ+S8YV1/ojQa5vxA+IY/UKvV1wbPdzQcY6EeG+1y/wx\ni5bS\r\n=y7Zr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDvvDe3O06/dRQ82bnlV8EbuzMfpuQphyx+2amRmWt0JwIgBhUQxEvHYns8jS2dav/avyqDiTlUobMRVi7peCvDbp0="}]},"maintainers":[{"email":"infinite4457234@gmail.com","name":"detach"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/repeat_1.1.0_1552694362354_0.5479405689937589"},"_hasShrinkwrap":false},"1.1.1":{"name":"repeat","version":"1.1.1","description":"create repeating task chains","main":"dist/src","scripts":{"test":"ava dist/test --verbose","build":"tsc"},"author":{"name":"detach"},"license":"MIT","keywords":["task","repeating","chain","tasks","scheduler","loop","repeat"],"repository":{"type":"git","url":"git+https://github.com/117/repeat.git"},"bugs":{"url":"https://github.com/117/repeat/issues"},"homepage":"https://github.com/117/repeat#readme","dependencies":{"dormant":"^3.0.0"},"devDependencies":{},"gitHead":"cd274b8e715bbdd685fa93d0c656e6c4442af0d3","_id":"repeat@1.1.1","_nodeVersion":"10.15.1","_npmVersion":"6.9.0","dist":{"integrity":"sha512-g4NnQJv7X3o+IhroTncyGDK6ZaapC6Ve0YGSbaF3XyYrxUy52ka77UONhb7t2aVn7Jah0FG0Ucd13psYVGPTnQ==","shasum":"a8560fafc378b58bab916cba5f4670856943cb55","tarball":"https://registry.npmjs.org/repeat/-/repeat-1.1.1.tgz","fileCount":16,"unpackedSize":9063,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcjD1YCRA9TVsSAnZWagAANHcP/1f9CC/oEU909KyJf+Rt\nbjJcJFgB+PxvMg2Y6faaaVWhcmZhgQgGT9I0th8qASBjgJPXmo+EmyCSw48W\na4MhnlntdIu3WvWQ+5oIsawv3HeovArVefpb48zXKbCij7azSAzwVTqEJcFh\nMvPukSi0yLGBn+nltNUWee+jDZl5W3UgktvTe4D5DmBPYvKYUZa3rdnjz2vD\nO6wy4ssIdArgybbyqIG6RsUWx6WsGkKCIqGWCgwFiB6a7q0POr/qJtFGkOZr\n2fF1CacqQDWXy/Ayi6rRJvlXwXBN7huFBpz6zpCkfpHoLkIKwwCDwNdKNyS3\nA4Ow3A7GAuvm488YC1vPrkAHQtn+koEj8pChpTO7Lp2uze7Dz2NFFv6+QV9f\nBsbuVvny7Eq7x3/CqU6ibHzVdhd7wZoRw9jzmrtFuETPme4coRr/pd1RcFI3\nO8hLj2QDu6TDmIOCO/4TyJS5tq+0R5ekDHHfBq5vEC9m5SctdsfNEyl097J4\n4TdyU7jqXCQvaGHtPCdTLxstAzfpwUwrTX7lCM6xeVvAjSS7IOk+tGrj2JIT\noSCqVQIpCMtyt3vOMuPAnUH/l+ATpxbH62FOh3BA4TJH1CbDqj+1CsSG595+\nk5q/XtiEmOCINHx03acBUmuNFPJFsSIq5ACuEd2Cn3f+MtoNNYlKFCaB8dND\nFoDk\r\n=wrr3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD1YygvCHjSW9c3srXTQx/PsQV1voqCeL1S7+b7NJ6VDgIhAPdIxiz8qDKIy52HO1l7WOidWLoVz6BJ2TXPkbntHzho"}]},"maintainers":[{"email":"infinite4457234@gmail.com","name":"detach"}],"_npmUser":{"name":"detach","email":"infinite4457234@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/repeat_1.1.1_1552694615765_0.5116609967295804"},"_hasShrinkwrap":false},"1.1.2":{"name":"repeat","version":"1.1.2","description":"create repeating task chains","main":"dist/src","scripts":{"test":"ava dist/test --verbose","build":"tsc"},"author":{"name":"xist"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/xist/repeat.git"},"bugs":{"url":"https://github.com/xist/repeat/issues"},"homepage":"https://github.com/xist/repeat#readme","keywords":["task","repeating","chain","tasks","scheduler","loop","repeat"],"dependencies":{"dormant":"^3.0.0"},"devDependencies":{},"gitHead":"86b33646e504abb71c91494f05537a2d6f1c7a32","_id":"repeat@1.1.2","_nodeVersion":"10.15.1","_npmVersion":"6.9.0","dist":{"integrity":"sha512-XdQm7jz/M/yb8mDgQvxIdB7pdOrL8oN09hMAPc/zgXk65ISCX4SOndE8BvfnopnVUJOSgm+agoFqKL+os2IMjg==","shasum":"9925c84270674623dbfac2e9a807358dcd34f9ef","tarball":"https://registry.npmjs.org/repeat/-/repeat-1.1.2.tgz","fileCount":16,"unpackedSize":9118,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJckIaqCRA9TVsSAnZWagAA+EQP/0/7ll45FDrBevNESZYo\ngZBAYCBkBCb9UNuDKG+I0JvcAQhnXV/PJhijOFKO7iHBeknQdmNQ5EGQdaK7\nBk4JO27IZxQYzsz/ULgtiSqOWFxLMsswnFMu8it5fapvgjP6vD35PqSZW1AO\n+juXAujSrcPTNSFxX8HKIm3j9NZ3thTQYTqLyml4Gg7qdxNEmPQk84moMnXe\ninrOE5d/9fL2nBNzueZKLVdFL3UeAwK6kxEB5uvCj8Yq6DpAsUkCBwzMDG5R\nSAmKyVwa5RPUfIhR3VhbrNeJrAQCEVyhNRaZAbVrp7WSKqAdOwAvLLv7Qcf+\nQW5ti6zBRgQGmqSXnwCw7V1IajWFyq2W6IL62ZQudzAVfFy7QOZ2PmKxN5hp\nKfzo4i/FVSS5GP8E4whN48qkgS0FL4x5wLQt3cyeP6wBjDxRQGhAuJ+mF8oM\nS2KHxnk+8tX9adHLjp4FyE5fGHw0YbxBMbiKhhotoVdQWhDePGncLkK830oZ\nxBuYa5Af04c5e8VAj/s/83cIHEP2Re41Lid39GbgCy1kcvc8jTJ8AEnlm0d6\n+ViBXc3Avovxio12jbWVAJhcqXKn/D1RyOnHeJabREAgGzoFhv7oYCZIMzYI\nMi599sXVO4az4u4LCDXxQpyi+FVrhlA2qQs7658GnTENxaBckrfElyzLrJ7M\nshG8\r\n=/F2t\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDKfKFr3zZEsDhLt1vnaG/rYkOE61qLIVdk0iTEZGn2/wIgb+k9IUoAIzsafFQAalCgR2QQVmmwnuS+6ZhIdxnjZgc="}]},"maintainers":[{"email":"hello@xist.dev","name":"xist"}],"_npmUser":{"name":"xist","email":"hello@xist.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/repeat_1.1.2_1552975529816_0.07427621890705094"},"_hasShrinkwrap":false},"1.1.3":{"name":"repeat","version":"1.1.3","description":"create repeating task chains","main":"dist/src","scripts":{"test":"ava dist/test --verbose","build":"tsc"},"author":{"name":"xist"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/xist/repeat.git"},"bugs":{"url":"https://github.com/xist/repeat/issues"},"homepage":"https://github.com/xist/repeat#readme","keywords":["task","repeating","chain","tasks","scheduler","loop","repeat"],"dependencies":{"dormant":"^3.0.0"},"devDependencies":{},"gitHead":"c1a286a3c5810e05f509d9981664621ab70c823f","_id":"repeat@1.1.3","_nodeVersion":"10.15.1","_npmVersion":"6.9.0","dist":{"integrity":"sha512-Vo28LAfpVnFmwBPVJq8sSPROzYkCNStetZ0M3h91KaRv8s8p85vEw645Pndx3pG4q+SlAkc5IJE6JRT2vaCB1A==","shasum":"fea0c5cea8fe845813c538bc7a65fb1543652a6e","tarball":"https://registry.npmjs.org/repeat/-/repeat-1.1.3.tgz","fileCount":16,"unpackedSize":9209,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcqI3ZCRA9TVsSAnZWagAACiYQAJQ3RlS/7bmEmhgyAiEa\nKrL5XRdUQL5KLc+XnnrBeeFi1u+ZTWjhx5we89F5BGKfxtgx06waf/xSWlOT\naFtXDsrTHE473qg3WQyLDOTwSiuTYuimxQGiAMqdOCor8lpF5DVnhXXVA1ry\nLeGUxMwO7DrPErqytrzZTFyUwYESYl6ijxIcRf9ze0IKUXxc4PwL9eDdwsyb\nhvuc5rmZiM9Kb3diSL1r81yzJAR0EM3gjsK7BbL8BOwGfdHYMLhAR4Do+XIm\ncKq3al6gBncwu6GmnfFyaNkzk8adFeU0C5lXXZvN+zlAd+6UbfbhHxJ2/7Pn\nvFTxFyGN7zorANxxfHcyfbyvenywy4R0bw43aTMQFY9Me3VUyZtQWd8piEwQ\nfSBR4dvX21yaz8ZoXKpu5ZLTFES+FcHET77PocLBgBJFo4ZUocenjxanhliv\nH7DaIUzmS4sInDLgHXWNCb4AKXrhL8eTfapHAf+1y9s05X/bUPlreKIJzpVH\nv2RP9Q9EJWs0chAr6DGm8fuUPIvpSusTsTsBjXmUmRdRtmpUuWxJokRL0hiR\n96XFfMrGJA2MGQAuftVfqpwyC/5cuaTUZvIlYnaSMV13/0ru15sghrBnnKPm\nJ0TdmiVp3+SsZWsFKZr7jC3ZSep2ZsCGRqrWw3HDSp/NYRzaIWAujiVhJpBU\nB5a5\r\n=Al+s\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAx4Z4BHBGNCIbHlfuSfAANDyhWQcLDqbRLoqtOIEbKaAiEA2B28R+d/PtFzi2RaFyAp6xVpmkYR0Yf1QX/JmZ4wGSQ="}]},"maintainers":[{"email":"hello@xist.dev","name":"xist"}],"_npmUser":{"name":"xist","email":"hello@xist.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/repeat_1.1.3_1554550232614_0.8387238046374561"},"_hasShrinkwrap":false},"1.1.4":{"name":"repeat","version":"1.1.4","description":"create repeating task chains","main":"dist/src","scripts":{"test":"ava dist/test --verbose","build":"tsc"},"author":{"name":"xist"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/xist/repeat.git"},"bugs":{"url":"https://github.com/xist/repeat/issues"},"homepage":"https://github.com/xist/repeat#readme","keywords":["task","repeating","chain","tasks","scheduler","loop","repeat"],"dependencies":{"dormant":"^3.0.0"},"devDependencies":{},"gitHead":"a304caac705be96b80c814c68b8daf016e90da1d","_id":"repeat@1.1.4","_nodeVersion":"10.15.1","_npmVersion":"6.9.0","dist":{"integrity":"sha512-N3EnFk1qFzPcUgYkdIYe9CoWJxg3zxWGW4G0WE1FVv9eZQjQ0Bi036lWPS4YANL7AFhtYXdOA2vIyeAP6HtqFg==","shasum":"dc6421d811ef9b76b779d90f81829e4e06c2824b","tarball":"https://registry.npmjs.org/repeat/-/repeat-1.1.4.tgz","fileCount":16,"unpackedSize":8964,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcqJJdCRA9TVsSAnZWagAAMSgP/3IFV/2QaiZyxdGm3t0c\nlL8BokZlH5kKRpGYnQVkwnWSuAPKTjz7RnhU1GxSMWAwiLyj4Xashw6r7QL9\nln5xokwsSSf6B8xXIiBj+N6uFQwURYyERmzBMHYgbXZiBKhaWb1eBGX9kSBC\nJiHxOlZTbqWeR26YCAe7Id9a1GNEZIFS7dT5tmv1DGw7TAuvsnBHLD9Z5Vq2\nFewU/5F/UvUZiq1eCaSPlnigzHxvfIha/0Sce1tful0AKO+3alPFRS9cYGj4\nIveHZ1JzZdKY5CmhLMFT/qNPAKcGjUkpWZMJJndpqxCGdp5gF3REgn6rgQvW\n6phJz/KLkADuW6cNgNHXKfb8/0wwcPbIQoKTwRLeetJyX0gvn5hiA89UWz8m\nq2uOtc9I+V9g2eH/CZjkHVhsCz9YF8tseXzJ/XlYkGya4bwOd62KV5qExQuh\ngC5bAhv4GwxsYFZdkWLw1lPYF9ZAdPnZGcxu/ww7vxVpM6T5qKzmg3+9fH60\n3rOvuVy14OVMQOES7NxwRzV+TdlSgvy+Ui55RgvCRjqE8lAEw5WJHKHOEOXg\nbGbrEO+8fy90zCvHMeM8O8O37CBbQEjO3pGRA1SZPkGTuNDCc1vzdm0Vke6g\nBg1L5RFDntBPyYaoJ05ReqGVCF/CKzrORpx2gxk38c8l2naa3JxCSNxCxf24\nB2Sv\r\n=0xLy\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICdxzCAkod6DliY9LGw+OLfnZW4p82hM5Ho0Lr+Tl4BhAiEAxFPea2VzLUpHkGP4+HWRAIuli0Y42+fq5BzHNMt/oO8="}]},"maintainers":[{"email":"hello@xist.dev","name":"xist"}],"_npmUser":{"name":"xist","email":"hello@xist.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/repeat_1.1.4_1554551388979_0.8147098595715427"},"_hasShrinkwrap":false},"1.2.0":{"name":"repeat","version":"1.2.0","description":"create repeating task chains","main":"dist/src","scripts":{"test":"ava dist/test --verbose","build":"tsc"},"author":{"name":"117"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/117/repeat.git"},"bugs":{"url":"https://github.com/117/repeat/issues"},"homepage":"https://github.com/117/repeat#readme","keywords":["task","repeating","chain","tasks","scheduler","loop","repeat"],"dependencies":{},"devDependencies":{},"gitHead":"5f67bfe9305e4d0a5f182eddaf6edc5a66d7f3d1","_id":"repeat@1.2.0","_nodeVersion":"10.15.1","_npmVersion":"6.10.0","dist":{"integrity":"sha512-3LdEPMV84LJEAD7pv4Rjvpxqd3MKdCjokClYAUz9AlFLLzyWt8rafcAHpX5WvNF5Lw+IFbWXutbf3tQ4YomtRg==","shasum":"5dcec58c7affa8f6556223943c5107513fa8874a","tarball":"https://registry.npmjs.org/repeat/-/repeat-1.2.0.tgz","fileCount":16,"unpackedSize":8859,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdJJiPCRA9TVsSAnZWagAAp6UP/2adip27GmluwuCe3Ugb\ndu7FqfmaM0+N3ZAP88193oicn8v9shB8QVdWR37tPZzHa0hiCXKrgaqbTBar\nDbhBO3gUDOKU+m7E+7W3t6rE5zRSW/tRn1+5htF/vr5rC+esVE1rWaJ0jtwQ\nsIK5KwSw62/+jGeE7+QD12NdbYg0owSYKzyRNHEuqFenwyVsc31OUtFicIiq\nABnVKmh/g+bBwr6ubV1tBHTWUAtbZc7HQfW6y1aw1CGPTkRnsTGV9PIncwBF\nE9i2FtaUmibM1HJ4gg2BbTWd/THnZHxgNOOeqNSCPP3D82jpRxpUMh1V3G++\nhRtEimcp3RibbVGoup6GylquHRXpETx7dX2yf2MbEyeM2xm9DZwYJyxPqV5O\nW0mA0L4hwUTqXKnWjIQf+8ZjEQC8OrPx4xeRHPj71o3qE8zYUT2kFkmTq1UO\nlKfN9v7oPQEGo6m4isNSccDr27dW5R1Dff/ppbEqad338Gqa5sl6QSxEq0Z+\n8LOpcuC37at7q5+YxCcg5AAM3Rz993CUA5NeL8L+gkwNdToDL12ZdX0bweId\n7/x2qdH3L5S1aMp/wOyxwCdiIXAYapwJvsfZ2RTMQ0CZea+5dQEs+j1Afack\nIPRez80fx5+jAdgc+RB+jdkK/2mATw/0OZi0UvlaS2NYKhnOAbn9rb+azkDJ\nmiwe\r\n=yM0t\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCx9v9UjYwLOmrPmI+pIiatqWRWmdTMyeWheQ0cn9Pu2gIhAMoWDsxR75iLdRiFFAL3cxoz7ZHrdbezAJQzDy2TqQjt"}]},"maintainers":[{"email":"hello@xist.dev","name":"xist"}],"_npmUser":{"name":"xist","email":"hello@xist.dev"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/repeat_1.2.0_1562679438727_0.17201183766648276"},"_hasShrinkwrap":false},"2.0.0":{"name":"repeat","version":"2.0.0","description":"create repeating task chains","main":"dist/src/index.js","types":"dist/src/index.d.ts","scripts":{"build":"rimraf dist types && tsc && npm run test","test":"ava dist/test/** --verbose"},"author":{"name":"117"},"license":"ISC","repository":{"type":"git","url":"git+https://github.com/117/repeat.git"},"bugs":{"url":"https://github.com/117/repeat/issues"},"homepage":"https://github.com/117/repeat#readme","keywords":["task","repeating","chain","tasks","scheduler","loop","repeat"],"devDependencies":{"ava":"^3.13.0","rimraf":"^3.0.2"},"gitHead":"11b64c622fb4906319d42ecba43e8a8ec88323cb","_id":"repeat@2.0.0","_nodeVersion":"14.7.0","_npmVersion":"6.14.8","dist":{"integrity":"sha512-L+Iuqn/B8SWOZCPDItBsJ1t3jAGqtPz+gD50LlzME3mci/qtmT9UaWFoDfMWTCOgXfgFj3oR53SSe4VFDWm9Ow==","shasum":"dd6500a36e9dc56e7c6d1659194e65675b56a879","tarball":"https://registry.npmjs.org/repeat/-/repeat-2.0.0.tgz","fileCount":14,"unpackedSize":11115,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfqyyjCRA9TVsSAnZWagAAcu0P/Ajwg5y1PpUNLZScbSr0\nc9pWw022pc8wqU5QscM/CtiQeM3E75aLGrlroyhpgCJ+ySgZuwCr/OY1spHV\neeaw8UE2e7HTjTP7b+YKTlvYWnpghwM+EOPkkucbOP+5Pgv8npXiDkRWuRcN\nBeejdarNe3+YNRMR4bof2DVayffN0Q3DJT5jpJqilPPf6HkRkYYCnuHD5uJy\nUnkfAtuF0Xux3T95mRhI1YqGC2vG5N6SSHDeKQE7EuVJHzDmyeOTzZwQ5GVB\npD5Ee6ETxXbt1/BRoAVMyHIAfLU4Zzfqn53b7LwYmcbqo0HsjKIkRpBSOGA2\nz+MlogC7CW276ObdjpUK1KlGH8KbZE+efdRcnAte5bR4bReBCzrzN5lZ0dkI\nma0xJVkCwjCC/1RaZmu8RcZ4BSmrMv9h2quMTxcctJEIBbQIyg9CXbT3DXxw\nBc/OfrjBYWWw1zu/SSao93ZahPbWXEYu0ENEMgWzceoMqvm7//vHvpEun24S\nOYyNjCCEa89x+08eY+LpJY3BOewjwdBfnzZXoQrlAogub73pCHkvIRT4vn26\n+3XNJ+hB+XtSFyqjZAj908gSseVpn743ctO747Aw34FHvRzntiP7X5agVrRf\nWFgFJJb3kRll6ZHHCgDAij7j8JVpr/TfRGPhJkye4o2TT3GhHXtS4cdiGyGm\nj4FA\r\n=hjzh\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEQvJ6bQGIjOQ+qJKKSGLmsWdf+UBmIfaeib1vxn9pWHAiEA8DWPWteweEDftQKbOsHXlwZxR1yQ7giv/QMPhR/lwKQ="}]},"_npmUser":{"name":"master-chief","email":"7c6fcedd3e8c1b6e7f52391ed9aaa4@gmail.com"},"directories":{},"maintainers":[{"name":"master-chief","email":"7c6fcedd3e8c1b6e7f52391ed9aaa4@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/repeat_2.0.0_1605053603210_0.5056035430762538"},"_hasShrinkwrap":false},"2.0.1":{"name":"repeat","version":"2.0.1","description":"create repeating task chains","main":"dist/src/index.js","types":"dist/src/index.d.ts","scripts":{"build":"rimraf dist types && tsc && npm run test","test":"ava dist/test/** --verbose"},"author":{"name":"117"},"license":"ISC","repository":{"type":"git","url":"git+https://github.com/117/repeat.git"},"bugs":{"url":"https://github.com/117/repeat/issues"},"homepage":"https://github.com/117/repeat#readme","keywords":["task","repeating","chain","tasks","scheduler","loop","repeat"],"devDependencies":{"ava":"^3.13.0","rimraf":"^3.0.2"},"gitHead":"05634a23cabf493e3237feeb98d29ade05670760","_id":"repeat@2.0.1","_nodeVersion":"14.7.0","_npmVersion":"6.14.8","dist":{"integrity":"sha512-zI3sD0AwF64WyttKs/7ZfTmHUhzSBCItehPzid5uKxHvCsYhPRw1r1ljqKzqUhx0+AQ6SsAeZ2Yez9cFIJJw9A==","shasum":"a308fb786c7ca78511faa04ff2303e9a0dcb6420","tarball":"https://registry.npmjs.org/repeat/-/repeat-2.0.1.tgz","fileCount":14,"unpackedSize":11109,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfqy/TCRA9TVsSAnZWagAAD54P/j6fQ3QmHE+nth/TUitr\nJ1P+UVNQOXPaXz7Z8TOGfboA2sbn3rdV1giZe/mIl4kPT3SSDFc0PTDKf1wk\nWfHmKzL0oapKMuULkbS2RyN9zXnJXucAN4Gcd0goZbLTEt4fLlFtsomvqKGs\nm3Py/okjLJA3O5GGXxZ5RvNmUE5Fy/tD4/RMhCY3UctsgKZ+oJzz/9dv3zp2\nuUIAY6/nY3P0Ljk6kWO14NSZ+mo2aL9sAxq6IFQbIx0K97icxt4Qtpwud0F2\nMVFQxBgGt1qOxC1vISx9WDBE01AmcX/5DgCOOCY9hMMdkCY2i0Q+zXWu0z8S\nKV9j7SmMU3LzwO9pjR4WOpYL0lyq9xzxIixA8LJV2IyGAcOTfKZnqoUHyciY\n722KnV1vz1aF0tEoST57DvO4ufDovdcr4wBFtFH1SedwmOOXHDBfw4SNoj9+\nDwO3sWAF1e36ByyUhqLSDQhwZNEqoqO0FpnunDFMcEC9a0l8nR6TJSdHBs2D\noN2PB1dZvRN5hKPzY1CU32FMop9qQeQIANTwMiskgKEV3zxG7ypKSpdsXSzF\nBUes6hDg0Xbb9u7tNHriDoLR5Dh2mz9JYgvKfHXwRGluMJAdLQzqszWB41Xo\nlAwCxjR0OmN0Fgce8OYDulveY8ybW1XrtUAObsFx1bascPclLaoq/LrhXurm\nzDNP\r\n=iP1Q\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCN7bf/n3xc3dxmIgk4IRgfVmidCRFex+zCvb7LRPraDQIgBHRPyKneNNLLnEdaNMVLD2NQFjqJ6LMSwoaI/Y91y1c="}]},"_npmUser":{"name":"master-chief","email":"7c6fcedd3e8c1b6e7f52391ed9aaa4@gmail.com"},"directories":{},"maintainers":[{"name":"master-chief","email":"7c6fcedd3e8c1b6e7f52391ed9aaa4@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/repeat_2.0.1_1605054418664_0.7518200850717007"},"_hasShrinkwrap":false},"2.0.2":{"name":"repeat","version":"2.0.2","description":"create repeating task chains","main":"dist/src/index.js","types":"dist/src/index.d.ts","scripts":{"build":"rimraf dist types && tsc && npm run test","test":"ava dist/test/** --verbose"},"author":{"name":"117"},"license":"ISC","repository":{"type":"git","url":"git+https://github.com/117/repeat.git"},"bugs":{"url":"https://github.com/117/repeat/issues"},"homepage":"https://github.com/117/repeat#readme","keywords":["task","repeating","chain","tasks","scheduler","loop","repeat"],"devDependencies":{"ava":"^3.13.0","rimraf":"^3.0.2"},"gitHead":"53975907b45db99ba1335e660e3d0921cdd831dc","_id":"repeat@2.0.2","_nodeVersion":"14.7.0","_npmVersion":"6.14.8","dist":{"integrity":"sha512-x2ssBu8B85Mglokqoj5ROLVC/mG+engPig9FimZdClpcNtrYD942NCTLHX7cNc0v/okC/ZkTEnwTQ0JCtajfTQ==","shasum":"824559c510a2e30dada3d1502edc2107c29eba68","tarball":"https://registry.npmjs.org/repeat/-/repeat-2.0.2.tgz","fileCount":14,"unpackedSize":11086,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfqzAhCRA9TVsSAnZWagAAZJAQAJ9GFequDLTve2Cm4YV2\nzk9gxqBehgKEqaQxns5Z9gj9KWLSYtPw3T6eC1ZBOT4pXeX/hqZjsUZs8N2m\nQ8xD60JfbiRkhZ7eUP/OHmapvSyG2YHik0xK98H5mFuZ9w++B2syxXnGqaN4\n0cdZH7U4pIGaGEg2k6kNOVu8I24iekzeBRfC8FG5FwpbCC9S+BEh18K4j2xQ\nm3Hn7xd9BUWpYWU4OfQdwMM2so1tuiZs6VwJ34+Stly5W6C2LRGtZu/RfBXj\nqloWQj/qX++et/IX6H1yqrludc2bdcZO3CHIx/207+DYhf6T+PXmZ7VPLWxi\n4nHqT4FkJ4zKegE3xWRlb496Jw4Vmh44IUW/MkCMwmhwAS2icsRDdvhKizfB\nsFVR6VojqQQsdO2CSPkqNES0QklW1nlLJH8F9OCwM1K7Q1pRlJyPIsf4RqtH\nY67Dcfv5wRNKCrrqaYJDjVh5gzpUBuqYGtKBrxpv46021RuagRi1aGQ901CB\nHbyEEJVqz1utOr5juQvXq31gpgEf37xeFKR5WTH236Nseh5EYqBv7JmJH32L\nhTEPZHrTnh2ypo0OmePjowxuuyNSQmzvCmaNx7NiCh2gb7FfJ9KVgMCgwlYw\nhBgxmrcSK+1Og2hf5E4RmBgbQ4tsUcctKtjrTIpOylI8sSy6FcKcV6zZxQwu\nduDz\r\n=W+gM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDjJJDdAnEtF+Gkh8w5EktdSfKHSl8RVp2FRpcl2x2pXAIgVrkEYjjTPIRYCRDbbzbAUjn/82gKBF8Arsbo7vkD+6g="}]},"_npmUser":{"name":"master-chief","email":"7c6fcedd3e8c1b6e7f52391ed9aaa4@gmail.com"},"directories":{},"maintainers":[{"name":"master-chief","email":"7c6fcedd3e8c1b6e7f52391ed9aaa4@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/repeat_2.0.2_1605054496564_0.19145395522849862"},"_hasShrinkwrap":false},"2.0.3":{"name":"repeat","version":"2.0.3","description":"create repeating task chains","main":"dist/src/index.js","types":"dist/src/index.d.ts","scripts":{"build":"rimraf dist types && tsc && npm run test","test":"ava dist/test/** --verbose"},"author":{"name":"117"},"license":"ISC","repository":{"type":"git","url":"git+https://github.com/117/repeat.git"},"bugs":{"url":"https://github.com/117/repeat/issues"},"homepage":"https://github.com/117/repeat#readme","keywords":["task","repeating","chain","tasks","scheduler","loop","repeat"],"devDependencies":{"ava":"^3.13.0","rimraf":"^3.0.2"},"gitHead":"d70a5f5f5643e1dbd0fd89ab758c7fb4084208d4","_id":"repeat@2.0.3","_nodeVersion":"14.7.0","_npmVersion":"6.14.8","dist":{"integrity":"sha512-yX/5UWb01ia3zQxowRjLw4UMtNiig/51S9s4gsddyNd5sGtyFII7lDkuS1wcOYBKbDjA1HEtHc8Uf0tarLXqBQ==","shasum":"d4b193a8a35a6fc0f336fc878f038c58b861a41c","tarball":"https://registry.npmjs.org/repeat/-/repeat-2.0.3.tgz","fileCount":14,"unpackedSize":11086,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfqzBDCRA9TVsSAnZWagAApBUP/2AFqtj+cyLcjlMw2Jo9\nicWZoBHZOOZutupLpSHyrO/qN2N1mpJZ+5HUFJ21z7bbbLnbUnzUs9kRwVJK\nE2NOAU8vor5+BWN6Dgk2DOFlxBsxl296qB8dAS8X5/fjNR3zTQk5zEOxISAu\nJLcBf9XUNDtUgnQYYOYGabHC76qzW/IGwuXlpxhu5zRqfe6DZ9Pj6monliRL\niORSXQGUHOCBBzahJaM49GXth6+VjYsYLk+ByUTGDwLBVUQXwpS9FGdmchuj\nXvGfZ3j40gPrqQV40jh5SFeG0qSErypMWr3/rSM/C54pt5XjjGebL/f2WX3N\nNttVxOOo7H209TricAwXxubonMMHWgqtwnx5GjK2yZ7+RxEjcjVWaxLUW115\nFrcNtQSns0iY9fxP4MPlv+3AztX3gN9lQF1gImQnhaarpPRU8RXNsxhXgqKV\nKFMO8ZACgj7Nyiqc8rvEwjmpUL9jJB4HOS7CMD69+TSfQ9OKd3Jv3mF19zB2\nr9UG9LoUXYr0DRxryDN5TH+h5rhMsZ4lx0TBnikEBOBV/63+CDTERorO21pH\nMQBA9zvsgrfc+UbzawL6GuqOV/58RjjlNYXbH0RhKQ+CVqt50kEvPLfjw05z\ned9AUxqD2rKVco9/CrneC3DWmiFr76ispub0CUcCp31028J9NylsTUJsKqD5\n+cV5\r\n=vWS/\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDTe3dxyz+ymzAYg36fGMMzDnLaKbgw1mMMNvwcW85WXwIhAPFThSjNNiX5293/wAOs5gD/3w9mK8k3uCDl8oxdOmlz"}]},"_npmUser":{"name":"master-chief","email":"7c6fcedd3e8c1b6e7f52391ed9aaa4@gmail.com"},"directories":{},"maintainers":[{"name":"master-chief","email":"7c6fcedd3e8c1b6e7f52391ed9aaa4@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/repeat_2.0.3_1605054530535_0.4466087877046945"},"_hasShrinkwrap":false},"2.0.4":{"name":"repeat","version":"2.0.4","description":"create repeating task chains","main":"dist/index.js","types":"types/index.d.ts","scripts":{"build":"rimraf dist types && tsc && npm run test","test":"ava dist/test/** --verbose"},"author":{"name":"117"},"license":"ISC","repository":{"type":"git","url":"git+https://github.com/117/repeat.git"},"bugs":{"url":"https://github.com/117/repeat/issues"},"homepage":"https://github.com/117/repeat#readme","keywords":["task","repeating","chain","tasks","scheduler","loop","repeat"],"devDependencies":{"ava":"^3.13.0","rimraf":"^3.0.2"},"gitHead":"cefcd86159534f9bef1cb3d962b1d4009d4794b7","_id":"repeat@2.0.4","_nodeVersion":"14.17.0","_npmVersion":"7.16.0","dist":{"integrity":"sha512-e7fgntk2YVZHnyht3VVA1RH5JwaSG3m/99uuPyvX6KFkj6+ojrCkGO6mdgm4gbUGTmsCAyAlcngfKp/vfogMCg==","shasum":"d194213299f869b582f4883c5f78176e590dd52c","tarball":"https://registry.npmjs.org/repeat/-/repeat-2.0.4.tgz","fileCount":14,"unpackedSize":11079,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg2WLQCRA9TVsSAnZWagAAXwgQAJsXM5XCWUvcqfLgSku9\n47nY5AAc8WWaE5Cgigv+gD768v9znPwTAs8pMDkGPi6ryZuClEkdUeG6o3vt\n+OmG0JP4LPdxScrCiqUFsCf9V4dAxpBJsEPg6eViLAv1DTO68rPEVkorBITT\nbdC7kT5BXF9gZMMmhvdWSGedJWkXFtnyb8UskqhN0KlmjQzCOac7hET/NKFb\nBwdj9cMCewtTIiy7kku/DkAoIZO90ia805Q8wKeM562kaqecvMeR99qSgogX\nz6sigUuRxS/48/Du3OtC/wdX4KpxUZgXtm61W3BVb4OaDloOkPMfNmkA72oG\n0GUsdVwII887dJQ23YkMEeCd9RTBwj51l+yLFYfpH8JtT4r8U9mUeBjGOUO7\n5zBfKSBa833e/8FQKj/HWkGlCuT2N7yRZejBSBU1b2FZfqu0W0YlSHhcr3Qp\nE1FaWksJ3vQruC9YQ04T+FohD0JnBaJ81f1Q1AJR5ZRl8F+4tAoEFFdcOhVk\nk8MZA8WCkQOH8gxJv+Kh2Pt5CnvTruwEb7IPY4LlauA3TUhu+vGSyHOHsTrf\nNznQslFAoI8wyLHpFrC5q5oHfzpWsaJVdWUq+zJ4SdtHmcrkpw0IzxBGAx/v\nqGnf9Iq7GGKuzAebN+62VjW4sjkevE3HTE6Npthr7rDiXoO8Y3D49OUgfA3D\nV/B/\r\n=tOd0\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDtiSjZtZS3gfBDI6YirAKWPHfDENyUwRNjI3cQAnFV1wIhANubJc4JCAQGjLD3ky9/5cEHUvSjHHWczGUpr9QYbH1U"}]},"_npmUser":{"name":"master-chief","email":"7c6fcedd3e8c1b6e7f52391ed9aaa4@gmail.com"},"directories":{},"maintainers":[{"name":"master-chief","email":"7c6fcedd3e8c1b6e7f52391ed9aaa4@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/repeat_2.0.4_1624859343399_0.3448235197942615"},"_hasShrinkwrap":false}},"readme":"# repeat\n\n![version](https://img.shields.io/github/package-json/v/117/repeat?color=196DFF&style=flat-square)\n![language](https://img.shields.io/github/languages/code-size/117/repeat?color=F1A42E&style=flat-square)\n![maintenance](https://img.shields.io/github/workflow/status/117/repeat/test?style=flat-square)\n![prettier](https://img.shields.io/static/v1?label=code%20style&message=prettier&color=ff51bc&style=flat-square)\n\ncreate repeating task chains\n\n## Contents\n\n- [Features](#features)\n- [Install](#install)\n- [Chain](#chain)\n- [Contributing](#contributing)\n\n## Features\n\n- [x] Chain any number of tasks and repeat them once or forever.\n- [x] Optional synchronous and asynchronous API.\n\n## Install\n\nFrom NPM:\n\n```cmd\n> npm i repeat\n```\n\n## Chain\n\n### Creating a new chain\n\nThe following chain will execute all tasks every second. A task is any callable\nfunction.\n\n```javascript\n// ES6\nimport { Chain } from 'repeat'\n\n// ES5\n// let { Chain } = require('repeat')\n\nlet chain = new Chain()\n\nchain\n  .add(\n    // task A\n    () => console.log('how are you?'),\n    // task B\n    () => console.log('good')\n    // you can add task C, D, E, F ...\n  )\n  .every(1000)\n```\n\n### Examples\n\nThe following methods are available on the chain.\n\n- [add](#add)\n- [once](#once)\n- [every](#every)\n- [forever](#forever)\n- [cancel](#cancel)\n\n#### add\n\n```typescript\n// add any number of tasks to the chain\nchain.add(\n  () => console.log('cat'),\n  () => console.log('dog'),\n  () => console.log('fish')\n)\n```\n\n#### once\n\n```typescript\n// execute the tasks once\nchain.once()\n```\n\n#### every\n\n```typescript\n// execute the tasks asynchronously every second\nchain.every(1000)\n```\n\n#### forever\n\n```typescript\n// execute the tasks as fast as possible\nchain.forever()\n```\n\n#### cancel\n\n```typescript\n// halt further execution of tasks\nchain.cancel()\n```\n\n## Contributing\n\nPull requests are encouraged. 😁\n","maintainers":[{"name":"master-chief","email":"7c6fcedd3e8c1b6e7f52391ed9aaa4@gmail.com"}],"time":{"modified":"2022-06-26T11:18:29.187Z","created":"2012-09-03T10:00:01.106Z","0.0.1":"2012-09-03T10:00:05.176Z","0.0.2":"2012-09-03T11:12:30.397Z","0.0.3":"2012-09-03T13:55:19.417Z","0.0.4":"2012-09-04T11:25:54.623Z","0.0.5":"2012-11-27T13:28:21.925Z","0.0.6":"2012-11-27T13:57:44.196Z","1.0.0":"2019-03-13T23:02:22.441Z","1.0.1":"2019-03-13T23:04:07.891Z","1.0.2":"2019-03-13T23:07:18.572Z","1.0.3":"2019-03-13T23:15:24.620Z","1.1.0":"2019-03-15T23:59:22.524Z","1.1.1":"2019-03-16T00:03:35.909Z","1.1.2":"2019-03-19T06:05:30.034Z","1.1.3":"2019-04-06T11:30:32.839Z","1.1.4":"2019-04-06T11:49:49.070Z","1.2.0":"2019-07-09T13:37:18.862Z","2.0.0":"2020-11-11T00:13:23.328Z","2.0.1":"2020-11-11T00:26:58.815Z","2.0.2":"2020-11-11T00:28:16.722Z","2.0.3":"2020-11-11T00:28:50.756Z","2.0.4":"2021-06-28T05:49:03.540Z"},"author":{"name":"117"},"repository":{"type":"git","url":"git+https://github.com/117/repeat.git"},"users":{"sturob":true,"eshaanmathur":true,"paraself":true,"saike":true},"homepage":"https://github.com/117/repeat#readme","keywords":["task","repeating","chain","tasks","scheduler","loop","repeat"],"bugs":{"url":"https://github.com/117/repeat/issues"},"license":"ISC","readmeFilename":"README.md"}