planify
Version:
Plan a series of steps and display the output in a beautiful way
73 lines (59 loc) • 1.89 kB
JavaScript
;
const Promise = require('bluebird');
const get = require('lodash/get');
const set = require('lodash/set');
const cloneDeep = require('lodash/cloneDeep');
function promisify(fn, length) {
// Check if this is callback usage
if (fn.length > length) {
return function () {
const args = Array.from(arguments);
return new Promise((resolve, reject) => {
args.push((err) => {
if (err) {
reject(err);
} else {
resolve();
}
});
fn.apply(null, args);
});
};
}
// Otherwise its a promise or a sync return value
return function () {
try {
return Promise.resolve(fn.apply(null, arguments));
} catch (err) {
return Promise.reject(err);
}
};
}
const reporterMethods = [
{ name: 'plan.start', length: 1 },
{ name: 'plan.ok', length: 1 },
{ name: 'plan.fail', length: 2 },
{ name: 'plan.finish', length: 1 },
{ name: 'phase.start', length: 1 },
{ name: 'phase.ok', length: 1 },
{ name: 'phase.fail', length: 2 },
{ name: 'phase.finish', length: 1 },
{ name: 'step.start', length: 1 },
{ name: 'step.write.stdout', length: 4 },
{ name: 'step.write.stderr', length: 4 },
{ name: 'step.ok', length: 1 },
{ name: 'step.fail', length: 2 },
{ name: 'step.finish', length: 1 },
];
function promisifyReporter(reporter) {
reporter = cloneDeep(reporter);
reporterMethods.forEach((method) => {
const fn = get(reporter, method.name);
if (fn) {
set(reporter, method.name, promisify(fn, method.length));
}
});
return reporter;
}
module.exports = promisify;
module.exports.reporter = promisifyReporter;