core/formatters/diagram.machine.formatter.ts
core/formatters/diagram.machine.formatter.ts is a file in GovLab Docs. 24 lines of code and 6 definitions.
import type { StateModel, StateNode, StateTransition } from "#types/diagram.types";
import { idSanitize, label } from "#core/normalizers/diagram.normalizer";
import { accLines } from "#core/formatters/diagram.formatter";
import { byString } from "#core/selectors/base.selector";
const INDENT = " ";
const byNodeId = byString<StateNode>((node) => node.id);
const byTransition = byString<StateTransition>(
(transition) => `${transition.from} ${transition.to} ${transition.label ?? ""}`,
);
const transitionLine = function transitionLine(transition: StateTransition): string {
const suffix = typeof transition.label === "string" ? ` : ${label(transition.label)}` : "";
return `${INDENT}${idSanitize(transition.from)} --> ${idSanitize(transition.to)}${suffix}`;
};
export const emitStateDiagram = function emitStateDiagram(model: StateModel): string {
return [
"stateDiagram-v2",
...accLines(model),
...model.nodes
.toSorted(byNodeId)
.map((node) => `${INDENT}state "${label(node.label)}" as ${idSanitize(node.id)}`),
...(typeof model.initial === "string" ? [`${INDENT}[*] --> ${idSanitize(model.initial)}`] : []),
...model.transitions.toSorted(byTransition).map(transitionLine),
].join("\n");
};