UNPKG

2.27 kBJavaScriptView Raw
1'use strict';
2const RunTask = require('runtask');
3const async = require('async');
4const parentRequire = require('parent-require');
5const path = require('path');
6const cachedTasks = {};
7
8module.exports = function(config, log, loadConfig, allDone) {
9 const runner = new RunTask();
10 // get list of all tasks:
11 const taskList = Object.keys(config.tasks);
12 // register all tasks with a wrapper that will lazy-load/cache it if its actually used
13 async.each(taskList, (name, next) => {
14 const task = config.tasks[name];
15 let taskFn;
16 if (Array.isArray(task)) { //task maps to other tasks
17 taskFn = task;
18 } else { // task is wrapped by a function that will lazy-load/cache it:
19 taskFn = (callback) => {
20 const start = new Date().getTime();
21 if (!cachedTasks[name]) {
22 log([name], `Running ${name}...`);
23 let Cls = null;
24 try {
25 //try to load in current project
26 let taskPath = task;
27 if (task[0] !== '/') {
28 taskPath = path.join(process.cwd(), 'node_modules', task);
29 }
30 Cls = require(taskPath);
31 } catch (e) {
32 //use if layer on top of core
33 try {
34 Cls = parentRequire(task);
35 } catch (e2) {
36 log(['error'], e);
37 log(['error', 'parent-require'], e2);
38 }
39 }
40 // if task is config, pass the whole thing, little bit of a hack
41 const taskConfig = config[name];
42 if (taskConfig.enabled === false) {
43 log([name], `${name} is disabled, skipping`);
44 return callback();
45 }
46 cachedTasks[name] = new Cls(name, taskConfig, {
47 config,
48 loadConfig,
49 runner,
50 log,
51 logger: log //hack for now
52 });
53 }
54 cachedTasks[name].execute((err, results) => {
55 const end = new Date().getTime();
56 const duration = (end - start) / 1000;
57 log([name], `Finished in ${duration} seconds`);
58 callback(err, results);
59 });
60 };
61 }
62 runner.register(name, taskFn);
63 next();
64 }, (err) => {
65 if (err) {
66 return allDone(err);
67 }
68 allDone(null, runner);
69 });
70};