{"_id":"taskr","_rev":"31-a119dae3c6ef3318540db8fd9f148608","name":"taskr","time":{"modified":"2023-03-31T01:52:40.567Z","created":"2014-12-06T23:23:28.751Z","1.0.0":"2014-12-06T23:23:28.751Z","1.0.1":"2014-12-06T23:34:00.593Z","1.0.2":"2014-12-07T00:05:27.408Z","1.0.3":"2014-12-14T01:02:24.505Z","1.0.4":"2014-12-20T22:27:10.229Z","0.1.0":"2015-04-18T19:27:37.183Z","0.1.1":"2015-04-18T20:37:57.599Z","0.2.0":"2015-08-05T17:26:55.612Z","0.2.1":"2015-08-05T17:28:52.689Z","0.2.2":"2015-08-18T12:11:22.697Z","0.2.3":"2015-08-21T20:34:42.170Z","0.9.0":"2017-06-09T23:03:04.851Z","0.9.1":"2017-06-14T20:31:09.502Z","1.0.5":"2017-06-18T21:03:46.642Z","1.0.6":"2017-06-29T17:42:50.993Z","1.1.0":"2017-07-27T20:37:04.492Z"},"maintainers":[{"name":"lukeed","email":"luke@lukeed.com"}],"dist-tags":{"latest":"1.1.0"},"description":"Generator & Coroutine-based task runner. Fasten your seatbelt.","readme":"# taskr [![npm](https://img.shields.io/npm/v/taskr.svg)](https://npmjs.org/package/taskr)\n\nTaskr is a highly performant task automation tool, much like Gulp or Grunt, but written with concurrency in mind. With Taskr, everything is a [coroutine](https://medium.com/@tjholowaychuk/callbacks-vs-coroutines-174f1fe66127#.vpryf5tyb), which allows for cascading and composable tasks; but unlike Gulp, it's not limited to the stream metaphor.\n\nTaskr is extremely extensible, so _anything_ can be a task. Our core system will accept whatever you throw at it, resulting in a modular system of reusable plugins and tasks, connected by a declarative `taskfile.js` that's easy to read.\n\n<h2>Table of Contents</h2>\n\n<details>\n<summary>Table of Contents</summary>\n\n- [Features](#features)\n- [Example](#example)\n- [Concepts](#concepts)\n    * [Core](#core)\n    * [Plugins](#plugins)\n    * [Tasks](#tasks)\n    * [Taskfiles](#taskfiles)\n- [CLI](#cli)\n- [API](#api)\n    * [Taskr](#taskr-1)\n    * [Plugin](#plugin)\n    * [Task](#task-1)\n    * [Utilities](#utilities)\n- [Installation](#installation)\n- [Usage](#usage)\n    * [Getting Started](#getting-started)\n    * [Programmatic](#programmatic)\n- [Credits](#credits)\n</details>\n\n## Features\n\n- **lightweight:** with `6` dependencies, [installation](#installation) takes seconds\n- **minimal API:** Taskr only exposes a couple methods, but they're everything you'll ever need\n- **performant:** because of [Bluebird](https://github.com/petkaantonov/bluebird/), creating and running Tasks are quick and inexpensive\n- **cascading:** sequential Task chains can cascade their return values, becoming the next Task's argument\n- **asynchronous:** concurrent Task chains run without side effects & can be `yield`ed consistently\n- **composable:** chain APIs and Tasks directly; say goodbye to `pipe()` x 100!\n- **modular:** easily share or export individual Tasks or Plugins for later use\n- **stable:** requires Node `>= 4.6` to run (LTS is `6.11`)\n\n## Example\n\nHere's a simple [`taskfile`](#taskfiles) (with [shorthand generator methods](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Method_definitions#Shorthand_generator_methods)) depicting a [parallel](#taskrparalleltasks-options) chain.\n\n```js\nconst sass = 'src/{admin,client}/*.sass';\nconst js = 'src/{admin,client}/*.js';\nconst dist = 'build';\n\nmodule.exports = {\n  *lint(task) {\n    yield task.source(js).xo({ esnext:true });\n  },\n  *scripts(task) {\n    yield task.source(js).babel({ presets:['es2015'] }).target(`${dist}/js`);\n  },\n  *styles(task) {\n    yield task.source(sass).sass({ outputStyle:'compressed' }).autoprefixer().target(`${dist}/css`);\n  },\n  *build(task) {\n    yield task.parallel(['lint', 'scripts', 'styles']);\n  }\n}\n```\n\n## Concepts\n\n### Core\n\nTaskr is a task runner. It's designed to get you from `A` to `B` -- that's it.\n\nIf it helps, imagine you're dining in a restaurant and Taskr is the food runner. Taskr's role is solely to collect meals from the kitchen (`task.source`) and deliver them to the correct table (`task.target`). As a food runner, Taskr may do this one plate at a time (`task.serial`) or deliver multiple plates at once (`task.parallel`). Either way, Taskr only cares about going from `A` to `B`. It may not be the most glamorous job, but as far as you (the patron) are concerned, it's incredibly important because it brings you food.\n\n### Plugins\n\nBecause Taskr is single-minded and cares only about executing [tasks](#tasks), **everything else is a plugin**. This keeps development with Taskr easy, approachable, and lightweight.\n\nYou see, installing Taskr gives access to a reliable task runner. You decide what it _can do_, provide it functionality, and dictate when to do it. You're in full control.\n\nThrough plugins, you are able to capture useful behavior and share them across tasks or projects for repeated use. Plugins come in three flavors:\n\n* **external** - installed via NPM; called \"external\" because they live outside your codebase\n* **inline** - generally simple, one-time functions; not sensible for reuse since declared within a task (hence \"inline\")\n* **local** - private, reusable plugins; appear exactly like external plugins but not public on NPM.\n\n### Tasks\n\nTasks are used to tell Taskr what to do. They are written as generator functions & converted to coroutines internally. They're also fully self-contained and, like plugins, can be shared across projects if desired.\n\nUpon runtime, tasks are cheap to create, so are also destroyed once completed. This also helps Taskr remain efficient; history won't weigh it down.\n\nLastly, tasks have the power to [start](#taskstarttask-options) other Tasks, including [serial](#taskserialtasks-options) and [parallel](#taskparalleltasks-options) chains!\n\n### Taskfiles\n\nMuch like Gulp, Taskr uses a `taskfile.js` (case sensitive) to read and run your Tasks. However, because it's a regular JavaScript file, you may also `require()` additional modules and incorporate them directly into your Tasks, without the need for a custom Plugin!\n\n```js\nconst browserSync = require('browser-sync');\n\nexports.serve = function * (task) {\n  browserSync({\n    port: 3000,\n    server: 'dist',\n    middleware: [\n      require('connect-history-api-fallback')()\n    ]\n  });\n  yield task.$.log('> Listening on localhost:3000');\n}\n```\n\nTaskfiles should generally be placed in the root of your project, alongside your `package.json`. Although this is not required, Taskr (strongly) prefers this location.\n\n> **Note:** You may set an alternate directory path through the CLI's `cwd` option.\n\nThrough Node, Taskr only supports ES5 syntax; however, if you prefer ES6 or ES7, just install [`@taskr/esnext`](https://github.com/lukeed/taskr/tree/master/packages/esnext)!\n\n## CLI\n\nTaskr's CLI tool is very simple and straightforward.\n\n```\ntaskr [options] <task names>\ntaskr --mode=parallel task1 task2 ...\n```\n> Please run `taskr --help` or `taskr -h` for usage information.\n\nMost commonly, the CLI is used for [NPM script](https://docs.npmjs.com/misc/scripts) definitions.\n\n```js\n// package.json\n{\n  \"scripts\": {\n    \"build\": \"taskr foo bar\"\n  }\n}\n```\n\n## API\n\n### Taskr\n\nTaskr itself acts as a \"parent\" class to its `Task` children. Because of this, Taskr's methods are purely executive; aka, they manage Tasks and tell them how & when to run.\n\n#### Taskr.start(task, [options])\nYield: `Any`<br>\nStart a Task by its name; may also pass initial values. Can return anything the Task is designed to.\n\n##### task\nType: `String`<br>\nDefault: `'default'`<br>\nThe Task's name to run. Task must exist/be defined or an Error is thrown.<br>\n> **Important!** Taskr expects a `default` task if no task is specified. This also applies to CLI usage.\n\n##### options\nType: `Object`<br>\nDefault: `{ src:null, val:null }`<br>\nInitial/Custom values to start with. You may customize the object shape, but only `val` will be cascaded from Task to Task.\n\n#### Taskr.parallel(tasks, [options])\nYield: `Any`<br>\nRun a group of tasks simultaneously. Cascading is disabled.\n##### tasks\nType: `Array`<br>\nThe names of Tasks to run. Task names must be `string`s and must be defined.\n##### options\nType: `Object`<br>\nInitial values to start with; passed to each task in the group. Does not cascade.\n\n#### Taskr.serial(tasks, [options])\nYield: `Any`<br>\nRun a group of tasks sequentially. Cascading is enabled.\n##### tasks\nType: `Array`<br>\nThe names of Tasks to run. Task names must be `string`s and must be defined.\n##### options\nType: `Object`<br>\nInitial values to start with; passed to each task in the group. Does cascade.\n\n```js\nmodule.exports = {\n  *default(task) {\n    yield task.serial(['first', 'second'], { val:10 });\n  },\n  *first(task, opts) {\n    yield task.$.log(`first: ${opts.val}`);\n    return opts.val * 4;\n  },\n  *second(task, opts) {\n    yield task.$.log(`second: ${opts.val}`);\n    return opts.val + 2;\n  }\n}\n\nconst output = yield task.start();\n//=> first: 10\n//=> second: 40\nconsole.log(output);\n//=> 42\n```\n\n### Plugin\n\nPlugins can be external, internal, or local. However, all plugins share the same options:\n\n##### options.every\nType: `Boolean`<br>\nDefault: `true`<br>\nIf the plugin function should iterate through _every_ `file|glob`.\n\n##### options.files\nType: `Boolean`<br>\nDefault: `true`<br>\nIf the plugin should receive the Task's `glob` patterns or its expanded `file` objects. Uses `globs` if `false`.\n\nEvery plugin must also pass a **generator function**, which will be wrapped into a coroutine. This function's arguments will be the `file|glob`(s), depending on the `options.every` and `options.files` combination. The function's second argument is the user-provided config object.\n\nThe plugin's generator function is **always** bound to the current `Task`, which means `this` refers to the Task instance.\n\n#### Internal Plugins\n\nInternal plugins are for single-use only. If you're defining the same behavior repeatedly, it should be extracted to a local or external plugin instead.\n\n> **Note:** Inline plugins have no need for a second argument in their generator function; you are the \"user\" here.\n\nSee [`task.run`](#taskrunoptions-generator) for a simple example. The same inline example may be written purely as an object:\n\n```js\nexports.foo = function * (task) {\n  yield task.source('src/*.js').run({\n    every: false,\n    *func(files) {\n      Array.isArray(files); //=> true\n      yield Promise.resolve('this will run once.');\n    }\n  }).target('dist');\n}\n```\n\n#### External Plugins\n\nUnlike \"inline\" plugins, external and local plugins are defined before a Task is performed. Because of this, they must define a `name` for their method to use within a Task.\n\nSimilar to inline plugins, there are two ways of defining an exported module -- via functional or object definitions.\n\nWhen using a _functional definition_, the **definition** receives the [Taskr](#taskr-1) instance and the [utilities](#utilities) object.\n\n```js\nmodule.exports = function (task, utils) {\n  // promisify before running else repeats per execution\n  const render = utils.promisify(function () {});\n  // verbose API\n  task.plugin('myName', {every: false}, function * (files, opts) {\n    console.log('all my files: ', files); //=> Array\n    console.log(this._.files === files); //=> true\n    console.log(this instanceof Task); //=> true\n    console.log('user options: ', opts);\n    yield render(opts);\n  });\n  // or w/condensed API\n  task.plugin({\n    name: 'myName',\n    every: false,\n    *func(files, opts) {\n      // ...same\n    }\n  });\n}\n```\n\nWhen using an _object definition_, you are not provided the `task` or `utils` parameters. **This assumes that you do not need any prep work for your plugin!**\n\n```js\nmodule.exports = {\n  name: 'myName',\n  every: false,\n  *func(files, opts) {\n    // do stuff\n  }\n}\n```\n\nThen, within your Task, you may use it like so:\n\n```js\nexports.default = function * (task) {\n  yield task.source('src/*.js').myName({ foo:'bar' }).target('dist');\n}\n```\n\n#### Local Plugins\n\nLocal plugins are defined exactly like external plugins. The only difference is that they're not installable via NPM.\n\nIn order to use a local plugin, add a `taskr` key to your `package.json` file. Then define a `requires` array with paths to your plugins.\n\n```js\n{\n  \"taskr\": {\n    \"requires\": [\n      \"./build/custom-plugin-one.js\",\n      \"./build/custom-plugin-two.js\"\n    ]\n  }\n}\n```\n\nFor [programmatic usage](#programmatic), simply pass an array of definitions to the `plugins` key:\n\n```js\nconst Taskr = require('taskr')\nconst taskr = new Taskr({\n  plugins: [\n    require('./build/custom-plugin-one.js'),\n    require('./build/custom-plugin-two.js'),\n    require('@taskr/clear')\n    {\n      name: 'plugThree',\n      every: false,\n      files: false,\n      *func(globs, opts) {\n        // nifty, eh?\n      }\n    }\n  ]\n});\n```\n\n### Task\n\nA Task receives itself as its first argument. We choose to name the parameter `task` simply as a convention; of course, you may call it whatever you'd like.\n\nTasks are exported from a `taskfile.js`, which means you can use either syntax:\n\n```js\nexports.foo = function * (task) {\n  yield task.source('src/*.js').target('dist/js');\n}\nexports.bar = function * (task) {\n  yield task.source('src/*.css').target('dist/css');\n}\n// or\nmodule.exports = {\n  *foo(task) {\n    yield task.source('src/*.js').target('dist/js');\n  },\n  *bar(task) {\n    yield task.source('src/*.css').target('dist/css');\n  }\n}\n```\n\nEach Task also receives an `opts` object, consisting of `src` and `val` keys. Although `src` is primarily used for [`@taskr/watch`](https://github.com/lukeed/taskr/tree/master/packages/watch), the `val` key can be used or set at any time see [`Taskr.serial`](#taskrserialtasks-options).\n\nAll methods and values below are exposed within a Task's function.\n\n#### task.root\nType: `String`<br>\nThe directory wherein `taskfile.js` resides, now considered the root. Also accessible within plugins.\n\n#### task.$\nType: `Object`<br>\nThe Task's utility helpers. Also accessible within plugins. See [Utilities](#utilities).\n\n#### task._\nType: `Object`<br>\nThe Task's internal state, populated by `task.source()`. Also accessible within plugins.\n##### task._.files\nType: `Array`<br>\nThe Task's active files. Each object contains a `dir` and `base` key from its [`pathObject`](https://nodejs.org/api/path.html#path_path_format_pathobject) and maintains the file's Buffer contents as a `data` key.\n##### task._.globs\nType: `Array`<br>\nThe Task's glob patterns, from `task.source()`. Used to populate `task._.files`.\n##### task._.prevs\nType: `Array`<br>\nThe Task's last-known (aka, outdated) set of glob patterns. Used **only** for [`@taskr/watch`](https://github.com/lukeed/taskr/tree/master/packages/watch).\n\n#### task.source(globs, [options])\n##### globs\nType: `Array|String`<br>\nAny valid glob pattern or array of patterns.\n##### options\nType: `Object`<br>\nDefault: `{}`<br>\nAdditional options, passed directly to [`node-glob`](https://github.com/isaacs/node-glob#options).\n\n#### task.target(dirs, [options])\n##### dirs\nType: `Array|String`<br>\nThe destination folder(s).\n##### options\nType: `Object`<br>\nDefault: `{}`<br>\nAdditional options, passed directly to [`fs.writeFile`](https://nodejs.org/api/fs.html#fs_fs_writefile_file_data_options_callback).\n\nPlease note that `task.source()` glob ambiguity affects the destination structure.\n\n```js\nyield task.source('src/*.js').target('dist');\n//=> dist/foo.js, dist/bar.js\nyield task.source('src/**/*.js').target('dist');\n//=> dist/foo.js, dist/bar.js, dist/sub/baz.js, dist/sub/deep/bat.js\n```\n\n#### task.run(options, generator)\nPerform an inline plugin.\n\n##### options\nType: `Object`<br>\nThe See [plugin options](#plugin).\n##### generator\nType: `Function`<br>\nThe action to perform; must be a `Generator` function.\n\n```js\nexports.foo = function * (task) {\n  yield task.source('src/*.js').run({ every:false }, function * (files) {\n    Array.isArray(files); //=> true\n    yield Promise.resolve('this will run once.');\n  }).target('dist')\n}\n```\n\n#### task.start(task, [options])\nSee [`Taskr.start`](#taskrstarttask-options).\n\n#### task.parallel(tasks, [options])\nSee [`Taskr.parallel`](#taskrparalleltasks-options).\n\n#### task.serial(tasks, [options])\nSee [`Taskr.serial`](#taskrserialtasks-options).\n\n### Utilities\n\nA collection of utility helpers to make life easy.\n\n#### alert(...msg)\nPrint to console with timestamp and alert coloring. See [`utils.log`](#logmsg).\n##### msg\nType: `String`\n\n#### coroutine(generator)\nSee [Bluebird.coroutine](http://bluebirdjs.com/docs/api/promise.coroutine.html).\n\n#### error(...msg)\nPrint to console with timestamp and error coloring. See [`utils.log`](#logmsg).\n##### msg\nType: `String`\n\n#### expand(globs, options)\nYield: `Array`<br>\nGet all filepaths that match the glob pattern constraints.\n##### globs\nType: `Array|String`\n##### options\nType: `Object`<br>\nDefault: `{}`<br>\nAdditional options, passed directly to [`node-glob`](https://github.com/isaacs/node-glob#options).\n\n#### find(filename, dir)\nYield: `String|null`<br>\nFind a complete filepath from a given path, or optional directory.\n##### filename\nType: `String`<br>\nThe file to file; may also be a complete filepath.\n##### dir\nType: `String`<br>\nDefault: `'.'`<br>\nThe directory to look within. Will be prepended to the `filename` value.\n\n#### log(...msg)\nPrint to console with timestamp and normal coloring.\n##### msg\nType: `String`<br>\nYou may pass more than one `msg` string.\n\n```js\nutils.log('Hello');\n//=> [10:51:04] Hello\nutils.log('Hello', 'World');\n//=> [10:51:14] Hello World\n```\n\n#### promisify(function, callback)\nSee [Bluebird.promisify](http://bluebirdjs.com/docs/api/promise.promisify.html).\n\n#### read(filepath, options)\nYield: `Buffer|String|null`<br>\nGet a file's contents. Ignores directory paths.\n##### filepath\nType: `String`<br>\nThe full filepath to read.\n##### options\nType: `Object`<br>\nAdditional options, passed to [`fs.readFile`](https://nodejs.org/api/fs.html#fs_fs_readfile_file_options_callback).\n\n#### trace(stack)\nParse and prettify an Error's stack.\n\n#### write(filepath, data, options)\nYield: `null`<br>\nWrite given data to a filepath. Will create directories as needed.\n##### filepath\nType: `String`<br>\nThe full filepath to write into.\n##### data\nType: `String|Buffer`<br>\nThe data to be written; see [`fs.writeFile`](https://nodejs.org/api/fs.html#fs_fs_writefile_file_data_options_callback).\n##### options\nType: `Object`<br>\nAdditional options, passed to [`fs.writeFile`](https://nodejs.org/api/fs.html#fs_fs_writefile_file_data_options_callback).\n\n## Installation\n\n```sh\n$ npm install --save-dev taskr\n```\n\n## Usage\n\n### Getting Started\n\n1. Install Taskr & any desired plugins. (see [installation](#installation) and [ecosystem](https://github.com/lukeed/taskr#packages))\n2. Create a `taskfile.js` next to your `package.json`.\n3. Define `default` and additional tasks within your `taskfile.js`.\n\n  ```js\n  exports.default = function * (task) {\n    yield task.parallel(['styles', 'scripts']);\n  }\n\n  exports.styles = function * (task) {\n    yield task.source('src/**/*.css').autoprefixer().target('dist/css');\n  }\n\n  exports.scripts = function * (task) {\n    yield task.source('src/**/*.js').babel({\n      presets: [\n        ['es2015', { loose:true, modules:false }]\n      ]\n    }).target('dist/js');\n  }\n  ```\n4. Add a `\"scripts\"` key to your `package.json`:\n\n  ```json\n  {\n    \"name\": \"my-project\",\n    \"scripts\": {\n      \"build\": \"taskr\"\n    }\n  }\n  ```\n\n  > **Note:** The `default` task is run if no other tasks are specified.\n5. Run your `build` command:\n\n  ```sh\n  $ npm run build\n  ```\n\nYou may be interested in checking out [Web Starter Kit](https://github.com/lukeed/fly-kit-web) for a head start.\n\n### Programmatic\n\nTaskr is extremely flexible should you choose to use Taskr outside of its standard configuration.\n\nThe quickest path to a valid `Taskr` instance is to send a `tasks` object:\n\n```js\nconst Taskr = require('Taskr');\nconst taskr = new Taskr({\n  tasks: {\n    *foo(f) {},\n    *bar(f) {}\n  }\n});\ntaskr.start('foo');\n```\n\nBy default, your new Taskr instance will not include any plugins. You have the power to pick and choose what your instance needs!\n\nTo do this, you may pass an array of [external](#external-plugins) and [local](#local-plugins) `plugins`:\n\n```js\nconst taskr = new Taskr({\n  plugins: [\n    require('@taskr/concat'),\n    require('@taskr/clear'),\n    require('./my-plugin')\n  ]\n});\n```\n\n> **Important:** This assumes you have provided a valid `file` _or_ `tasks` object. Without either of these, your Taskr instance will be incomplete and therefore invalid. This will cause the instance to exit early, which means that your `plugins` will not be mounted to the instance.\n\nYou may also define your `tasks` by supplying a `taskfile.js` path to `file`. Whenever you do this, you **should** also update the `cwd` key because your [root](#taskroot) has changed!\n\n```js\nconst join = require('path').join;\n\nconst cwd = join(__dirname, '..', 'build');\nconst file = join(cwd, 'taskfile.js');\n\nconst taskr = new Taskr({ file, cwd });\n```\n\n\n## Credits\n\nThis project used to be called `fly`, but [Jorge Bucaran](https://github.com/jbucaran), its original author, generously handed over the project to [Luke Edwards](https://github.com/lukeed) in order to further development. The project is now named `taskr` to reflect the transition and its exicitng new future!\n\nA **big thanks** to [Constantin Titarenko](https://github.com/titarenko) for donating the name `taskr` on NPM -- very much appreciated!\n","versions":{"0.1.0":{"name":"taskr","version":"0.1.0","description":"Simplest task management promise-based module","main":"index.js","scripts":{"test":"mocha tests"},"repository":{"type":"git","url":"git://github.com/titarenko/taskr.git"},"keywords":["task","management","queue","promise"],"author":{"name":"Constantin Titarenko"},"license":"MIT","bugs":{"url":"https://github.com/titarenko/taskr/issues"},"homepage":"https://github.com/titarenko/taskr","dependencies":{"bluebird":"^2.9.24","cron":"^1.0.9","lodash":"^3.7.0"},"devDependencies":{"mocha":"^2.2.4","should":"^6.0.1"},"_id":"taskr@0.1.0","_shasum":"08dacbe001938ededeefc3581b050a6881fa4cbe","_from":".","_npmVersion":"1.4.9","_npmUser":{"name":"titarenko","email":"constantin.titarenko@gmail.com"},"maintainers":[{"name":"titarenko","email":"constantin.titarenko@gmail.com"}],"dist":{"shasum":"08dacbe001938ededeefc3581b050a6881fa4cbe","tarball":"https://registry.npmjs.org/taskr/-/taskr-0.1.0.tgz","integrity":"sha512-jE+jjOt2Oxap1gkwi9qX5odZYN0rDuT0CpzSfC83aEbjfQ2ND8qmz8vf7QaDURTjhvGMuA5mlodzCLjY4xmxLQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDxpxC8mn8cEbJKuxldynSiL73LqsCdjybwMtBCtEYFSgIgG3KhLnb8TubCbhYdj+YbILYzyt+TmB95LIVC0FTTE68="}]},"deprecated":"titarenko has graciously donated this package. To view his original module, visit https://github.com/titarenko/taskr","directories":{}},"0.1.1":{"name":"taskr","version":"0.1.1","description":"Simplest task management promise-based module","main":"index.js","scripts":{"test":"mocha tests"},"repository":{"type":"git","url":"git://github.com/titarenko/taskr.git"},"keywords":["task","management","queue","promise"],"author":{"name":"Constantin Titarenko"},"license":"MIT","bugs":{"url":"https://github.com/titarenko/taskr/issues"},"homepage":"https://github.com/titarenko/taskr","dependencies":{"bluebird":"^2.9.24","cron":"^1.0.9","lodash":"^3.7.0"},"devDependencies":{"mocha":"^2.2.4","should":"^6.0.1"},"_id":"taskr@0.1.1","_shasum":"64a36ee306979ce87a56684aafb96304d76f77bd","_from":".","_npmVersion":"1.4.9","_npmUser":{"name":"titarenko","email":"constantin.titarenko@gmail.com"},"maintainers":[{"name":"titarenko","email":"constantin.titarenko@gmail.com"}],"dist":{"shasum":"64a36ee306979ce87a56684aafb96304d76f77bd","tarball":"https://registry.npmjs.org/taskr/-/taskr-0.1.1.tgz","integrity":"sha512-e19DsztRCqXxI/hSpAXRGyp8VpeC5iuQ1SbaNExY/1rirCzX+Ln6XKVS7mBL4FqycFWQ9+TNE+tbNvaOs7F4tA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCpm9Fo6S0I0WqQaXX+l/TRREhrRW7DsuECRtRVALKAHgIhAM3c48s5qjqoJsY2hCqm0ziFzBwYCgd3UcruZeI3VD9p"}]},"deprecated":"titarenko has graciously donated this package. To view his original module, visit https://github.com/titarenko/taskr","directories":{}},"0.2.0":{"name":"taskr","version":"0.2.0","description":"Simplest task management module","main":"index.js","scripts":{"test":"istanbul cover node_modules/mocha/bin/_mocha -- tests && cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js"},"repository":{"type":"git","url":"git://github.com/titarenko/taskr.git"},"keywords":["task","management","queue","server","promise"],"author":{"name":"Constantin Titarenko"},"license":"MIT","bugs":{"url":"https://github.com/titarenko/taskr/issues"},"homepage":"https://github.com/titarenko/taskr","dependencies":{"bluebird":"^2.9.24","cron":"^1.0.9","lodash":"^3.7.0","require-all":"^1.1.0"},"devDependencies":{"coveralls":"^2.11.3","istanbul":"^0.3.17","mocha":"^2.2.4","should":"^6.0.1","sinon":"^1.15.4"},"gitHead":"232404cbedcd781bb27ab58680c2d7b0b6685a06","_id":"taskr@0.2.0","_shasum":"b07e0b5c0c89056ae59b5a43272fb864e5fb356e","_from":".","_npmVersion":"2.10.1","_nodeVersion":"0.12.4","_npmUser":{"name":"titarenko","email":"constantin.titarenko@gmail.com"},"dist":{"shasum":"b07e0b5c0c89056ae59b5a43272fb864e5fb356e","tarball":"https://registry.npmjs.org/taskr/-/taskr-0.2.0.tgz","integrity":"sha512-lG8MpTsmZlzYV6MwsF3jWf4OfZownJ7DP59MNGql7zsL44RAK9FmgI71GBYjAA9q0I7oWayG9jtwZLijgV52/g==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEDFKqHCqaJfQi6Zn4gqYE6SWckF69/Ol2PcZEMdS9V5AiABgMe80sja5eLn3BDUTIRkuneEZJnU9DqTe+xQ+fPQow=="}]},"maintainers":[{"name":"titarenko","email":"constantin.titarenko@gmail.com"}],"deprecated":"titarenko has graciously donated this package. To view his original module, visit https://github.com/titarenko/taskr","directories":{}},"0.2.1":{"name":"taskr","version":"0.2.1","description":"Simplest task management module","main":"index.js","scripts":{"test":"istanbul cover node_modules/mocha/bin/_mocha -- tests && cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js"},"repository":{"type":"git","url":"git://github.com/titarenko/taskr.git"},"keywords":["task","management","queue","server","promise","pipe","piping","schedule","scheduling","scheduler"],"author":{"name":"Constantin Titarenko"},"license":"MIT","bugs":{"url":"https://github.com/titarenko/taskr/issues"},"homepage":"https://github.com/titarenko/taskr","dependencies":{"bluebird":"^2.9.24","cron":"^1.0.9","lodash":"^3.7.0","require-all":"^1.1.0"},"devDependencies":{"coveralls":"^2.11.3","istanbul":"^0.3.17","mocha":"^2.2.4","should":"^6.0.1","sinon":"^1.15.4"},"gitHead":"9bf4f79ce426c72854c61f19e1f4e90bc3ca5b11","_id":"taskr@0.2.1","_shasum":"d0b6759ed89880fe37ff7a73ad986a8bd8ae0307","_from":".","_npmVersion":"2.10.1","_nodeVersion":"0.12.4","_npmUser":{"name":"titarenko","email":"constantin.titarenko@gmail.com"},"dist":{"shasum":"d0b6759ed89880fe37ff7a73ad986a8bd8ae0307","tarball":"https://registry.npmjs.org/taskr/-/taskr-0.2.1.tgz","integrity":"sha512-RE0hNzZk9kJVMvKCpFVDEtha7Y4wKb5AaHQPjC1RgoM5jEdy0ytHmYjLcXmaerpMjgeHlFO8LgPtVRze0LKyYw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDgcYSyfhM703d7QY/LpowsA2QIqLbgxjy0tUbA3k1vFQIhALGmqNo5WQK9PYFA/N9CkWibJ7PDqncbhRa80SgJpMMh"}]},"maintainers":[{"name":"titarenko","email":"constantin.titarenko@gmail.com"}],"deprecated":"titarenko has graciously donated this package. To view his original module, visit https://github.com/titarenko/taskr","directories":{}},"0.2.2":{"name":"taskr","version":"0.2.2","description":"Simplest task management module","main":"index.js","scripts":{"test":"istanbul cover node_modules/mocha/bin/_mocha -- tests && cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js"},"repository":{"type":"git","url":"git://github.com/titarenko/taskr.git"},"keywords":["task","management","queue","server","promise","pipe","piping","schedule","scheduling","scheduler"],"author":{"name":"Constantin Titarenko"},"license":"MIT","bugs":{"url":"https://github.com/titarenko/taskr/issues"},"homepage":"https://github.com/titarenko/taskr","dependencies":{"bluebird":"^2.9.24","cron":"^1.0.9","lodash":"^3.7.0","require-all":"^1.1.0"},"devDependencies":{"coveralls":"^2.11.3","istanbul":"^0.3.17","mocha":"^2.2.4","should":"^6.0.1","sinon":"^1.15.4"},"gitHead":"24f45387dea1492bc34384f6fce698d189d4f364","_id":"taskr@0.2.2","_shasum":"db906b300189c5ba6e9e13557c2df9ae7bfdbfae","_from":".","_npmVersion":"2.10.1","_nodeVersion":"0.12.4","_npmUser":{"name":"titarenko","email":"constantin.titarenko@gmail.com"},"dist":{"shasum":"db906b300189c5ba6e9e13557c2df9ae7bfdbfae","tarball":"https://registry.npmjs.org/taskr/-/taskr-0.2.2.tgz","integrity":"sha512-bT/ZeHR5Imvzz1WVHfe++W4UUxEP2snV49X47kSFU30948kKtVbzlpeOyMcjpj7tjncgianif0AFo7G1auahDQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEdN2MOe8lrlTU9kDwQCXMkwuhb1oaf3pbmtD1DBuNEyAiAK5jx/CZej3xw62XZqm7BOOzPWCTP3i9dgaZ2UzRID1g=="}]},"maintainers":[{"name":"titarenko","email":"constantin.titarenko@gmail.com"}],"deprecated":"titarenko has graciously donated this package. To view his original module, visit https://github.com/titarenko/taskr","directories":{}},"0.2.3":{"name":"taskr","version":"0.2.3","description":"Simplest task management module","main":"index.js","scripts":{"test":"istanbul cover node_modules/mocha/bin/_mocha -- tests && cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js"},"repository":{"type":"git","url":"git://github.com/titarenko/taskr.git"},"keywords":["task","management","queue","server","promise","pipe","piping","schedule","scheduling","scheduler"],"author":{"name":"Constantin Titarenko"},"license":"MIT","bugs":{"url":"https://github.com/titarenko/taskr/issues"},"homepage":"https://github.com/titarenko/taskr","dependencies":{"bluebird":"^2.9.24","cron":"^1.0.9","lodash":"^3.7.0","require-all":"^1.1.0"},"devDependencies":{"coveralls":"^2.11.3","istanbul":"^0.3.17","mocha":"^2.2.4","should":"^6.0.1","sinon":"^1.15.4"},"gitHead":"0d6b200b9464f87c15c7b92a27acb175d1300454","_id":"taskr@0.2.3","_shasum":"2f6f08835304d9e7a2adf91d3c6ca3068721186c","_from":".","_npmVersion":"2.10.1","_nodeVersion":"0.12.4","_npmUser":{"name":"titarenko","email":"constantin.titarenko@gmail.com"},"dist":{"shasum":"2f6f08835304d9e7a2adf91d3c6ca3068721186c","tarball":"https://registry.npmjs.org/taskr/-/taskr-0.2.3.tgz","integrity":"sha512-fqjpCyKbNC4DinZ+GrKAojAw8RBlVSiqFSxzynbACbUmKArAaMXw3wP7ymchbHZ5uOqgBUFgPDGH4sgOhvsByQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAxpOxFxLc+nMD6IMbiVBRCuao8r19IH8rZ9nLD4FnGMAiEA2+tTazbpdkrYvZsZZHHrtqsdvf4SSGtAMTSgO1k69Ec="}]},"maintainers":[{"name":"titarenko","email":"constantin.titarenko@gmail.com"}],"deprecated":"titarenko has graciously donated this package. To view his original module, visit https://github.com/titarenko/taskr","directories":{}},"0.9.0":{"name":"taskr","version":"0.9.0","description":"Generator & Coroutine-based task runner. Fasten your seatbelt.","license":"MIT","repository":{"type":"git","url":"git+https://github.com/lukeed/taskr.git"},"homepage":"https://github.com/lukeed/taskr","author":{"name":"Luke Edwards","email":"luke@lukeed.com","url":"https://lukeed.com"},"main":"lib/fly.js","bin":{"taskr":"cli.js"},"files":["lib","cli.js"],"dependencies":{"bluebird":"^3.5.0","clor":"^5.1.0","glob":"^7.1.1","minimist":"^1.2.0","mkdirp":"^0.5.1"},"devDependencies":{"rimraf":"^2.6.1","tap-spec":"^4.1.1","tape":"^4.6.3"},"scripts":{"test":"tape test/*.js | tap-spec"},"keywords":["cli","task","build","async","await","minify","uglify","promise","pipeline","generator","coroutine","automation","task runner","build system"],"engines":{"node":">= 4.6"},"gitHead":"d7ef509964dcf97185279b9fca24593c4db245c7","bugs":{"url":"https://github.com/lukeed/taskr/issues"},"_id":"taskr@0.9.0","_shasum":"d3a60b1ffa4eaf520dbd9ab184a1c744f927dc5d","_from":".","_npmVersion":"3.10.8","_nodeVersion":"6.9.1","_npmUser":{"name":"lukeed","email":"luke@lukeed.com"},"dist":{"shasum":"d3a60b1ffa4eaf520dbd9ab184a1c744f927dc5d","tarball":"https://registry.npmjs.org/taskr/-/taskr-0.9.0.tgz","integrity":"sha512-qWnM5Qd/oQgdFn6QlnPOyjYL7KETaSY9RoSPZemH4Kym1ANELmfNLssE920fx30d431kvgnGFjZTfb3HqJcJIw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDM0IauGYfwiNhwzFHTzbm5H+bGsnng5KPnI4pcXQw1fgIhAMsP32j/dkyo85j5OHQnwYyLM6yffDs388b06pUt0CRu"}]},"maintainers":[{"email":"luke@lukeed.com","name":"lukeed"},{"email":"constantin.titarenko@gmail.com","name":"titarenko"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/taskr-0.9.0.tgz_1497049383642_0.7730183084495366"},"directories":{}},"0.9.1":{"name":"taskr","version":"0.9.1","description":"Generator & Coroutine-based task runner. Fasten your seatbelt.","license":"MIT","repository":{"type":"git","url":"git+https://github.com/lukeed/taskr.git"},"homepage":"https://github.com/lukeed/taskr","author":{"name":"Luke Edwards","email":"luke@lukeed.com","url":"https://lukeed.com"},"main":"lib/fly.js","bin":{"taskr":"cli.js"},"files":["lib","cli.js"],"dependencies":{"bluebird":"^3.5.0","clor":"^5.1.0","glob":"^7.1.2","mkdirp":"^0.5.1","mri":"^1.1.0","tinydate":"^1.0.0"},"devDependencies":{"rimraf":"^2.6.1","tap-spec":"^4.1.1","tape":"^4.6.3"},"scripts":{"test":"tape test/*.js | tap-spec"},"keywords":["cli","task","build","async","await","minify","uglify","promise","pipeline","generator","coroutine","automation","task runner","build system"],"engines":{"node":">= 4.6"},"gitHead":"9ff83b2fa9467c547d6493bd9c3432923d30c281","bugs":{"url":"https://github.com/lukeed/taskr/issues"},"_id":"taskr@0.9.1","_shasum":"2312c472cee3573fb5f4569b1f1f15f8718e28aa","_from":".","_npmVersion":"3.10.8","_nodeVersion":"6.9.1","_npmUser":{"name":"lukeed","email":"luke@lukeed.com"},"dist":{"shasum":"2312c472cee3573fb5f4569b1f1f15f8718e28aa","tarball":"https://registry.npmjs.org/taskr/-/taskr-0.9.1.tgz","integrity":"sha512-AgPMl/ITj2KwnwklYXC733tJ1Hy3lE14glWL6iN6xZU4tsO4DWI9OmFJFAjsgexk0v/9549uIPWr7Xa4uVyDnw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIB2Dri/fbzfCgiFsawBDJguueDTd09BgnBWF7v3kasdVAiEA9srosct+Kfw/znSkOjaTjtMXIoMXFye9ZjS6YsFHIsU="}]},"maintainers":[{"name":"lukeed","email":"luke@lukeed.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/taskr-0.9.1.tgz_1497472269266_0.9858055126387626"},"directories":{}},"1.0.5":{"name":"taskr","version":"1.0.5","description":"Generator & Coroutine-based task runner. Fasten your seatbelt.","homepage":"https://github.com/lukeed/taskr","repository":{"type":"git","url":"git+https://github.com/lukeed/taskr.git"},"license":"MIT","author":{"name":"Luke Edwards","email":"luke@lukeed.com","url":"https://lukeed.com"},"types":"taskr.d.ts","main":"lib/taskr.js","bin":{"taskr":"cli.js"},"files":["lib","cli.js","taskr.d.ts"],"dependencies":{"bluebird":"^3.5.0","clor":"^5.1.0","glob":"^7.1.2","mkdirp":"^0.5.1","mri":"^1.1.0","tinydate":"^1.0.0"},"devDependencies":{"rimraf":"^2.6.1"},"scripts":{"test":"tape test/*.js | tap-spec"},"keywords":["cli","task","build","async","await","minify","uglify","promise","pipeline","generator","coroutine","automation","task runner","build system"],"engines":{"node":">= 4.6"},"bugs":{"url":"https://github.com/lukeed/taskr/issues"},"_id":"taskr@1.0.5","_shasum":"5dd18692b68716616fd767978af10a9eed4a58a4","_from":".","_npmVersion":"3.10.8","_nodeVersion":"6.9.1","_npmUser":{"name":"lukeed","email":"luke@lukeed.com"},"dist":{"shasum":"5dd18692b68716616fd767978af10a9eed4a58a4","tarball":"https://registry.npmjs.org/taskr/-/taskr-1.0.5.tgz","integrity":"sha512-6F4pb0ax9Cy1IHlQzO8XeZC/lDNWrQs19owc6Bd2amwyQumK4JUtH/caEVrduUdZrszeKBYt2cVgUu0NNGZxGg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDlk8RrFoLdTE0YAsgElJcJFvlGSq6ZUfuXcGh0nTsFaQIhAMsRfMBRid6Gxd0amxf6Xwb9eDPpKfgKaMJF3C6YbPZ6"}]},"maintainers":[{"name":"lukeed","email":"luke@lukeed.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/taskr-1.0.5.tgz_1497819826497_0.6749199968762696"},"directories":{}},"1.0.6":{"name":"taskr","version":"1.0.6","description":"Generator & Coroutine-based task runner. Fasten your seatbelt.","homepage":"https://github.com/lukeed/taskr","repository":{"type":"git","url":"git+https://github.com/lukeed/taskr.git"},"license":"MIT","author":{"name":"Luke Edwards","email":"luke@lukeed.com","url":"https://lukeed.com"},"types":"taskr.d.ts","main":"lib/taskr.js","bin":{"taskr":"cli.js"},"files":["lib","cli.js","taskr.d.ts"],"dependencies":{"bluebird":"^3.5.0","clor":"^5.1.0","glob":"^7.1.2","mk-dirs":"^1.0.0","mri":"^1.1.0","tinydate":"^1.0.0"},"devDependencies":{"rimraf":"^2.6.1"},"scripts":{"test":"tape test/*.js | tap-spec"},"keywords":["cli","task","build","async","await","minify","uglify","promise","pipeline","generator","coroutine","automation","task runner","build system"],"engines":{"node":">= 4.6"},"bugs":{"url":"https://github.com/lukeed/taskr/issues"},"_id":"taskr@1.0.6","_shasum":"6ba5b671f51703f780fb6335d3dc792cfcf9c192","_from":".","_npmVersion":"3.10.8","_nodeVersion":"6.9.1","_npmUser":{"name":"lukeed","email":"luke@lukeed.com"},"dist":{"shasum":"6ba5b671f51703f780fb6335d3dc792cfcf9c192","tarball":"https://registry.npmjs.org/taskr/-/taskr-1.0.6.tgz","integrity":"sha512-8nvQLIZTk/eZiQG5gShv9pie1UTU4yvpFpX6y+BwnrWED37FoMZMysRS5Ee7txSR2TXVUs3+iUyZtQ/77v/E0Q==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDzGe5qfFt/fPDQl1tCSNlwIxd2wNJshQOCp6o8gZbKRgIgOi4ZYr8OoobAVJthzjhBpph6x9b3wkyCaYXtJzHhi6I="}]},"maintainers":[{"name":"lukeed","email":"luke@lukeed.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/taskr-1.0.6.tgz_1498758170668_0.6774577179457992"},"directories":{}},"1.1.0":{"name":"taskr","version":"1.1.0","description":"Generator & Coroutine-based task runner. Fasten your seatbelt.","homepage":"https://github.com/lukeed/taskr","repository":{"type":"git","url":"git+https://github.com/lukeed/taskr.git"},"license":"MIT","author":{"name":"Luke Edwards","email":"luke@lukeed.com","url":"https://lukeed.com"},"types":"taskr.d.ts","main":"lib/taskr.js","bin":{"taskr":"cli.js"},"files":["lib","cli.js","taskr.d.ts"],"dependencies":{"bluebird":"^3.5.0","clor":"^5.1.0","glob":"^7.1.2","mk-dirs":"^1.0.0","mri":"^1.1.0","tinydate":"^1.0.0"},"devDependencies":{"rimraf":"^2.6.1"},"scripts":{"test":"tape test/*.js | tap-spec"},"keywords":["cli","task","build","async","await","minify","uglify","promise","pipeline","generator","coroutine","automation","task runner","build system"],"engines":{"node":">= 4.6"},"bugs":{"url":"https://github.com/lukeed/taskr/issues"},"_id":"taskr@1.1.0","_shasum":"4f29d0ace26f4deae9a478eabf9aa0432e884438","_from":".","_npmVersion":"3.10.10","_nodeVersion":"6.11.1","_npmUser":{"name":"lukeed","email":"luke@lukeed.com"},"dist":{"shasum":"4f29d0ace26f4deae9a478eabf9aa0432e884438","tarball":"https://registry.npmjs.org/taskr/-/taskr-1.1.0.tgz","integrity":"sha512-jELUxxTfAxR6ZRFV6S/8LRcNg/GnlhS/4x2WZjGDkfle9Bk+M/e8LutMy3GVeUcp1cJc8Oy/uuroqbDePLHunQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDUYfnHXW1/qf2CLAP/kwJ2hIGtclUnygZMOTahkN2wQAIgCKl6PNHp6oPxxEgfvu2GgCJWliaY7eYbCWW18hq9P04="}]},"maintainers":[{"name":"lukeed","email":"luke@lukeed.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/taskr-1.1.0.tgz_1501187824301_0.9035519321914762"},"directories":{}}},"homepage":"https://github.com/lukeed/taskr","keywords":["cli","task","build","async","await","minify","uglify","promise","pipeline","generator","coroutine","automation","task runner","build system"],"repository":{"type":"git","url":"git+https://github.com/lukeed/taskr.git"},"author":{"name":"Luke Edwards","email":"luke@lukeed.com","url":"https://lukeed.com"},"bugs":{"url":"https://github.com/lukeed/taskr/issues"},"license":"MIT","readmeFilename":"readme.md","users":{"titarenko":true,"program247365":true,"tiggerhyun":true,"flumpus-dev":true}}