@danielsimonjr/sciengjs 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +18 -3
  2. package/THIRD_PARTY_NOTICES.md +1 -1
  3. package/assets/licenses/MIT-viz-js.txt +21 -0
  4. package/dist/graph/backend-png.d.ts +5 -0
  5. package/dist/graph/backend-png.js +20 -2
  6. package/dist/graph/backend-png.js.map +1 -1
  7. package/dist/mermaid/backend-png.d.ts +6 -0
  8. package/dist/mermaid/backend-png.js +13 -0
  9. package/dist/mermaid/backend-png.js.map +1 -0
  10. package/dist/mermaid/backend-svg.d.ts +3 -0
  11. package/dist/mermaid/backend-svg.js +8 -0
  12. package/dist/mermaid/backend-svg.js.map +1 -0
  13. package/dist/mermaid/class.d.ts +37 -0
  14. package/dist/mermaid/class.js +190 -0
  15. package/dist/mermaid/class.js.map +1 -0
  16. package/dist/mermaid/common.d.ts +43 -0
  17. package/dist/mermaid/common.js +112 -0
  18. package/dist/mermaid/common.js.map +1 -0
  19. package/dist/mermaid/index.d.ts +10 -0
  20. package/dist/mermaid/index.js +11 -0
  21. package/dist/mermaid/index.js.map +1 -0
  22. package/dist/mermaid/render.d.ts +10 -0
  23. package/dist/mermaid/render.js +24 -0
  24. package/dist/mermaid/render.js.map +1 -0
  25. package/dist/mermaid/sequence-layout.d.ts +6 -0
  26. package/dist/mermaid/sequence-layout.js +268 -0
  27. package/dist/mermaid/sequence-layout.js.map +1 -0
  28. package/dist/mermaid/sequence.d.ts +62 -0
  29. package/dist/mermaid/sequence.js +199 -0
  30. package/dist/mermaid/sequence.js.map +1 -0
  31. package/dist/mermaid/state.d.ts +24 -0
  32. package/dist/mermaid/state.js +132 -0
  33. package/dist/mermaid/state.js.map +1 -0
  34. package/dist/pairs.js +2 -2
  35. package/dist/pairs.js.map +1 -1
  36. package/dist/registry.js +2 -0
  37. package/dist/registry.js.map +1 -1
  38. package/dist/version.d.ts +1 -1
  39. package/dist/version.js +1 -1
  40. package/package.json +5 -1
