node package manager
Share your code. npm Orgs help your team discover, share, and reuse code. Create a free org »

composer

composer NPM version NPM monthly downloads NPM total downloads Linux Build Status Windows Build Status

API-first task runner with three methods: task, run and watch.

Table of Contents

(TOC generated by verb using markdown-toc)

Install

Install with npm:

$ npm install --save composer

Install with yarn:

$ yarn add composer

Heads up the .watch method was removed in version 0.11.0. If you need watch functionality, use base-tasks and base-watch.

Usage

var Composer = require('composer');

API

.task

Register a new task with it's options and dependencies.

Dependencies may also be specified as a glob pattern. Be aware that the order cannot be guarenteed when using a glob pattern.

Params

  • name {String}: Name of the task to register
  • options {Object}: Options to set dependencies or control flow.
  • options.deps {Object}: array of dependencies
  • options.flow {Object}: How this task will be executed with it's dependencies (series, parallel, settleSeries, settleParallel)
  • deps {String|Array|Function}: Additional dependencies for this task.
  • fn {Function}: Final function is the task to register.
  • returns {Object}: Return the instance for chaining

Example

// register task "site" with composer
app.task('site', ['styles'], function() {
  return app.src('templates/pages/*.hbs')
    .pipe(app.dest('_gh_pages'));
});

.build

Build a task or array of tasks.

Params

  • tasks {String|Array}: Array of task names to build. (Defaults to [default]).
  • options {Object}: Optional options object to merge onto each task's options when building.
  • cb {Function}: Optional callback function to be called when all tasks are finished building. If omitted, a Promise is returned.
  • returns {Promise}: When cb is omitted, a Promise is returned that will resolve when the tasks are finished building.

Example

app.build('default', function(err, results) {
  if (err) return console.error(err);
  console.log(results);
});

.series

Compose task or list of tasks into a single function that runs the tasks in series.

Params

  • tasks {String|Array|Function}: List of tasks by name, function, or array of names/functions.
  • returns {Function}: Composed function that may take a callback function.

Example

app.task('foo', function(done) {
  console.log('this is foo');
  done();
});
 
var fn = app.series('foo', function bar(done) {
  console.log('this is bar');
  done();
});
 
fn(function(err) {
  if (err) return console.error(err);
  console.log('done');
});
//=> this is foo
//=> this is bar
//=> done

.parallel

Compose task or list of tasks into a single function that runs the tasks in parallel.

Params

  • tasks {String|Array|Function}: List of tasks by name, function, or array of names/functions.
  • returns {Function}: Composed function that may take a callback function.

Example

app.task('foo', function(done) {
  setTimeout(function() {
    console.log('this is foo');
    done();
  }, 500);
});
 
var fn = app.parallel('foo', function bar(done) {
  console.log('this is bar');
  done();
});
 
fn(function(err) {
  if (err) return console.error(err);
  console.log('done');
});
//=> this is bar
//=> this is foo
//=> done

Task execution

When an individual task is executed (or run), a new Run instance is created with start, end, and duration information. This run object is emitted with some events and also exposed on the task instance as the .runInfo property.

The run instance has the the following properties

.date

The .date property is an object containing the .start and .end date timestamps created with new Date().

.hr

The .hr property is an object containing the .start, .end and .duration properties that are created by using process.hrtime(). These properties are the actual arrays returned from process.hrtime(). There is also .diff and .offset computed properties that use the other properties to calculate the difference between .start and .end times (.diff) and the offset (error for time calculations) between the .duration and the .diff (this is usually very small).

.duration

The .duration property is a computed property that uses pretty-time to format the .hr.duration value into a human readable format.

Events

composer is an event emitter that may emit the following events:

build

This event is emitted when the build is starting and when it's finished. The event emits an object containing the build runtime information.

app.on('build', function(build) {});
  • build exposes a .app object that is the instance of composer.
  • build exposes a .status property that is either starting or finished.
  • build exposes a .date object that has a .start property containing the start time as a Date object.
  • build exposes a .hr object that has a .start property containing the start time as an hrtime array.
  • build exposes a .duration getter that will provide the duration in a human readable format.
  • build exposes a .diff getter that will provide the diff between the start and end times.
  • build exposes a .offset getter that will provide the offset between the start date and the start hr time in case it's necessary for timing calculations.
  • when build.status is finished, the .hr object also has .duration and .diff properties containing timing information calculated using process.hrtime.

