1 | 'use strict';
|
2 | const RunTask = require('runtask');
|
3 | const async = require('async');
|
4 | const parentRequire = require('parent-require');
|
5 | const path = require('path');
|
6 | const cachedTasks = {};
|
7 |
|
8 | module.exports = function(config, log, loadConfig, allDone) {
|
9 | const runner = new RunTask();
|
10 |
|
11 | const taskList = Object.keys(config.tasks);
|
12 |
|
13 | async.each(taskList, (name, next) => {
|
14 | const task = config.tasks[name];
|
15 | let taskFn;
|
16 | if (Array.isArray(task)) {
|
17 | taskFn = task;
|
18 | } else {
|
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 |
|
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 |
|
33 | try {
|
34 | Cls = parentRequire(task);
|
35 | } catch (e2) {
|
36 | log(['error'], e);
|
37 | log(['error', 'parent-require'], e2);
|
38 | }
|
39 | }
|
40 |
|
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
|
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 | };
|