@@ -0,0 +1,10 @@
1
+ /** The SVG text and the warnings of one Mermaid render. */
2
+ export interface MermaidSvg {
3
+ svg: string;
4
+ warnings: string[];
5
+ }
6
+ /**
7
+ * Renders one Mermaid source to SVG. A class or state diagram goes through DOT and the graph stage.
8
+ * A sequence diagram is laid out here. The only option is lenient.
9
+ */
10
+ export declare function renderMermaidSvg(source: string, options: Record<string, unknown>): Promise<MermaidSvg>;
@@ -0,0 +1,24 @@
1
+ import { dotToSvg } from "../graph/dot.js";
2
+ import { classToDot, parseClassDiagram } from "./class.js";
3
+ import { prepare } from "./common.js";
4
+ import { parseSequenceDiagram } from "./sequence.js";
5
+ import { layoutSequence } from "./sequence-layout.js";
6
+ import { parseStateDiagram, stateToDot } from "./state.js";
7
+ /**
8
+ * Renders one Mermaid source to SVG. A class or state diagram goes through DOT and the graph stage.
9
+ * A sequence diagram is laid out here. The only option is lenient.
10
+ */
11
+ export async function renderMermaidSvg(source, options) {
12
+ const src = prepare(source, options);
13
+ if (src.kind === "class") {
14
+ const dot = await dotToSvg(classToDot(parseClassDiagram(src)));
15
+ return { svg: dot.svg, warnings: [...src.warnings, ...dot.warnings] };
16
+ }
17
+ if (src.kind === "state") {
18
+ const dot = await dotToSvg(stateToDot(parseStateDiagram(src)));
19
+ return { svg: dot.svg, warnings: [...src.warnings, ...dot.warnings] };
20
+ }
21
+ const svg = layoutSequence(parseSequenceDiagram(src));
22
+ return { svg, warnings: [...src.warnings] };
23
+ }
24
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/mermaid/render.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAQ3D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAc,EAAE,OAAgC;IACrF,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC/D,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;IACxE,CAAC;IACD,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC/D,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;IACxE,CAAC;IACD,MAAM,GAAG,GAAG,cAAc,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC;IACtD,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { SequenceModel } from "./sequence.ts";
2
+ /**
3
+ * Lays out one sequence model into one SVG document string.
4
+ * Returns the document with the root element first, one element per line and a final newline.
5
+ */
6
+ export declare function layoutSequence(model: SequenceModel): string;
@@ -0,0 +1,268 @@
1
+ import { xmlSafe } from "./common.js";
2
+ const MARGIN = 20;
3
+ const BOX_HEIGHT = 36;
4
+ const BOX_MIN_WIDTH = 100;
5
+ const BOX_PADDING = 20;
6
+ const CHAR_WIDTH = 8;
7
+ const COLUMN_MIN_GAP = 180;
8
+ const COLUMN_EDGE_GAP = 40;
9
+ const ROW_HEIGHT = 30;
10
+ const SELF_LOOP_WIDTH = 30;
11
+ const SELF_LOOP_HEIGHT = 20;
12
+ const ACTIVATION_WIDTH = 10;
13
+ const NOTE_MIN_WIDTH = 80;
14
+ const NOTE_PADDING = 16;
15
+ const NOTE_HEIGHT = 24;
16
+ const NOTE_GAP = 10;
17
+ const NOTE_OVER_SIDE = 30;
18
+ /** The height of one block text band: a block header or a divider label, and the space above the first row below it. */
19
+ const BLOCK_HEADER = 40;
20
+ const BLOCK_BOTTOM = 10;
21
+ const BLOCK_SIDE = 30;
22
+ const FONT_SIZE = 14;
23
+ /** Measures the laid-out width of one text run. */
24
+ function textWidth(value) {
25
+ return value.length * CHAR_WIDTH;
26
+ }
27
+ /** Makes one text value safe for XML: it replaces each forbidden character, then escapes the markup characters. */
28
+ function escapeXml(value) {
29
+ return xmlSafe(value)
30
+ .replace(/&/g, "&amp;")
31
+ .replace(/</g, "&lt;")
32
+ .replace(/>/g, "&gt;")
33
+ .replace(/"/g, "&quot;")
34
+ .replace(/'/g, "&apos;");
35
+ }
36
+ /** Widens one extent to cover two drawn x coordinates. */
37
+ function spanX(extent, first, second) {
38
+ const low = first <= second ? first : second;
39
+ const high = first <= second ? second : first;
40
+ if (low < extent.minX)
41
+ extent.minX = low;
42
+ if (high > extent.maxX)
43
+ extent.maxX = high;
44
+ }
45
+ /** Widens one extent to cover one drawn text element and its anchor. */
46
+ function spanText(extent, x, value, anchor) {
47
+ const width = textWidth(value);
48
+ if (anchor === "middle")
49
+ spanX(extent, x - width / 2, x + width / 2);
50
+ else
51
+ spanX(extent, x, x + width);
52
+ }
53
+ /** Measures the laid-out width of one participant box. */
54
+ function participantWidth(label) {
55
+ return Math.max(BOX_MIN_WIDTH, textWidth(label) + BOX_PADDING);
56
+ }
57
+ /**
58
+ * Lays out one sequence model into one SVG document string.
59
+ * Returns the document with the root element first, one element per line and a final newline.
60
+ */
61
+ export function layoutSequence(model) {
62
+ const centers = new Map();
63
+ let prevCenter = 0;
64
+ let prevHalf = 0;
65
+ for (let index = 0; index < model.participants.length; index += 1) {
66
+ const participant = model.participants[index];
67
+ const half = participantWidth(participant.label) / 2;
68
+ const center = index === 0
69
+ ? MARGIN + half
70
+ : prevCenter + Math.max(COLUMN_MIN_GAP, prevHalf + half + COLUMN_EDGE_GAP);
71
+ centers.set(participant.id, center);
72
+ prevCenter = center;
73
+ prevHalf = half;
74
+ }
75
+ let minCenter = 0;
76
+ let maxCenter = 0;
77
+ if (model.participants.length > 0) {
78
+ minCenter = centers.get(model.participants[0].id);
79
+ maxCenter = minCenter;
80
+ for (const participant of model.participants) {
81
+ const center = centers.get(participant.id);
82
+ if (center < minCenter)
83
+ minCenter = center;
84
+ if (center > maxCenter)
85
+ maxCenter = center;
86
+ }
87
+ }
88
+ const extent = { minX: Infinity, maxX: -Infinity };
89
+ let cursor = MARGIN + BOX_HEIGHT + ROW_HEIGHT;
90
+ let rowCount = 0;
91
+ const stacks = new Map();
92
+ const frames = [];
93
+ const lifelines = [];
94
+ const activations = [];
95
+ const notes = [];
96
+ const messages = [];
97
+ const boxes = [];
98
+ function centerOf(id) {
99
+ return centers.get(id);
100
+ }
101
+ function pushActivation(id, start) {
102
+ const stack = stacks.get(id);
103
+ if (!stack) {
104
+ stacks.set(id, [{ start, depth: 0 }]);
105
+ return;
106
+ }
107
+ stack.push({ start, depth: stack.length });
108
+ }
109
+ function drawActivation(id, entry, end) {
110
+ const center = centerOf(id);
111
+ const x = center + (entry.depth * ACTIVATION_WIDTH) / 2 - ACTIVATION_WIDTH / 2;
112
+ const height = Math.max(end - entry.start, ROW_HEIGHT / 2);
113
+ activations.push(`<rect x="${x}" y="${entry.start}" width="${ACTIVATION_WIDTH}" height="${height}" fill="#eeeeee" stroke="#000000" data-scieng-kind="activation" data-scieng-id="${escapeXml(id)}"/>`);
114
+ spanX(extent, x, x + ACTIVATION_WIDTH);
115
+ }
116
+ function popActivation(id, end) {
117
+ const stack = stacks.get(id);
118
+ if (!stack || stack.length === 0)
119
+ return;
120
+ drawActivation(id, stack.pop(), end);
121
+ }
122
+ function drawMessage(message, y, row) {
123
+ const dash = message.dashed ? ` stroke-dasharray="4 3"` : "";
124
+ if (message.from !== message.to) {
125
+ const from = centerOf(message.from);
126
+ const to = centerOf(message.to);
127
+ messages.push(`<line x1="${from}" y1="${y}" x2="${to}" y2="${y}" stroke="#000000"${dash} data-scieng-kind="message" data-scieng-row="${row}" data-scieng-line="${message.line}"/>`);
128
+ spanX(extent, from, to);
129
+ if (message.arrowhead) {
130
+ const direction = to > from ? 1 : -1;
131
+ const tail = to - 10 * direction;
132
+ messages.push(`<polygon points="${to},${y} ${tail},${y - 5} ${tail},${y + 5}" fill="#000000"/>`);
133
+ spanX(extent, to, tail);
134
+ }
135
+ const mid = (from + to) / 2;
136
+ messages.push(`<text x="${mid}" y="${y - 6}" text-anchor="middle" font-size="${FONT_SIZE}">${escapeXml(message.text)}</text>`);
137
+ spanText(extent, mid, message.text, "middle");
138
+ return;
139
+ }
140
+ const center = centerOf(message.from);
141
+ messages.push(`<path d="M ${center} ${y} H ${center + SELF_LOOP_WIDTH} V ${y + SELF_LOOP_HEIGHT} H ${center}" fill="none" stroke="#000000"${dash} data-scieng-kind="message" data-scieng-row="${row}" data-scieng-line="${message.line}"/>`);
142
+ spanX(extent, center, center + SELF_LOOP_WIDTH);
143
+ if (message.arrowhead) {
144
+ messages.push(`<polygon points="${center},${y + SELF_LOOP_HEIGHT} ${center + 10},${y + SELF_LOOP_HEIGHT - 5} ${center + 10},${y + SELF_LOOP_HEIGHT + 5}" fill="#000000"/>`);
145
+ spanX(extent, center, center + 10);
146
+ }
147
+ const textX = center + 36;
148
+ messages.push(`<text x="${textX}" y="${y + 4}" text-anchor="start" font-size="${FONT_SIZE}">${escapeXml(message.text)}</text>`);
149
+ spanText(extent, textX, message.text, "start");
150
+ }
151
+ function drawNote(position, ids, text, line, top) {
152
+ let x;
153
+ let width;
154
+ if (position === "over" && ids.length >= 2) {
155
+ const first = centerOf(ids[0]);
156
+ const second = centerOf(ids[1]);
157
+ x = Math.min(first, second) - NOTE_OVER_SIDE;
158
+ width = Math.max(NOTE_MIN_WIDTH, Math.abs(second - first) + 2 * NOTE_OVER_SIDE);
159
+ }
160
+ else {
161
+ width = Math.max(NOTE_MIN_WIDTH, textWidth(text) + NOTE_PADDING);
162
+ const anchor = centerOf(ids[0]);
163
+ if (position === "left")
164
+ x = anchor - NOTE_GAP - width;
165
+ else if (position === "right")
166
+ x = anchor + NOTE_GAP;
167
+ else
168
+ x = anchor - width / 2;
169
+ }
170
+ notes.push(`<rect x="${x}" y="${top}" width="${width}" height="${NOTE_HEIGHT}" fill="#ffffcc" stroke="#000000" data-scieng-kind="note" data-scieng-line="${line}"/>`);
171
+ spanX(extent, x, x + width);
172
+ const textX = x + width / 2;
173
+ notes.push(`<text x="${textX}" y="${top + 16}" text-anchor="middle" font-size="${FONT_SIZE}">${escapeXml(text)}</text>`);
174
+ spanText(extent, textX, text, "middle");
175
+ }
176
+ function drawBlock(block) {
177
+ const x = minCenter - BLOCK_SIDE;
178
+ const width = maxCenter - minCenter + 2 * BLOCK_SIDE;
179
+ const frameTop = cursor;
180
+ cursor += BLOCK_HEADER;
181
+ for (let index = 0; index < block.branches.length; index += 1) {
182
+ const branch = block.branches[index];
183
+ if (index > 0) {
184
+ const dividerY = cursor;
185
+ frames.push(`<line x1="${x}" y1="${dividerY}" x2="${x + width}" y2="${dividerY}" stroke="#000000" stroke-dasharray="6 4" data-scieng-kind="divider" data-scieng-line="${branch.line}"/>`);
186
+ spanX(extent, x, x + width);
187
+ const head = block.type === "alt" ? "else" : "and";
188
+ const heading = branch.label.length > 0 ? `${head} ${branch.label}` : head;
189
+ frames.push(`<text x="${x + 6}" y="${dividerY + 14}" font-size="${FONT_SIZE}">${escapeXml(heading)}</text>`);
190
+ spanText(extent, x + 6, heading, "start");
191
+ cursor += BLOCK_HEADER;
192
+ }
193
+ walkEvents(branch.events);
194
+ }
195
+ const frameBottom = cursor + BLOCK_BOTTOM;
196
+ frames.push(`<rect x="${x}" y="${frameTop}" width="${width}" height="${frameBottom - frameTop}" fill="none" stroke="#000000" data-scieng-kind="block" data-scieng-type="${block.type}" data-scieng-line="${block.line}"/>`);
197
+ spanX(extent, x, x + width);
198
+ const firstBranch = block.branches[0];
199
+ const heading = firstBranch && firstBranch.label.length > 0 ? `${block.type} ${firstBranch.label}` : block.type;
200
+ frames.push(`<text x="${x + 6}" y="${frameTop + 14}" font-size="${FONT_SIZE}">${escapeXml(heading)}</text>`);
201
+ spanText(extent, x + 6, heading, "start");
202
+ cursor = frameBottom + ROW_HEIGHT;
203
+ }
204
+ function walkEvents(events) {
205
+ for (const event of events) {
206
+ if (event.kind === "message") {
207
+ const y = cursor;
208
+ const row = rowCount;
209
+ rowCount += 1;
210
+ if (event.deactivateSource)
211
+ popActivation(event.from, y);
212
+ if (event.activateTarget)
213
+ pushActivation(event.to, y);
214
+ drawMessage(event, y, row);
215
+ cursor += event.from === event.to ? ROW_HEIGHT + SELF_LOOP_HEIGHT : ROW_HEIGHT;
216
+ }
217
+ else if (event.kind === "note") {
218
+ drawNote(event.position, event.ids, event.text, event.line, cursor);
219
+ cursor += ROW_HEIGHT;
220
+ }
221
+ else if (event.kind === "activate") {
222
+ pushActivation(event.id, cursor);
223
+ }
224
+ else if (event.kind === "deactivate") {
225
+ popActivation(event.id, cursor);
226
+ }
227
+ else {
228
+ drawBlock(event);
229
+ }
230
+ }
231
+ }
232
+ walkEvents(model.events);
233
+ const finalCursor = cursor;
234
+ for (const participant of model.participants) {
235
+ const stack = stacks.get(participant.id);
236
+ if (!stack)
237
+ continue;
238
+ for (const entry of stack)
239
+ drawActivation(participant.id, entry, finalCursor);
240
+ stack.length = 0;
241
+ }
242
+ for (const participant of model.participants) {
243
+ const center = centers.get(participant.id);
244
+ lifelines.push(`<line x1="${center}" y1="${MARGIN + BOX_HEIGHT}" x2="${center}" y2="${finalCursor}" stroke="#888888" stroke-dasharray="4 4" data-scieng-kind="lifeline" data-scieng-id="${escapeXml(participant.id)}"/>`);
245
+ spanX(extent, center, center);
246
+ }
247
+ for (const participant of model.participants) {
248
+ const center = centers.get(participant.id);
249
+ const width = participantWidth(participant.label);
250
+ boxes.push(`<rect x="${center - width / 2}" y="${MARGIN}" width="${width}" height="${BOX_HEIGHT}" rx="4" fill="#ffffff" stroke="#000000" data-scieng-kind="participant" data-scieng-id="${escapeXml(participant.id)}"/>`);
251
+ spanX(extent, center - width / 2, center + width / 2);
252
+ boxes.push(`<text x="${center}" y="${MARGIN + 22}" text-anchor="middle" font-size="${FONT_SIZE}">${escapeXml(participant.label)}</text>`);
253
+ spanText(extent, center, participant.label, "middle");
254
+ }
255
+ const minX = Number.isFinite(extent.minX) ? extent.minX : 0;
256
+ const maxX = Number.isFinite(extent.maxX) ? extent.maxX : 0;
257
+ const root = `<svg xmlns="http://www.w3.org/2000/svg" width="${maxX - minX + 2 * MARGIN}" height="${finalCursor + MARGIN}" viewBox="${minX - MARGIN} 0 ${maxX - minX + 2 * MARGIN} ${finalCursor + MARGIN}">`;
258
+ const lines = [root];
259
+ lines.push(...frames);
260
+ lines.push(...lifelines);
261
+ lines.push(...activations);
262
+ lines.push(...notes);
263
+ lines.push(...messages);
264
+ lines.push(...boxes);
265
+ lines.push("</svg>");
266
+ return lines.join("\n") + "\n";
267
+ }
268
+ //# sourceMappingURL=sequence-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sequence-layout.js","sourceRoot":"","sources":["../../src/mermaid/sequence-layout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import { type Source } from "./common.ts";
2
+ /** Describes one participant of a sequence diagram. */
3
+ export interface Participant {
4
+ id: string;
5
+ label: string;
6
+ line: number;
7
+ }
8
+ /** Describes one message that one participant sends to another. */
9
+ export interface MessageEvent {
10
+ kind: "message";
11
+ from: string;
12
+ to: string;
13
+ token: string;
14
+ dashed: boolean;
15
+ arrowhead: boolean;
16
+ text: string;
17
+ activateTarget: boolean;
18
+ deactivateSource: boolean;
19
+ line: number;
20
+ }
21
+ /** Describes one note that sits left of, right of or over participants. */
22
+ export interface NoteEvent {
23
+ kind: "note";
24
+ position: "left" | "right" | "over";
25
+ ids: string[];
26
+ text: string;
27
+ line: number;
28
+ }
29
+ /** Describes one explicit activation of a participant. */
30
+ export interface ActivateEvent {
31
+ kind: "activate";
32
+ id: string;
33
+ line: number;
34
+ }
35
+ /** Describes one explicit deactivation of a participant. */
36
+ export interface DeactivateEvent {
37
+ kind: "deactivate";
38
+ id: string;
39
+ line: number;
40
+ }
41
+ /** Describes one labelled branch that a block event holds. */
42
+ export interface Branch {
43
+ label: string;
44
+ line: number;
45
+ events: SeqEvent[];
46
+ }
47
+ /** Describes one loop, alt or par block that groups nested events. */
48
+ export interface BlockEvent {
49
+ kind: "block";
50
+ type: "loop" | "alt" | "par";
51
+ line: number;
52
+ branches: Branch[];
53
+ }
54
+ /** Unites every event that a sequence diagram can hold. */
55
+ export type SeqEvent = MessageEvent | NoteEvent | ActivateEvent | DeactivateEvent | BlockEvent;
56
+ /** Holds the participants and the events of a parsed sequence diagram. */
57
+ export interface SequenceModel {
58
+ participants: Participant[];
59
+ events: SeqEvent[];
60
+ }
61
+ /** Parses the lines of a sequence diagram into its participants and events. */
62
+ export declare function parseSequenceDiagram(src: Source): SequenceModel;
@@ -0,0 +1,199 @@
1
+ import { inputError, outside } from "./common.js";
2
+ /** One participant id: a letter or an underscore, then letters, digits and underscores, with hyphens between them. */
3
+ const ID_SOURCE = "[A-Za-z_][A-Za-z0-9_]*(?:-[A-Za-z0-9_]+)*";
4
+ const PARTICIPANT_RE = new RegExp(`^(?:participant|actor)[ \\t]+(${ID_SOURCE})(?:[ \\t]+as[ \\t]+(.+))?$`);
5
+ const ACTIVATION_RE = new RegExp(`^(activate|deactivate)[ \\t]+(${ID_SOURCE})$`);
6
+ const NOTE_RE = new RegExp(`^Note[ \\t]+(left of|right of|over)[ \\t]+(${ID_SOURCE})(?:[ \\t]*,[ \\t]*(${ID_SOURCE}))?[ \\t]*:[ \\t]*(.+)$`);
7
+ const BLOCK_RE = /^(loop|alt|par)(?:[ \t]+(.*))?$/;
8
+ const BRANCH_RE = /^(else|and)(?:[ \t]+(.*))?$/;
9
+ const END_RE = /^end$/;
10
+ const UNSUPPORTED_BLOCK_RE = /^(opt|critical|break|rect)(?:[ \t]+(.*))?$/;
11
+ const MESSAGE_RE = new RegExp(`^(${ID_SOURCE})[ \\t]*(-->>|->>|-->|->)[ \\t]*([+-]?)[ \\t]*(${ID_SOURCE})[ \\t]*:[ \\t]*(.*)$`);
12
+ const ANY_BLOCK_OPENER_RE = /^(?:loop|alt|par|opt|critical|break|rect)(?:[ \t]+.*)?$/;
13
+ /** Parses the lines of a sequence diagram into its participants and events. */
14
+ export function parseSequenceDiagram(src) {
15
+ const participants = [];
16
+ const byId = new Map();
17
+ const active = new Map();
18
+ const rootEvents = [];
19
+ const blocks = [];
20
+ let skipDepth = 0;
21
+ const activeOf = (id) => active.get(id) ?? 0;
22
+ const ensure = (id, createdOn) => {
23
+ const existing = byId.get(id);
24
+ if (existing)
25
+ return;
26
+ const participant = { id, label: id, line: createdOn };
27
+ byId.set(id, participant);
28
+ participants.push(participant);
29
+ };
30
+ const container = () => {
31
+ const top = blocks[blocks.length - 1];
32
+ if (!top)
33
+ return rootEvents;
34
+ const branch = top.branches[top.branches.length - 1];
35
+ return branch ? branch.events : rootEvents;
36
+ };
37
+ for (const row of src.lines) {
38
+ const line = row.number;
39
+ const text = row.text;
40
+ if (skipDepth > 0) {
41
+ if (ANY_BLOCK_OPENER_RE.test(text))
42
+ skipDepth += 1;
43
+ else if (text === "end")
44
+ skipDepth -= 1;
45
+ continue;
46
+ }
47
+ let m = PARTICIPANT_RE.exec(text);
48
+ if (m) {
49
+ const id = m[1];
50
+ const alias = m[2];
51
+ const existing = byId.get(id);
52
+ if (existing) {
53
+ if (alias !== undefined)
54
+ existing.label = alias.trim();
55
+ }
56
+ else {
57
+ const participant = { id, label: alias !== undefined ? alias.trim() : id, line };
58
+ byId.set(id, participant);
59
+ participants.push(participant);
60
+ }
61
+ continue;
62
+ }
63
+ m = ACTIVATION_RE.exec(text);
64
+ if (m) {
65
+ const id = m[2];
66
+ if (m[1] === "activate") {
67
+ ensure(id, line);
68
+ active.set(id, activeOf(id) + 1);
69
+ container().push({ kind: "activate", id, line });
70
+ }
71
+ else if (activeOf(id) === 0) {
72
+ outside(src, line, text, id + " is not active");
73
+ }
74
+ else {
75
+ active.set(id, activeOf(id) - 1);
76
+ container().push({ kind: "deactivate", id, line });
77
+ }
78
+ continue;
79
+ }
80
+ m = NOTE_RE.exec(text);
81
+ if (m) {
82
+ const where = m[1];
83
+ const second = m[3];
84
+ if (where !== "over" && second !== undefined) {
85
+ outside(src, line, text, "a note on the left or right names one participant");
86
+ continue;
87
+ }
88
+ const ids = [m[2]];
89
+ if (second !== undefined)
90
+ ids.push(second);
91
+ for (const id of ids)
92
+ ensure(id, line);
93
+ container().push({
94
+ kind: "note",
95
+ position: where === "left of" ? "left" : where === "right of" ? "right" : "over",
96
+ ids,
97
+ text: m[4].trim(),
98
+ line,
99
+ });
100
+ continue;
101
+ }
102
+ m = BLOCK_RE.exec(text);
103
+ if (m) {
104
+ const label = (m[2] ?? "").trim();
105
+ const block = {
106
+ kind: "block",
107
+ type: m[1],
108
+ line,
109
+ branches: [{ label, line, events: [] }],
110
+ };
111
+ container().push(block);
112
+ blocks.push(block);
113
+ continue;
114
+ }
115
+ m = BRANCH_RE.exec(text);
116
+ if (m) {
117
+ const word = m[1];
118
+ const needed = word === "else" ? "alt" : "par";
119
+ const top = blocks[blocks.length - 1];
120
+ if (!top || top.type !== needed) {
121
+ outside(src, line, text, word + " has no open " + needed + " block");
122
+ continue;
123
+ }
124
+ top.branches.push({ label: (m[2] ?? "").trim(), line, events: [] });
125
+ continue;
126
+ }
127
+ if (END_RE.test(text)) {
128
+ const top = blocks[blocks.length - 1];
129
+ if (!top) {
130
+ outside(src, line, text, "end has no open block");
131
+ continue;
132
+ }
133
+ blocks.pop();
134
+ continue;
135
+ }
136
+ if (UNSUPPORTED_BLOCK_RE.test(text)) {
137
+ outside(src, line, text, "a block is outside the supported grammar");
138
+ skipDepth = 1;
139
+ continue;
140
+ }
141
+ m = MESSAGE_RE.exec(text);
142
+ if (m) {
143
+ const from = m[1];
144
+ const token = m[2];
145
+ const marker = m[3];
146
+ const to = m[4];
147
+ const body = m[5].trim();
148
+ if (body === "") {
149
+ outside(src, line, text, "a message has no text");
150
+ continue;
151
+ }
152
+ if (marker === "-" && activeOf(from) === 0) {
153
+ outside(src, line, text, from + " is not active");
154
+ continue;
155
+ }
156
+ ensure(from, line);
157
+ ensure(to, line);
158
+ let activateTarget = false;
159
+ let deactivateSource = false;
160
+ if (marker === "+") {
161
+ active.set(to, activeOf(to) + 1);
162
+ activateTarget = true;
163
+ }
164
+ else if (marker === "-") {
165
+ active.set(from, activeOf(from) - 1);
166
+ deactivateSource = true;
167
+ }
168
+ container().push({
169
+ kind: "message",
170
+ from,
171
+ to,
172
+ token,
173
+ dashed: token.startsWith("--"),
174
+ arrowhead: token.endsWith(">>"),
175
+ text: body,
176
+ activateTarget,
177
+ deactivateSource,
178
+ line,
179
+ });
180
+ continue;
181
+ }
182
+ outside(src, line, text, "a construct is outside the supported grammar");
183
+ }
184
+ let open = blocks.pop();
185
+ while (open) {
186
+ if (src.lenient) {
187
+ src.warnings.push("line " + open.line + ": the " + open.type + " block is not closed by an end line; it runs to the end of the source");
188
+ }
189
+ else {
190
+ throw inputError(open.line, "the " + open.type + " block is not closed by an end line");
191
+ }
192
+ open = blocks.pop();
193
+ }
194
+ if (participants.length === 0) {
195
+ throw inputError(src.headerLine, "the diagram holds no participant or message");
196
+ }
197
+ return { participants, events: rootEvents };
198
+ }
199
+ //# sourceMappingURL=sequence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sequence.js","sourceRoot":"","sources":["../../src/mermaid/sequence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAe,MAAM,aAAa,CAAC;AAsE/D,sHAAsH;AACtH,MAAM,SAAS,GAAG,2CAA2C,CAAC;AAC9D,MAAM,cAAc,GAAG,IAAI,MAAM,CAAC,iCAAiC,SAAS,6BAA6B,CAAC,CAAC;AAC3G,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC,iCAAiC,SAAS,IAAI,CAAC,CAAC;AACjF,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,8CAA8C,SAAS,uBAAuB,SAAS,yBAAyB,CAAC,CAAC;AAC7I,MAAM,QAAQ,GAAG,iCAAiC,CAAC;AACnD,MAAM,SAAS,GAAG,6BAA6B,CAAC;AAChD,MAAM,MAAM,GAAG,OAAO,CAAC;AACvB,MAAM,oBAAoB,GAAG,4CAA4C,CAAC;AAC1E,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC,KAAK,SAAS,kDAAkD,SAAS,uBAAuB,CAAC,CAAC;AAChI,MAAM,mBAAmB,GAAG,yDAAyD,CAAC;AAEtF,+EAA+E;AAC/E,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC9C,MAAM,YAAY,GAAkB,EAAE,CAAC;IACvC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,MAAM,UAAU,GAAe,EAAE,CAAC;IAClC,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,MAAM,QAAQ,GAAG,CAAC,EAAU,EAAU,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IAE7D,MAAM,MAAM,GAAG,CAAC,EAAU,EAAE,SAAiB,EAAQ,EAAE;QACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9B,IAAI,QAAQ;YAAE,OAAO;QACrB,MAAM,WAAW,GAAgB,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACpE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QAC1B,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACjC,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,GAAe,EAAE;QACjC,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACtC,IAAI,CAAC,GAAG;YAAE,OAAO,UAAU,CAAC;QAC5B,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACrD,OAAO,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC;IAC7C,CAAC,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC;QACxB,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;QAEtB,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YAClB,IAAI,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,SAAS,IAAI,CAAC,CAAC;iBAC9C,IAAI,IAAI,KAAK,KAAK;gBAAE,SAAS,IAAI,CAAC,CAAC;YACxC,SAAS;QACX,CAAC;QAED,IAAI,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,EAAE,CAAC;YACN,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;YACjB,MAAM,KAAK,GAAuB,CAAC,CAAC,CAAC,CAAC,CAAC;YACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC9B,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,KAAK,KAAK,SAAS;oBAAE,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;YACzD,CAAC;iBAAM,CAAC;gBACN,MAAM,WAAW,GAAgB,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC;gBAC9F,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;gBAC1B,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACjC,CAAC;YACD,SAAS;QACX,CAAC;QAED,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,EAAE,CAAC;YACN,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;YACjB,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE,CAAC;gBACxB,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;gBACjB,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;gBACjC,SAAS,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;YACnD,CAAC;iBAAM,IAAI,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9B,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,gBAAgB,CAAC,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;gBACjC,SAAS,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;YACrD,CAAC;YACD,SAAS;QACX,CAAC;QAED,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,IAAI,CAAC,EAAE,CAAC;YACN,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;YACpB,MAAM,MAAM,GAAuB,CAAC,CAAC,CAAC,CAAC,CAAC;YACxC,IAAI,KAAK,KAAK,MAAM,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC7C,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,mDAAmD,CAAC,CAAC;gBAC9E,SAAS;YACX,CAAC;YACD,MAAM,GAAG,GAAa,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;YAC9B,IAAI,MAAM,KAAK,SAAS;gBAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3C,KAAK,MAAM,EAAE,IAAI,GAAG;gBAAE,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YACvC,SAAS,EAAE,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;gBAChF,GAAG;gBACH,IAAI,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE;gBAClB,IAAI;aACL,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxB,IAAI,CAAC,EAAE,CAAC;YACN,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAClC,MAAM,KAAK,GAAe;gBACxB,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,CAAC,CAAC,CAAC,CAAwB;gBACjC,IAAI;gBACJ,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;aACxC,CAAC;YACF,SAAS,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,SAAS;QACX,CAAC;QAED,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,IAAI,CAAC,EAAE,CAAC;YACN,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;YACnB,MAAM,MAAM,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;YAC/C,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACtC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAChC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,eAAe,GAAG,MAAM,GAAG,QAAQ,CAAC,CAAC;gBACrE,SAAS;YACX,CAAC;YACD,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;YACpE,SAAS;QACX,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACtC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,uBAAuB,CAAC,CAAC;gBAClD,SAAS;YACX,CAAC;YACD,MAAM,CAAC,GAAG,EAAE,CAAC;YACb,SAAS;QACX,CAAC;QAED,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,0CAA0C,CAAC,CAAC;YACrE,SAAS,GAAG,CAAC,CAAC;YACd,SAAS;QACX,CAAC;QAED,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,EAAE,CAAC;YACN,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;YACnB,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;YACpB,MAAM,MAAM,GAAuB,CAAC,CAAC,CAAC,CAAC,CAAC;YACxC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;YACjB,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;YAC1B,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;gBAChB,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,uBAAuB,CAAC,CAAC;gBAClD,SAAS;YACX,CAAC;YACD,IAAI,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3C,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,gBAAgB,CAAC,CAAC;gBAClD,SAAS;YACX,CAAC;YACD,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACnB,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;YACjB,IAAI,cAAc,GAAG,KAAK,CAAC;YAC3B,IAAI,gBAAgB,GAAG,KAAK,CAAC;YAC7B,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;gBACnB,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;gBACjC,cAAc,GAAG,IAAI,CAAC;YACxB,CAAC;iBAAM,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC1B,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;gBACrC,gBAAgB,GAAG,IAAI,CAAC;YAC1B,CAAC;YACD,SAAS,EAAE,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,SAAS;gBACf,IAAI;gBACJ,EAAE;gBACF,KAAK;gBACL,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;gBAC9B,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAC/B,IAAI,EAAE,IAAI;gBACV,cAAc;gBACd,gBAAgB;gBAChB,IAAI;aACL,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,8CAA8C,CAAC,CAAC;IAC3E,CAAC;IAED,IAAI,IAAI,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;IACxB,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAChB,GAAG,CAAC,QAAQ,CAAC,IAAI,CACf,OAAO,GAAG,IAAI,CAAC,IAAI,GAAG,QAAQ,GAAG,IAAI,CAAC,IAAI,GAAG,uEAAuE,CACrH,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,IAAI,GAAG,qCAAqC,CAAC,CAAC;QAC1F,CAAC;QACD,IAAI,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;IACtB,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,6CAA6C,CAAC,CAAC;IAClF,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { type Source } from "./common.ts";
2
+ /** One declared state of a stateDiagram-v2. */
3
+ export interface StateDef {
4
+ id: string;
5
+ label: string;
6
+ line: number;
7
+ }
8
+ /** One directed edge between states. The start and end markers are the text [*]. */
9
+ export interface StateTransition {
10
+ from: string;
11
+ to: string;
12
+ label: string | undefined;
13
+ line: number;
14
+ }
15
+ /** The parsed content of a stateDiagram-v2. */
16
+ export interface StateModel {
17
+ direction: "TB" | "BT" | "LR" | "RL";
18
+ states: StateDef[];
19
+ transitions: StateTransition[];
20
+ }
21
+ /** Parses the content lines of a state diagram. A line outside the grammar rejects with E_INPUT. In lenient mode the line is skipped and a warning names it. */
22
+ export declare function parseStateDiagram(src: Source): StateModel;
23
+ /** Builds the DOT source of a parsed state diagram. Each state is a rounded box. */
24
+ export declare function stateToDot(model: StateModel): string;