@factorialco/shadowdog
Version:
<img src="https://raw.githubusercontent.com/factorialco/shadowdog/refs/heads/main/logo.png" alt="drawing" width="100"/>
79 lines (78 loc) • 2.82 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const RAKE_COMMAND_REGEX = /^bundle exec rake (.*)$/;
const filterCommandTasks = (tasks) => {
return tasks.reduce((acc, task) => {
if (task.type === 'command') {
acc.commandTasks.push(task);
}
else {
acc.otherTasks.push(task);
}
return acc;
}, { commandTasks: [], otherTasks: [] });
};
const filterRakeTasks = (tasks) => {
return tasks.reduce((acc, task) => {
if (task.config.command.match(RAKE_COMMAND_REGEX)) {
acc.rakeTasks.push(task);
}
else {
acc.nonRakeTasks.push(task);
}
return acc;
}, { rakeTasks: [], nonRakeTasks: [] });
};
const collapseRakeTasks = (tasks) => {
if (tasks.length === 0) {
return { type: 'empty' };
}
const tasksByWorkingDirectory = tasks.reduce((acc, task) => {
const workingDirectory = task.config.workingDirectory;
if (!acc[workingDirectory]) {
acc[workingDirectory] = [];
}
acc[workingDirectory].push(task);
return acc;
}, {});
return {
type: 'parallel',
tasks: Object.entries(tasksByWorkingDirectory).map(([workingDirectory, tasksInWorkingDirectory]) => {
const config = {
artifacts: tasksInWorkingDirectory.flatMap((watcher) => watcher.config.artifacts),
command: `bundle exec rake ${tasksInWorkingDirectory
.map((watcher) => watcher.config.command.match(RAKE_COMMAND_REGEX)[1])
.join(' ')}`,
workingDirectory,
tags: tasksInWorkingDirectory.flatMap((watcher) => watcher.config.tags),
};
return {
type: 'command',
config,
files: tasksInWorkingDirectory.flatMap((watcher) => watcher.files),
invalidators: {
files: tasksInWorkingDirectory.flatMap((watcher) => watcher.invalidators.files),
environment: tasksInWorkingDirectory.flatMap((watcher) => watcher.invalidators.environment),
},
};
}),
};
};
const command = (task) => {
switch (task.type) {
case 'serial': {
return { type: 'serial', tasks: task.tasks.map(command) };
}
case 'parallel': {
const { commandTasks, otherTasks } = filterCommandTasks(task.tasks);
const { rakeTasks, nonRakeTasks } = filterRakeTasks(commandTasks);
const finalRakeTask = collapseRakeTasks(rakeTasks);
return { ...task, tasks: [...otherTasks, ...nonRakeTasks, finalRakeTask] };
}
default:
return task;
}
};
exports.default = {
command,
};