#!/usr/bin/env node import * as defaultConfig from "./defaults.js" import { getConfig, processTask } from "./lib.js" import { performance } from "node:perf_hooks" import { getLogger } from "./logging.js" const startTime = performance.now() const { opts, tasks } = await getConfig() || { ...defaultConfig } const log = getLogger(opts.logLevel, "main") log.info(`Processing ${tasks.length} steps`) log.debug(`Running directory: ${opts.runDir}`) log.debug(`Output directory: ${opts.outDir}`) if (opts.cacheDir) { log.debug(`Cache directory: ${opts.cacheDir}`) } else { log.warn("Cache disabled") } const taskRunner = tasks.reduce( async (metaPromise, step) => { const tasks = Array.isArray(step) ? step : [step] const { meta, filesWritten } = await metaPromise const stepTasks = tasks.map(task => task.name) log.info(`Starting tasks: ${stepTasks.join(", ")}`) const stepResults = await Promise.all(tasks.map(async task => { const log = getLogger(opts.logLevel, task.name) const taskResult = await processTask(meta, task) log.trace(`taskResult: ${JSON.stringify(taskResult)}`) return taskResult })) const newState = stepResults.reduce((newState, taskResult) => { const resources = Object.keys(taskResult.resources).length > 0 ? { ...newState.meta.resources, [taskResult.name]: taskResult.resources, } : { ...newState.meta.resources } return { meta: { ...newState.meta, resources, }, filesWritten: newState.filesWritten + taskResult.filesWritten, } }, { meta, filesWritten }) return newState }, Promise.resolve({ meta: { opts }, filesWritten: 0 }), ) const finalState = await taskRunner log.trace(`Final state: ${JSON.stringify(finalState, null, 2)}`) const endTime = performance.now() const timeTaken = (endTime - startTime) const hrTime = timeTaken > 1000 ? `${Number.parseFloat(timeTaken / 1000).toFixed(2)}s` : `${Number.parseFloat(timeTaken).toFixed(2)}ms` log.info(`Completed ${tasks.length} steps in ${hrTime}, wrote ${finalState.filesWritten} files.`)