"use strict"; const syncpipe = require("syncpipe"); const defaultValue = require("default-value"); // FIXME: Move to config validation const invertMapping = require("./util/invert-mapping"); module.exports = function generateTaskGraph({ tags, tasks }) { let tagsMapping = invertMapping(tags); let tasksMap = syncpipe(tasks, [ _ => Object.entries(_), _ => _.map(([ name, taskDefinition ]) => { return [ name, { ... taskDefinition, name: name, tags: tagsMapping[name], dependencies: [], dependents: [] }]; }), _ => new Map(_) ]); function getTask(name) { if (tasksMap.has(name)) { return tasksMap.get(name); } else { throw new Error(`Encountered dependency reference to non-existent task '${name}'`); } } for (let task of tasksMap.values()) { for (let dependencyName of defaultValue(task.dependsOn, [])) { task.dependencies.push(getTask(dependencyName)); getTask(dependencyName).dependents.push(task); } // NOTE: We are mutating a local copy of the task definition here, that we created further up delete task.dependsOn; } return tasksMap; };