Files
medusa-store/docs-util/packages/workflows-diagrams-generator/src/commands/generate.ts
2023-11-29 11:58:08 +00:00

85 lines
2.5 KiB
TypeScript

/* eslint-disable no-case-declarations */
import { WorkflowManager } from "@medusajs/orchestration"
import * as path from "path"
import { existsSync, mkdirSync, rmSync, writeFileSync } from "fs"
import registerWorkflows from "../utils/register-workflows.js"
import DiagramBuilder from "../classes/diagram-builder.js"
// @ts-expect-error mermaid typing issue
import { run as runMermaid } from "@mermaid-js/mermaid-cli"
type Options = {
output: string
type: "docs" | "markdown" | "mermaid" | "console" | "svg" | "png" | "pdf"
theme: boolean
prettyNames: boolean
}
export default async function (workflowPath: string, options: Options) {
const workflowDefinitions = await registerWorkflows(workflowPath)
const diagramBuilder = new DiagramBuilder(options)
if (
workflowDefinitions.size > 0 &&
["svg", "png", "pdf"].includes(options.type)
) {
console.log(
`Generating ${options.type} file(s) with mermaid. This may take some time...`
)
}
for (const [name, code] of workflowDefinitions) {
const workflow = WorkflowManager.getWorkflow(name)
if (!workflow) {
continue
}
const diagram = diagramBuilder.buildDiagram(workflow.flow_)
if (!existsSync(options.output)) {
mkdirSync(options.output, { recursive: true })
}
switch (options.type) {
case "docs":
const workflowPath = path.join(options.output, name)
if (!existsSync(workflowPath)) {
mkdirSync(workflowPath, { recursive: true })
}
// write files
writeFileSync(path.join(workflowPath, "diagram.mermaid"), diagram)
if (code) {
writeFileSync(path.join(workflowPath, "code.ts"), code)
}
break
case "mermaid":
writeFileSync(path.join(options.output, `${name}.mermaid`), diagram)
break
case "markdown":
writeFileSync(
path.join(options.output, `${name}.md`),
`\`\`\`mermaid\n${diagram}\n\`\`\``
)
break
case "console":
console.log(`Diagram for workflow ${name}:\n${diagram}`)
break
case "svg":
case "png":
case "pdf":
const tempFilePath = path.join(options.output, `${name}.mermaid`)
writeFileSync(tempFilePath, diagram)
await runMermaid(
tempFilePath,
path.join(options.output, `${name}.${options.type}`),
{
quiet: true,
}
)
rmSync(tempFilePath)
}
}
console.log(`Generated diagrams for ${workflowDefinitions.size} workflows.`)
}