diff options
Diffstat (limited to 'lib/autoInject.js')
-rw-r--r-- | lib/autoInject.js | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/lib/autoInject.js b/lib/autoInject.js new file mode 100644 index 0000000..f84a4d9 --- /dev/null +++ b/lib/autoInject.js @@ -0,0 +1,46 @@ +import auto from './auto'; +import forOwn from 'lodash/forOwn'; +import arrayMap from 'lodash/_arrayMap'; +import clone from 'lodash/_baseClone'; +import isArray from 'lodash/isArray'; + +var argsRegex = /^function\s*[^\(]*\(\s*([^\)]*)\)/m; + +function parseParams(func) { + return func.toString().match(argsRegex)[1].split(/\s*\,\s*/); +} + +export default function autoInject(tasks, callback) { + var newTasks = {}; + + forOwn(tasks, function (taskFn, key) { + var params; + + if (isArray(taskFn)) { + params = clone(taskFn); + taskFn = params.pop(); + + newTasks[key] = clone(params).concat(newTask); + } else if (taskFn.length === 0) { + throw new Error("autoInject task functions require explicit parameters."); + } else if (taskFn.length === 1) { + // no dependencies, use the function as-is + newTasks[key] = taskFn; + } else { + params = parseParams(taskFn); + params.pop(); + + newTasks[key] = clone(params).concat(newTask); + } + + function newTask(results, taskCb) { + var newArgs = arrayMap(params, function (name) { + return results[name]; + }); + newArgs.push(taskCb); + taskFn.apply(null, newArgs); + } + }); + + auto(newTasks, callback); +} |