npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

taskify

v3.1.0

Published

Simple Atomic Task Definition for Node and the Browser

Downloads

32

Readme

Taskify

This is a simple task execution helper that is heavily influenced from jake and grunt. It's kind of like jake but without the build goodies, and designed to work in the browser as well as node.

NPM

Build Status bitHound Score

Example Usage

NOTE: From the 2.0 release of taskify has been redesigned to isolate the task registry into well defined scopes. As such a new instance of taskify needs to be created when requiring the module.

The first step with using taskify is to require the module and create a new task registry scope:

var task = require('taskify')();

Then you can start defining tasks:

task('a', function() {
  console.log('a');
});

Then define another task that relies on task a:

task('b', ['a'], function() {
  console.log('b');
});

Run task b:

task.run('b');

Which would generate the following output:

a
b

Asynchronous Behaviour

Specifying that a task handler behaves asynchronously is very similar to the way you would do this in a grunt task:

task('c', function() {
  // call the async method of the task (passed to the runner as this)
  var done = this.async();

  // when the task has been completed call done
  // the first argument is reserved for an error (if one occured)
  // and subsequent arguments will be placed on the context.results object
  setTimeout(function() {
    done();
  }, 1000);
});

Or a slightly less contrived example:

task('load-data', function() {
  fs.readFile(path.resolve('data.txt'), 'utf8', this.async());
});

Capturing Result Data

When you call the task.run function, Taskify creates a new ExecutionContext for the task dependency tree that will be executed. This execution context is not persistent though and only lasts until the requested tasks have completed their execution (or you capture the reference).

To capture the results of a task execution you will need to handle the complete event for a particular task. Let's look at the simple example of our load-data task from before:

task.run('load-data').on('complete', function(err) {
  if (err) return;

  console.log('loaded data: '  + this.context.results['load-data']);
});

Additionally, because Taskify uses eve under the hood for eventing, you can implement eve handlers to capture the complete events also:

eve.on('taskify.complete.load-data', function(err) {
  if (err) return;

  console.log('loaded data: '  + this.context.results['load-data']);
});

Argument Passing

When running a task using the task.run function (or by running the bound function returned from a task.select) call, you can supply arguments that will be passed to that task handler and all precondition tasks.

As an example, let's pass console.log as a task handler:

task('log', console.log);

And then run the task passing through the message arguments:

task.run('log', 'Hi there', { test: true });

This would generate the following output:

Hi there { test: true }

Taskify Reference

task(name, opts, runner)

Register a new task with the taskify registry.

task.get(name)

Retrieve a task from the registry.

task.prepare

Prepare task(s) to execute, returning a function that will accept arguments that will be passed through to the tasks

task.select

The select function passes control through to the taskify.prepare function, but only once it has validated that task dependencies have been satisfied. If dependencies cannot be satisfied then an Error will be thrown.

task.run(target, args*)

Run the specified task, with the provided arguments.

alias: task.spawn

task.exec(args, callback)

Using the args specified, run a task and execute the callback once the task has completed. The task name is passed in args[0] with args.slice(1) containing any parameters that should be passed to the task when it is run.

The task.exec function has been optimized for use with a pull-stream sink.

ExecutionContext

exec(task, atgs)

Execute the specified task passing the args to the runner

TaskDefinition

depends(names)

isValid(missingDeps)

The valid method looks for the dependencies of the task and attempts to retrieve them from the taskify registry. If all dependencies are resolved, isValid will return true, or false if not.

If the method is provided an array for the missingDeps argument, unresolved task names will be pushed onto the array and can be accessed for diagnosis of the error.

unresolved()

Return the names of any unresolved dependencies

TaskProxy

The TaskProxy provides access to the TaskDefinition information but provides state isolation during task execution.

async()

Specify that the task should execute asynchronously

complete(err)

@id

The id property is used to return the unique id for the task proxy. The id is the initially generated combined prefixed with the definition name. For instance if the TaskDefinition name is test and the _id generated for the proxy is 1, then the id property will return test.1

@fallback

Return the fallback task specified in the task definition

@name

The name property is used to proxy the definition name to the proxy

@promise

The promise property allows tasks to operate seamlessly within a promises implementation. At this stage taskify looks to use Q by default, but can also work with other promise implementations that implement a <packagename>.defer() function as a way of creating a new Deferred instance (such as when.js).

To update taskify to use a library other than the default of Q simply update the taskify defaults.

License(s)

MIT

Copyright (c) 2015 Damon Oehlman [email protected]

Permission 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:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE 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.