shortcake
Version:
Asynchronous invoke and other goodies for cake.
489 lines (415 loc) • 9.71 kB
JavaScript
import 'postmortem/register';
import exec from 'executive';
import path from 'path';
import vigil from 'vigil';
import cp from 'cp';
import fs from 'fs';
import chalk from 'chalk';
// src/utils.coffee
var isFunction = function(fn) {
return typeof fn === 'function';
};
var isGeneratorFn = function(fn) {
var ref;
if (!isFunction(fn)) {
return false;
}
return (fn != null ? (ref = fn.constructor) != null ? ref.name : void 0 : void 0) === 'GeneratorFunction';
};
var isPromise = function(p) {
return isFunction(p != null ? p.then : void 0);
};
var isArray = function(a) {
return Array.isArray(a);
};
var isString = function(s) {
return typeof s === 'string';
};
// src/cp.coffee
var cp$1 = function(src, dst, opts, cb) {
var p, ref;
if (isFunction(opts)) {
ref = [{}, opts], opts = ref[0], cb = ref[1];
}
if (opts == null) {
opts = {};
}
p = new Promise(function(resolve, reject) {
return fs.stat(dst, function(err, stats) {
if (stats.isDirectory) {
dst = path.join(dst, path.basename(src));
}
return cp(src, dst, function(err) {
if (err != null) {
return reject(err);
} else {
return resolve();
}
});
});
});
p.callback(cb);
return p;
};
// src/cake.coffee
var cake;
var cakeInvoke;
var cakeOption;
var cakeTask;
if (global.task == null) {
require('coffee-script/lib/coffee-script/cake');
}
cakeInvoke = global.invoke;
cakeOption = global.option;
cakeTask = global.task;
var cake$1 = cake = {
invoke: cakeInvoke,
option: cakeOption,
task: cakeTask
};
// src/log.coffee
var k;
var logger;
var methods;
var pretty;
var ref;
var v;
var verbose;
var wrapper$1;
var slice = [].slice;
verbose = (ref = process.env.VERBOSE) != null ? ref : false;
pretty = function(obj) {
return JSON.stringify(obj, null, 2);
};
logger = function(method, color) {
var prefix;
prefix = chalk[color](method);
return function() {
var arg, args, i, len, msg;
args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
if (!verbose) {
return;
}
msg = prefix;
for (i = 0, len = args.length; i < len; i++) {
arg = args[i];
if (isString(arg)) {
msg += ' ' + arg;
} else {
msg += '\n' + pretty(arg);
}
}
return console.log(msg);
};
};
methods = {
debug: 'blue',
info: 'white',
warn: 'yellow',
error: 'red',
bebop: 'black',
modified: 'cyan',
compiled: 'blue'
};
wrapper$1 = logger('info', 'white');
for (k in methods) {
v = methods[k];
wrapper$1[k] = logger(k, v);
}
wrapper$1.verbose = function(bool) {
if (bool == null) {
bool = !verbose;
}
return verbose = bool;
};
var log = wrapper$1;
// src/running.coffee
var running;
var runningTasks;
runningTasks = {};
running = function(name) {
return runningTasks[name];
};
running.start = function(name) {
log.info('running', name);
return runningTasks[name] = true;
};
running.stop = function(name) {
log.info('stopped', name);
return runningTasks[name] = false;
};
var running$1 = running;
// src/invoke/async.coffee
var invokeAsync;
invokeAsync = function(name, action, opts, cb) {
var done;
log.debug('invokeAsync', name);
running$1.start(name);
done = function() {
running$1.stop(name);
return cb.apply(null, arguments);
};
if (opts != null) {
return action(opts, done);
} else {
return action(done);
}
};
var invokeAsync$1 = invokeAsync;
// src/invoke/generator.coffee
var invokeGenerator;
invokeGenerator = function(name, action, opts, cb) {
var done, gen, last, next, prev;
log.debug('invokeGenerator', name);
running$1.start(name);
gen = action(opts);
last = null;
prev = null;
done = function(err) {
running$1.stop(name);
if (err != null) {
console.error(err.stack);
}
return cb(err, last != null ? last : prev);
};
next = function(value) {
var err, promise, res;
try {
res = gen.next(value);
} catch (error) {
err = error;
console.error(err.stack);
return done(err);
}
prev = last;
last = res.value;
if (isPromise(promise = res.value)) {
return promise.then(function(value) {
return next(value);
})["catch"](function(err) {
return done(err);
});
} else if (!res.done) {
return next(res.value);
} else {
return done();
}
};
return next();
};
var invokeGenerator$1 = invokeGenerator;
// src/invoke/sync.coffee
var invokeSync;
invokeSync = function(name, action, opts, cb) {
var promise, ret;
log.debug('invokeSync', name);
running$1.start(name);
ret = action(opts);
if (isPromise(promise = ret)) {
return promise.then(function(value) {
running$1.stop(name);
return cb(null, value);
})["catch"](function(err) {
running$1.stop(name);
return cb(err);
});
} else {
running$1.stop(name);
return cb(null, ret);
}
};
var invokeSync$1 = invokeSync;
// src/invoke/serial.coffee
var invokeSerial;
invokeSerial = function(tasks, opts, cb) {
var serial;
log.debug('invokeSerial', tasks, opts);
serial = function(cb) {
var next;
next = function(err) {
if (err != null) {
return cb(err);
}
if (tasks.length) {
return invoke$2(tasks.shift(), opts, next);
} else {
return cb();
}
};
return next();
};
if (isFunction(cb)) {
return serial(cb);
}
return new Promise(function(resolve, reject) {
return serial(function(err) {
if (err != null) {
reject(err);
}
resolve();
if (isFunction(cb)) {
return cb(err);
}
});
});
};
var serial = invokeSerial;
// src/tasks.coffee
var tasks;
tasks = {};
tasks.has = function(key) {
return tasks[key] != null;
};
var tasks$1 = tasks;
// src/invoke/invoke.coffee
var invoke$1;
var invoked;
invoked = {};
invoke$1 = function(name, opts, cb) {
var action, deps, done, invokeAction, options, ref;
log.debug('invoke');
if (invoked[name]) {
return;
}
invoked[name] = true;
cake$1.invoke(name);
ref = tasks$1[name], action = ref.action, deps = ref.deps, options = ref.options;
opts = Object.assign(options, opts);
done = function(err) {
invoked = {};
if (isFunction(cb)) {
return cb(err);
}
};
invokeAction = function(err) {
if (err != null) {
return done(err);
}
if (isGeneratorFn(action)) {
return invokeGenerator$1(name, action, opts, done);
}
if (action.length === 2) {
return invokeAsync$1(name, action, opts, done);
}
if (/^function \((callback|cb|done|next)\)/.test(action)) {
return invokeAsync$1(name, action, null, done);
}
return invokeSync$1(name, action, opts, done);
};
return serial(deps, opts, invokeAction);
return invokeAction();
};
var invoke$2 = invoke$1;
// src/invoke/parallel.coffee
var invokeParallel;
invokeParallel = function(tasks, opts, cb) {
var parallel;
log.debug('invokeParallel', tasks, opts);
parallel = function(cb) {
var done, i, len, results, task;
done = 0;
results = [];
for (i = 0, len = tasks.length; i < len; i++) {
task = tasks[i];
results.push(invoke$2(task, opts, function() {
if (++done === tasks.length) {
return cb();
}
}));
}
return results;
};
if (isFunction(cb)) {
return parallel(cb);
}
return new Promise(function(resolve, reject) {
return parallel(function(err) {
if (err != null) {
reject(err);
}
resolve();
if (isFunction(cb)) {
return cb(err);
}
});
});
};
var parallel = invokeParallel;
// src/invoke/index.coffee
var wrap;
var wrapper;
wrap = function(fn) {
return function(tasks, opts, cb) {
var ref;
if (!isArray(tasks)) {
tasks = [tasks];
}
if (isFunction(opts)) {
ref = [opts, {}], cb = ref[0], opts = ref[1];
}
if (opts == null) {
opts = {};
}
return fn(tasks, opts, cb);
};
};
wrapper = wrap(serial);
wrapper.serial = wrapper;
wrapper.parallel = wrap(parallel);
var invoke = wrapper;
// src/task.coffee
var task = function(name, description, deps, action) {
var ref, ref1, ref2;
if (isArray(description)) {
if (isFunction(deps)) {
action = deps;
}
ref = ['', description], description = ref[0], deps = ref[1];
}
if (isFunction(description)) {
ref1 = [description, '', []], action = ref1[0], description = ref1[1], deps = ref1[2];
}
if (isFunction(deps)) {
ref2 = [deps, []], action = ref2[0], deps = ref2[1];
}
if (!isFunction(action)) {
action = function() {};
}
tasks$1[name] = {
name: name,
description: description,
deps: deps,
action: action
};
log.debug('added task', tasks$1[name]);
return cake$1.task(name, description, function(options) {
return tasks$1[name].options = options;
});
};
// src/use.coffee
var use = function(pkg, opts) {
if (opts == null) {
opts = {};
}
if (isString(pkg)) {
pkg = require(pkg);
}
if (isFunction(pkg)) {
return pkg(opts);
}
};
// src/index.coffee
var binPath;
binPath = path.join(process.cwd(), 'node_modules/', '.bin');
process.env.PATH = ([binPath].concat(process.env.PATH.split(':'))).join(':');
global.cp = cp$1;
global.exec = exec;
global.invoke = invoke;
global.running = running$1;
global.task = task;
global.tasks = tasks$1;
global.use = use;
global.walk = vigil.walk;
global.watch = vigil.watch;
export { cp$1 as cp, exec, invoke, running$1 as running, task, tasks$1 as tasks, use };
//# sourceMappingURL=shortcake.mjs.map