task

This event is emitted when the task is registered, starting, and when it's finished. The event emits 2 arguments, the current instance of the task object and an object containing the task runtime information.

app.on('task', function(task, run) {});

The task parameter exposes:

  • .status {String}: current status of the task. May be register, starting, or finished.

The run parameter exposes:

  • .date {Object}: has a .start property containing the start time as a Date object.
  • .hr {Object}: has a .start property containing the start time as an hrtime array.
  • .duration getter that will provide the duration in a human readable format.
  • .diff getter that will provide the diff between the start and end times.
  • .offset getter that will provide the offset between the start date and the start hr time in case it's necessary for timing calculations.
  • when task.status is finished, the .hr object also has .duration and .diff properties containing timing information calculated using process.hrtime.

error

This event is emitted when an error occurrs during a build. The event emits 1 argument as an Error object containing additional information about the build and the task running when the error occurred.

app.on('error', function(err) {});

Additional properties:

  • app: current composer instance running the build
  • build: current build runtime information
  • task: current task instance running when the error occurred
  • run: current task runtime information

History

v1.0.0

  • Updates the events that are emitted and adds statuses to the objects emitted on the events. see issues #20 and #21
  • Updates the event objects to expose human readable durations. see issue #23
  • Removes unused properties. see issue #24
  • Updates .build to return a promise when the callback is not passed in. see issue #28

v0.14.0

  • Updates bach to 1.0.0.
  • Errors emitted from inside a task now have the 'in task "foo":' prefixed to the error message. see issue #22
  • Expose .runInfo on the task object for use in event listeners and task functions.
  • Add .duration to the .run/.runInfo object that shows the duration in a human friendly format. This will also show the current duration from the time the task started to the time it's called if used inside a task function. see issue #23
app.task('foo', function(cb) {
  console.log(this.runInfo.duration);
});

v0.13.0

  • Skip tasks by setting the options.skip option to the name of the task or an array of task names.
  • Making additional err properties non-enumerable to cut down on error output.

v0.12.0

  • You can no longer get a task from the .task() method by passing only the name. Instead do var task = app.tasks[name];
  • Passing only a name and no dependencies to .task() will result in a noop task being created.
  • options may be passed to .build(), .series() and .parallel()
  • options passed to .build() will be merged onto task options before running the task.
  • Skip tasks by setting their options.run option to false.

v0.11.3

  • Allow passing es2015 javascript generator functions to .task().

v0.11.2

  • Allow using glob patterns for task dependencies.

v0.11.0

  • BREAKING CHANGE: Removed .watch(). Watch functionality can be added to base applications using base-watch.

v0.10.0

  • Removes session.

v0.9.0

  • Use default when no tasks are passed to .build().

v0.8.4

  • Ensure task dependencies are unique.

v0.8.2

  • Emitting task when adding a task through .task()
  • Returning task when calling .task(name) with only a name.

v0.8.0

  • Emitting task:* events instead of generic * events. See event docs for more information.

v0.7.0

  • No longer returning the current task when .task() is called without a name.
  • Throwing an error when .task() is called without a name.

v0.6.0

  • Adding properties to err instances and emitting instead of emitting multiple parameters.
  • Adding series and parallel flows/methods.

v0.5.0

  • BREAKING CHANGE Renamed .run() to .build()

v0.4.2

  • .watch returns an instance of FSWatcher

v0.4.1

  • Currently running task returned when calling .task() without a name.

v0.4.0

  • Add session-cache to enable per-task data contexts.

v0.3.0

  • Event bubbling/emitting changed.

v0.1.0

  • Initial release.

About

Related projects

Contributing

Pull requests and stars are always welcome. For bugs and feature requests, please create an issue.

Contributors

Commits Contributor
216 doowb
36 jonschlinkert

Building docs

(This project's readme.md is generated by verb, please don't edit the readme directly. Any changes to the readme must be made in the .verb.md readme template.)

To generate the readme, run the following command:

$ npm install -g verbose/verb#dev verb-generate-readme && verb

Running tests

Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command:

$ npm install && npm test

Author

Jon Schlinkert

License

Copyright © 2018, Jon Schlinkert. Released under the MIT License.


This file was generated by verb-generate-readme, v0.6.0, on January 26, 2018.