index.js 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. #!/usr/bin/env node
  2. import * as defaultConfig from "./defaults.js"
  3. import { getConfig, processTask } from "./lib.js"
  4. import { performance } from "node:perf_hooks"
  5. import { getLogger } from "./logging.js"
  6. const startTime = performance.now()
  7. const { opts, tasks } = await getConfig() || { ...defaultConfig }
  8. const log = getLogger(opts.logLevel, "main")
  9. log.info(`Processing ${tasks.length} steps`)
  10. log.debug(`Running directory: ${opts.runDir}`)
  11. log.debug(`Output directory: ${opts.outDir}`)
  12. if (opts.cacheDir) {
  13. log.debug(`Cache directory: ${opts.cacheDir}`)
  14. } else {
  15. log.warn("Cache disabled")
  16. }
  17. const taskRunner = tasks.reduce(
  18. async (metaPromise, step) => {
  19. const tasks = Array.isArray(step) ? step : [step]
  20. const { meta, filesWritten } = await metaPromise
  21. const stepTasks = tasks.map(task => task.name)
  22. log.info(`Starting tasks: ${stepTasks.join(", ")}`)
  23. const stepResults = await Promise.all(tasks.map(async task => {
  24. const log = getLogger(opts.logLevel, task.name)
  25. const taskResult = await processTask(meta, task)
  26. log.trace(`taskResult: ${JSON.stringify(taskResult)}`)
  27. return taskResult
  28. }))
  29. const newState = stepResults.reduce((newState, taskResult) => {
  30. const resources = Object.keys(taskResult.resources).length > 0 ? {
  31. ...newState.meta.resources,
  32. [taskResult.name]: taskResult.resources,
  33. } : { ...newState.meta.resources }
  34. return {
  35. meta: {
  36. ...newState.meta,
  37. resources,
  38. },
  39. filesWritten: newState.filesWritten + taskResult.filesWritten,
  40. }
  41. }, { meta, filesWritten })
  42. return newState
  43. },
  44. Promise.resolve({ meta: { opts }, filesWritten: 0 }),
  45. )
  46. const finalState = await taskRunner
  47. log.trace(`Final state: ${JSON.stringify(finalState, null, 2)}`)
  48. const endTime = performance.now()
  49. const timeTaken = (endTime - startTime)
  50. const hrTime = timeTaken > 1000 ? `${Number.parseFloat(timeTaken / 1000).toFixed(2)}s` : `${Number.parseFloat(timeTaken).toFixed(2)}ms`
  51. log.info(`Completed ${tasks.length} steps in ${hrTime}, wrote ${finalState.filesWritten} files.`)