ama-team/voxengine-stubs

View on GitHub
tasks/Support/index.js

Summary

Maintainability
A
1 hr
Test Coverage
/* global jake, complete, fail */
var Path = require('path')

var Workspace = require('../Workspace')

var Support = {
  exec: function (args) {
    return new Promise(function (resolve, reject) {
      var options = {printStdout: true, printStderr: true, breakOnError: false}
      var exec = jake.exec(args.join(' '), options, resolve)
      exec.addListener('error', reject)
    })
  },
  supersede: function (args) {
    Support.promise(Support.exec(args))
  },
  chain: function (tasks, suppressErrors, callback) {
    var errors = []
    callback = callback || function (error, value) {
      error ? fail(error) : complete(value)
    }
    tasks = tasks.map(function (task) {
      if (typeof task === 'string' || task instanceof String) {
        return jake.Task[task]
      }
      return task
    })
    var first = tasks.shift()
    var last = tasks.reduce(function (carrier, task) {
      carrier.addListener('complete', task.invoke.bind(task))
      carrier.addListener('fail', function (error) {
        if (!suppressErrors) {
          return fail(error)
        }
        errors.push(error)
        task.invoke()
      })
      return task
    }, first)
    last.addListener('complete', function (value) {
      callback(errors.pop(), value)
    })
    last.addListener('fail', callback)
    first.invoke()
  },
  promise: function (promise) {
    promise.then(complete, setTimeout.bind(global, fail, 0))
  },
  executable: function (name) {
    return Path.join(Workspace.modules, '.bin', name)
  }
}

module.exports = Support