Comparing version 1.2.1 to 1.3.0
149
index.js
"use strict"; | ||
var Promise = require('bluebird'); | ||
var hooks = {}; | ||
var beforeHooks = {}; | ||
var afterHooks = {}; | ||
var store = require('./store'); | ||
var extend = require('extend'); | ||
var NORMAL = 1; | ||
var BEFORE = 2; | ||
var AFTER = 3; | ||
function register(hookName, fn) { | ||
if (Array.isArray(hookName)) { | ||
hookName.forEach(function(hook) { | ||
register(hook, fn); | ||
function addHook(type, name, key, fn) { | ||
if (Array.isArray(name)) { | ||
name.forEach(function(n) { | ||
addHook(type, n, key, fn); | ||
}); | ||
return; | ||
} | ||
if (!hooks[hookName]) { | ||
hooks[hookName] = []; | ||
if (typeof key === "function") { | ||
fn = key; | ||
key = undefined; | ||
} | ||
hooks[hookName].push(fn); | ||
store.add(type, name, { | ||
fn: fn, | ||
key: key | ||
}); | ||
} | ||
module.exports.register = register; | ||
exports.register = addHook.bind(this, NORMAL); | ||
function runHook(fns, args) { | ||
exports.before = addHook.bind(this, BEFORE); | ||
exports.after = addHook.bind(this, AFTER); | ||
function runHook(hooks, args) { | ||
var current = Promise.resolve(); | ||
if (!fns) { | ||
fns = []; | ||
if (!hooks) { | ||
hooks = []; | ||
} | ||
return Promise.all(fns.map(function(fn){ | ||
var results = {}; | ||
return Promise.all(hooks.map(function(hook){ | ||
var fn = hook.fn; | ||
current = current.then(function() { | ||
return fn.apply(this, args); | ||
}); | ||
return current; | ||
})); | ||
return current.then(function(result) { | ||
if (hook.key) { | ||
results[hook.key] = result; | ||
} | ||
return result; | ||
}); | ||
})).then(function() { | ||
return results; | ||
}); | ||
} | ||
function runHookParallel(fns, args) { | ||
if (!fns) { | ||
fns = []; | ||
function runHookParallel(hooks, args) { | ||
if (!hooks) { | ||
hooks = []; | ||
} | ||
return Promise.all(fns.map(function(fn){ | ||
return Promise.all(hooks.map(function(hook){ | ||
var fn = hook.fn; | ||
return fn.apply(this, args); | ||
})); | ||
})).then(function(results) { | ||
var props = {}; | ||
results.forEach(function(result, index) { | ||
var key = hooks[index].key; | ||
if (key) { | ||
props[key] = result; | ||
} | ||
}); | ||
return props; | ||
}); | ||
} | ||
module.exports.run = function(hook) { | ||
exports.run = function(name) { | ||
var result = {}; | ||
var args = Array.prototype.slice.call(arguments); | ||
@@ -52,11 +81,16 @@ | ||
return runHook(beforeHooks[hook], args).then(function() { | ||
return runHook(hooks[hook], args); | ||
}).then(function() { | ||
return runHook(afterHooks[hook], args); | ||
return runHook(store.get(BEFORE, name), args).then(function(beforeResult) { | ||
result = extend(result, beforeResult); | ||
return runHook(store.get(NORMAL, name), args); | ||
}).then(function(normalResult) { | ||
result = extend(result, normalResult); | ||
return runHook(store.get(AFTER, name), args); | ||
}).then(function(afterResult) { | ||
result = extend(result, afterResult); | ||
return result; | ||
}); | ||
}; | ||
module.exports.parallel = function(hook) { | ||
exports.parallel = function(name) { | ||
var result = {}; | ||
var args = Array.prototype.slice.call(arguments); | ||
@@ -67,6 +101,11 @@ | ||
return runHookParallel(beforeHooks[hook], args).then(function() { | ||
return runHookParallel(hooks[hook], args); | ||
}).then(function() { | ||
return runHookParallel(afterHooks[hook], args); | ||
return runHookParallel(store.get(BEFORE, name), args).then(function(beforeResult) { | ||
result = extend(result, beforeResult); | ||
return runHookParallel(store.get(NORMAL, name), args); | ||
}).then(function(normalResult) { | ||
result = extend(result, normalResult); | ||
return runHookParallel(store.get(AFTER, name), args); | ||
}).then(function(afterResult) { | ||
result = extend(result, afterResult); | ||
return result; | ||
}); | ||
@@ -76,43 +115,5 @@ }; | ||
module.exports.___clearHooks = function(hookName) { | ||
if (typeof hookName !== "undefined") { | ||
hooks[hookName] = []; | ||
beforeHooks[hookName] = []; | ||
afterHooks[hookName] = []; | ||
return true; | ||
} | ||
hooks = {}; | ||
beforeHooks = {}; | ||
afterHooks = {}; | ||
exports.___clearHooks = function(name) { | ||
store.clear(name); | ||
}; | ||
function before(hookName, fn) { | ||
if (Array.isArray(hookName)) { | ||
hookName.forEach(function(hook) { | ||
before(hook, fn); | ||
}); | ||
return; | ||
} | ||
if (!beforeHooks[hookName]) { | ||
beforeHooks[hookName] = []; | ||
} | ||
beforeHooks[hookName].push(fn); | ||
} | ||
module.exports.before = before; | ||
function after(hookName, fn) { | ||
if (Array.isArray(hookName)) { | ||
hookName.forEach(function(hook) { | ||
after(hook, fn); | ||
}); | ||
return; | ||
} | ||
if (!afterHooks[hookName]) { | ||
afterHooks[hookName] = []; | ||
} | ||
afterHooks[hookName].push(fn); | ||
} | ||
module.exports.after = after; |
{ | ||
"name": "pudge", | ||
"version": "1.2.1", | ||
"version": "1.3.0", | ||
"description": "simple node.js hook utility", | ||
@@ -25,3 +25,4 @@ "main": "index.js", | ||
"dependencies": { | ||
"bluebird": "2.10.2" | ||
"bluebird": "2.10.2", | ||
"extend": "^3.0.0" | ||
}, | ||
@@ -28,0 +29,0 @@ "devDependencies": { |
55
test.js
@@ -7,2 +7,3 @@ "use strict"; | ||
var assert = require('assert'); | ||
var store = require('./store'); | ||
@@ -78,2 +79,24 @@ describe('Pudge', function() { | ||
it('should map the results', function() { | ||
it('should map the results', function(done) { | ||
pudge.register('ROOT', 'head', function() { | ||
return Promise.delay(10).then(function() { | ||
return "I_AM_HEAD"; | ||
}); | ||
}); | ||
pudge.register('ROOT', 'leg', function() { | ||
return Promise.delay(10).then(function() { | ||
return "I_AM_LEG"; | ||
}); | ||
}); | ||
pudge.run('ROOT').then(function(results) { | ||
assert(results.leg === "I_AM_LEG"); | ||
assert(results.head === "I_AM_HEAD"); | ||
done(); | ||
}).catch(done); | ||
}); | ||
}); | ||
describe('parallel', function() { | ||
@@ -104,3 +127,35 @@ it('should run tasks in parallel', function(done) { | ||
}); | ||
it('should map the results', function(done) { | ||
pudge.register('ROOT', 'head', function() { | ||
return Promise.delay(10).then(function() { | ||
return "I_AM_HEAD"; | ||
}); | ||
}); | ||
pudge.register('ROOT', 'leg', function() { | ||
return Promise.delay(10).then(function() { | ||
return "I_AM_LEG"; | ||
}); | ||
}); | ||
pudge.parallel('ROOT').then(function(results) { | ||
assert(results.leg === "I_AM_LEG"); | ||
assert(results.head === "I_AM_HEAD"); | ||
done(); | ||
}).catch(done); | ||
}); | ||
}); | ||
describe('store', function() { | ||
beforeEach(function() { | ||
store.clear(); | ||
}); | ||
it('should add and get from store', function() { | ||
store.add('normal', 'FRESH_MEAT', 'something'); | ||
var result = store.get('normal', 'FRESH_MEAT'); | ||
assert(result[0] === 'something'); | ||
}); | ||
}); | ||
}); |
11741
8
260
2
+ Addedextend@^3.0.0
+ Addedextend@3.0.2(transitive)