core/formatters/diagram.sequence.formatter.ts

core/formatters/diagram.sequence.formatter.ts is a file in GovLab Docs. 30 lines of code and 5 definitions.

import type { MessageKind, SequenceModel, SequenceStep } from "#types/diagram.types";
import { idSanitize, label } from "#core/normalizers/diagram.normalizer";
import { accLines } from "#core/formatters/diagram.formatter";

const INDENT = "    ";

const arrow = function arrow(kind: MessageKind): string {
    return kind === "return" ? "-->>" : "->>";
};

const stepLine = function stepLine(step: SequenceStep): string[] {
    if (step.message) {
        const { message } = step;
        return [
            `${INDENT}${idSanitize(message.from)}${arrow(message.kind)}${idSanitize(message.to)}: ${label(message.text)}`,
        ];
    }
    if (step.note) {
        return [`${INDENT}Note over ${step.note.over.map(idSanitize).join(",")}: ${label(step.note.text)}`];
    }
    return [];
};

export const emitSequence = function emitSequence(model: SequenceModel): string {
    return [
        "sequenceDiagram",
        ...accLines(model),
        ...(model.autonumber === true ? [`${INDENT}autonumber`] : []),
        ...model.participants.map(
            (participant) => `${INDENT}participant ${idSanitize(participant.id)} as ${label(participant.label)}`,
        ),
        ...model.steps.flatMap(stepLine),
    ].join("\n");
};