/** * Note builder functions for SequenceDiagram * @module Mermaid/builders/SequenceDiagram/functions/getNotes */ import { DiagramStore } from '../../core/DiagramStore'; import { sanitizeLabel } from '../../core/sanitize'; import type { NoteBuilder, NoteAction, NoteSideTarget, NoteOverTarget } from '../types'; /** * Create a single note action */ function createNoteAction( store: DiagramStore, position: string, ): NoteAction { return { msg(text: string) { store.add(`Note ${position}: ${sanitizeLabel(text)}`); }, }; } /** * Create note targets for left/right positions */ function createNoteSideTarget

( store: DiagramStore, position: 'left' | 'right', participants: readonly P[], ): NoteSideTarget

{ const target = {} as NoteSideTarget

; participants.forEach((p) => { target[p] = createNoteAction(store, `${position} of ${p}`); }); return target; } /** * Create note targets for "over" position (can span multiple participants) */ function createNoteOverTarget

( store: DiagramStore, participants: readonly P[], ): NoteOverTarget

{ const target = {} as NoteOverTarget

; participants.forEach((first) => { // Create object with msg for single participant note const obj = { msg(text: string) { store.add(`Note over ${first}: ${sanitizeLabel(text)}`); }, } as NoteAction & { [K in P]: NoteAction }; // Add targets for spanning to other participants participants.forEach((second) => { if (first !== second) { (obj as Record)[second] = { msg(text: string) { store.add(`Note over ${first},${second}: ${sanitizeLabel(text)}`); }, }; } else { // Self-reference just does single note (obj as Record)[second] = { msg(text: string) { store.add(`Note over ${first}: ${sanitizeLabel(text)}`); }, }; } }); target[first] = obj; }); return target; } /** * Create the full note builder */ export function createNoteBuilder

( store: DiagramStore, participants: readonly P[], ): NoteBuilder

{ return { leftOf: createNoteSideTarget(store, 'left', participants), rightOf: createNoteSideTarget(store, 'right', participants), over: createNoteOverTarget(store, participants), }; }