UNPKG

@factorialco/shadowdog

Version:

<img src="https://raw.githubusercontent.com/factorialco/shadowdog/refs/heads/main/logo.png" alt="drawing" width="100"/>

76 lines (75 loc) 2.65 kB
"use strict"; 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), environment: tasksInWorkingDirectory.flatMap((watcher) => watcher.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, };