@diagrammo/dgmo 0.46.0 → 0.47.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 (232) hide show
  1. package/dist/advanced.d.cts +3 -855
  2. package/dist/advanced.d.ts +3 -855
  3. package/dist/advanced.js +541 -70107
  4. package/dist/analyzer-UYKBXAKR.js +15 -0
  5. package/dist/auto.cjs +1 -1
  6. package/dist/auto.js +1 -1
  7. package/dist/auto.mjs +1 -1
  8. package/dist/block.js +83 -69417
  9. package/dist/calculator-LDYQCDDY.js +11 -0
  10. package/dist/charts-d3-QOZHKTCT.js +25 -0
  11. package/dist/chunk-2DXMZRWJ.js +800 -0
  12. package/dist/chunk-2LACINWN.js +786 -0
  13. package/dist/chunk-33LCUH4H.js +893 -0
  14. package/dist/chunk-3CIOJ5YJ.js +35 -0
  15. package/dist/chunk-3HDBAXF5.js +86 -0
  16. package/dist/chunk-3JLKYGBQ.js +290 -0
  17. package/dist/chunk-3MQQNXPD.js +415 -0
  18. package/dist/chunk-3R5POCTZ.js +967 -0
  19. package/dist/chunk-3SMGIJDD.js +112 -0
  20. package/dist/chunk-44CM72SQ.js +409 -0
  21. package/dist/chunk-4GRI7MEB.js +1604 -0
  22. package/dist/chunk-4OHACBGX.js +606 -0
  23. package/dist/chunk-5DH3KYFH.js +21 -0
  24. package/dist/chunk-5MLYVTYM.js +76 -0
  25. package/dist/chunk-5QXL4NYS.js +553 -0
  26. package/dist/chunk-5WRI5ZAA.js +31 -0
  27. package/dist/chunk-6EK55ART.js +117 -0
  28. package/dist/chunk-6FZYCKXB.js +2065 -0
  29. package/dist/chunk-6HO5ZTXK.js +277 -0
  30. package/dist/chunk-6KFWC4CO.js +7 -0
  31. package/dist/chunk-6MTWIQVO.js +121 -0
  32. package/dist/chunk-6NYWYNBI.js +329 -0
  33. package/dist/chunk-6SM5NJQH.js +620 -0
  34. package/dist/chunk-725LDASD.js +422 -0
  35. package/dist/chunk-76OWZ3BA.js +130 -0
  36. package/dist/chunk-7JEGTRLD.js +338 -0
  37. package/dist/chunk-A44USUV7.js +923 -0
  38. package/dist/chunk-A4GOY3PE.js +25 -0
  39. package/dist/chunk-A4VFQH5G.js +251 -0
  40. package/dist/chunk-AELOBFW5.js +375 -0
  41. package/dist/chunk-AN2MOO5T.js +522 -0
  42. package/dist/chunk-BMR4CIEO.js +41 -0
  43. package/dist/chunk-BS7SV7C3.js +51 -0
  44. package/dist/chunk-BUPDIHML.js +613 -0
  45. package/dist/chunk-BUVJFRPY.js +887 -0
  46. package/dist/chunk-C3Z4DX3V.js +112 -0
  47. package/dist/chunk-CI2G3OEB.js +1818 -0
  48. package/dist/chunk-CKNVO24D.js +54 -0
  49. package/dist/chunk-CUVHQHZ7.js +391 -0
  50. package/dist/chunk-CXK4DZH3.js +114 -0
  51. package/dist/chunk-DKEPS5LH.js +315 -0
  52. package/dist/chunk-DU7W62N5.js +487 -0
  53. package/dist/chunk-DZAQBW35.js +751 -0
  54. package/dist/chunk-EB6FPQUP.js +316 -0
  55. package/dist/chunk-EMS2SK26.js +376 -0
  56. package/dist/chunk-ERLBPDGU.js +510 -0
  57. package/dist/chunk-EVCVDTXE.js +732 -0
  58. package/dist/chunk-FCIIHT24.js +384 -0
  59. package/dist/chunk-FFUN5D66.js +97 -0
  60. package/dist/chunk-FITOLXSX.js +714 -0
  61. package/dist/chunk-FMDSF3OV.js +68 -0
  62. package/dist/chunk-FNB3PNGF.js +410 -0
  63. package/dist/chunk-G2H74XJZ.js +2104 -0
  64. package/dist/chunk-GMR5MFHJ.js +339 -0
  65. package/dist/chunk-H6PI3KJT.js +305 -0
  66. package/dist/chunk-I46X5VUA.js +59 -0
  67. package/dist/chunk-I5IGB56C.js +255 -0
  68. package/dist/chunk-IH6ZMVQ5.js +3950 -0
  69. package/dist/chunk-IJZFN3HM.js +463 -0
  70. package/dist/chunk-IPWPWM6R.js +3079 -0
  71. package/dist/chunk-IYULMRBE.js +23 -0
  72. package/dist/chunk-IZMRON6C.js +167 -0
  73. package/dist/chunk-J5FIXQRT.js +813 -0
  74. package/dist/chunk-JED6ZDEE.js +73 -0
  75. package/dist/chunk-JEUJOX5X.js +136 -0
  76. package/dist/chunk-JM4LEPY3.js +436 -0
  77. package/dist/chunk-L3UHP6TD.js +101 -0
  78. package/dist/chunk-L66GEFB6.js +524 -0
  79. package/dist/chunk-LIOHW36Z.js +469 -0
  80. package/dist/chunk-LP7EC4MI.js +16 -0
  81. package/dist/chunk-MITI6NOL.js +548 -0
  82. package/dist/chunk-MO5YHHMQ.js +168 -0
  83. package/dist/chunk-MZSBFAPJ.js +885 -0
  84. package/dist/chunk-NNAAJVBU.js +9 -0
  85. package/dist/chunk-NOTA6TEI.js +47 -0
  86. package/dist/chunk-NURGB5Z4.js +335 -0
  87. package/dist/chunk-NX4EQS3U.js +1062 -0
  88. package/dist/chunk-NXMESY4J.js +1 -0
  89. package/dist/chunk-OJR3MQYV.js +1458 -0
  90. package/dist/chunk-OURHMODR.js +454 -0
  91. package/dist/chunk-P235SVAH.js +1057 -0
  92. package/dist/chunk-P4RH4OSP.js +1038 -0
  93. package/dist/chunk-P6T66CCZ.js +226 -0
  94. package/dist/chunk-PBAHEPLQ.js +223 -0
  95. package/dist/chunk-PBHE5UG6.js +1530 -0
  96. package/dist/chunk-PDKUANDZ.js +35 -0
  97. package/dist/chunk-PWIHZ6NJ.js +296 -0
  98. package/dist/chunk-QEBUY5NY.js +1685 -0
  99. package/dist/chunk-QLCCJEJI.js +253 -0
  100. package/dist/chunk-QOOUC2J5.js +52 -0
  101. package/dist/chunk-QYTPPDAO.js +402 -0
  102. package/dist/chunk-R3XI2VC7.js +801 -0
  103. package/dist/chunk-RCERWOJR.js +154 -0
  104. package/dist/chunk-RJE5JTVK.js +362 -0
  105. package/dist/chunk-RTLBSQ3G.js +1155 -0
  106. package/dist/chunk-RUNNI6VE.js +448 -0
  107. package/dist/chunk-RVMRZAPB.js +354 -0
  108. package/dist/chunk-RYEGFMUO.js +955 -0
  109. package/dist/chunk-RZCF2VVM.js +528 -0
  110. package/dist/chunk-SML67VPV.js +1025 -0
  111. package/dist/chunk-SQ7IY53Q.js +44 -0
  112. package/dist/chunk-SQAG3UXH.js +161 -0
  113. package/dist/chunk-SRTU6HMQ.js +1851 -0
  114. package/dist/chunk-T2OE3YQB.js +550 -0
  115. package/dist/chunk-T3UBLACL.js +299 -0
  116. package/dist/chunk-TLVIHFRO.js +296 -0
  117. package/dist/chunk-TYS6CSS5.js +52 -0
  118. package/dist/chunk-U6EQI3U6.js +130 -0
  119. package/dist/chunk-UJ4FJLBF.js +86 -0
  120. package/dist/chunk-ULOEATBZ.js +347 -0
  121. package/dist/chunk-UNCCZ3NU.js +127 -0
  122. package/dist/chunk-USZW2HHU.js +197 -0
  123. package/dist/chunk-UWN33VNX.js +1610 -0
  124. package/dist/chunk-UZ7EZW3B.js +40 -0
  125. package/dist/chunk-VOKGH627.js +37 -0
  126. package/dist/chunk-WBRZJOEC.js +204 -0
  127. package/dist/chunk-WCSOJFU3.js +380 -0
  128. package/dist/chunk-WCT3NYCV.js +160 -0
  129. package/dist/chunk-WVAJFAIA.js +529 -0
  130. package/dist/chunk-X5LCYCL5.js +394 -0
  131. package/dist/chunk-XAKEUMEJ.js +1256 -0
  132. package/dist/chunk-Y2ZE3MSG.js +590 -0
  133. package/dist/chunk-Y3J7VR52.js +646 -0
  134. package/dist/chunk-Y5QGVTVC.js +33 -0
  135. package/dist/chunk-YAA6IID3.js +548 -0
  136. package/dist/chunk-YGJTDXVR.js +692 -0
  137. package/dist/chunk-YRYKTYMQ.js +186 -0
  138. package/dist/chunk-YYVTBZZC.js +61 -0
  139. package/dist/chunk-Z5CGSFJB.js +647 -0
  140. package/dist/chunk-Z72XRXD4.js +787 -0
  141. package/dist/chunk-ZGR7ULFJ.js +978 -0
  142. package/dist/chunk-ZJEL4H2R.js +851 -0
  143. package/dist/chunk-ZO27FGJS.js +554 -0
  144. package/dist/collapse-CLPJD2RL.js +11 -0
  145. package/dist/collapse-SLINJQW6.js +9 -0
  146. package/dist/collapse-ZWUFFCK2.js +9 -0
  147. package/dist/compute-G55RG53N.js +8 -0
  148. package/dist/dgmo-router-DZCIDUO5.js +73 -0
  149. package/dist/dimensions-J3FHIMJ6.js +22 -0
  150. package/dist/element.cjs +1 -1
  151. package/dist/element.js +1 -1
  152. package/dist/element.mjs +1 -1
  153. package/dist/flowchart-parser-ZNSKIBVR.js +21 -0
  154. package/dist/flowchart-renderer-ZAEOL4DX.js +35 -0
  155. package/dist/index.cjs +3 -3
  156. package/dist/index.d.cts +3 -469
  157. package/dist/index.d.ts +3 -469
  158. package/dist/index.js +137 -69685
  159. package/dist/layout-46N4JJYK.js +17 -0
  160. package/dist/layout-5RA6QWR6.js +26 -0
  161. package/dist/layout-5T6RH5M6.js +14 -0
  162. package/dist/layout-7QXCNOVS.js +13 -0
  163. package/dist/layout-EE6GE46Y.js +17 -0
  164. package/dist/layout-G23F7LDH.js +9 -0
  165. package/dist/layout-HRBZPFCN.js +23 -0
  166. package/dist/layout-HWDSRX5E.js +20 -0
  167. package/dist/layout-HYZPWAK5.js +18 -0
  168. package/dist/layout-N76NR4ZO.js +19 -0
  169. package/dist/layout-OB3RI63S.js +14 -0
  170. package/dist/layout-S2QBYSK2.js +15 -0
  171. package/dist/layout-UM5F4DJB.js +15 -0
  172. package/dist/layout-search-OYV77HHS.js +1655 -0
  173. package/dist/load-data-EHDDZ5ZS.js +8 -0
  174. package/dist/palettes-PRJ2RI6D.js +56 -0
  175. package/dist/parser-2MFP2H2E.js +11 -0
  176. package/dist/parser-3STE62GB.js +21 -0
  177. package/dist/parser-4FL2CMDG.js +18 -0
  178. package/dist/parser-4OGOBJJ4.js +13 -0
  179. package/dist/parser-6BTRLKRZ.js +15 -0
  180. package/dist/parser-AQETEVRW.js +21 -0
  181. package/dist/parser-CFZD5IBL.js +12 -0
  182. package/dist/parser-FUSKFGZN.js +16 -0
  183. package/dist/parser-I6KXEYFK.js +13 -0
  184. package/dist/parser-IXSZZQHY.js +18 -0
  185. package/dist/parser-JAL2HD4I.js +13 -0
  186. package/dist/parser-KNSQSKQO.js +20 -0
  187. package/dist/parser-N5O4IHUN.js +13 -0
  188. package/dist/parser-NGU3ETO6.js +16 -0
  189. package/dist/parser-NRAI6O25.js +19 -0
  190. package/dist/parser-O5J4VBII.js +11 -0
  191. package/dist/parser-OV7NOBW6.js +21 -0
  192. package/dist/parser-PQ3POX45.js +23 -0
  193. package/dist/parser-TFZFBVWN.js +11 -0
  194. package/dist/parser-TRTHDFPP.js +18 -0
  195. package/dist/parser-VQP2UJ6W.js +11 -0
  196. package/dist/parser-XDVELHRK.js +13 -0
  197. package/dist/parser-XKRP7QKP.js +11 -0
  198. package/dist/parser-Y6WTBU76.js +14 -0
  199. package/dist/parser-ZSDPZYQP.js +12 -0
  200. package/dist/renderer-2XQQQ6QR.js +28 -0
  201. package/dist/renderer-5NDVNDAZ.js +26 -0
  202. package/dist/renderer-6EEZHMH4.js +26 -0
  203. package/dist/renderer-6W5462RB.js +43 -0
  204. package/dist/renderer-7MVLWWQD.js +22 -0
  205. package/dist/renderer-AWWAF6XD.js +33 -0
  206. package/dist/renderer-BYCNMBF7.js +34 -0
  207. package/dist/renderer-CLJHQPBJ.js +29 -0
  208. package/dist/renderer-GHPZMFU2.js +15 -0
  209. package/dist/renderer-JGBKUCZD.js +16 -0
  210. package/dist/renderer-KQB7UGDS.js +19 -0
  211. package/dist/renderer-PGX2TKVS.js +24 -0
  212. package/dist/renderer-QIWVHWZO.js +15 -0
  213. package/dist/renderer-RPOA5YPZ.js +35 -0
  214. package/dist/renderer-SMIBCRVB.js +24 -0
  215. package/dist/renderer-T7YKC5VP.js +28 -0
  216. package/dist/renderer-TOCOVLHS.js +37 -0
  217. package/dist/renderer-UWA5XS74.js +39 -0
  218. package/dist/renderer-VACVQYML.js +25 -0
  219. package/dist/renderer-W4M6QLIJ.js +37 -0
  220. package/dist/renderer-WZRREQ2P.js +23 -0
  221. package/dist/renderer-YY2OSF6E.js +27 -0
  222. package/dist/renderer-Z7I3W2PP.js +24 -0
  223. package/dist/renderer-ZGNTUWC4.js +22 -0
  224. package/dist/renderer-ZTR3DER3.js +19 -0
  225. package/dist/renderer-radial-C32GPJQ7.js +21 -0
  226. package/dist/resolver-NOAA7ID7.js +13 -0
  227. package/dist/state-collapse-HCGD6IVJ.js +8 -0
  228. package/dist/state-parser-Z2V23ATR.js +18 -0
  229. package/dist/state-renderer-RFYHSP4K.js +34 -0
  230. package/dist/themes-1-CuKpeH.d.cts +908 -0
  231. package/dist/themes-1-CuKpeH.d.ts +908 -0
  232. package/package.json +1 -1
@@ -0,0 +1,415 @@
1
+ import {
2
+ tryCollectNote
3
+ } from "./chunk-5MLYVTYM.js";
4
+ import {
5
+ resolveNotes
6
+ } from "./chunk-FMDSF3OV.js";
7
+ import {
8
+ parseInArrowLabel
9
+ } from "./chunk-FFUN5D66.js";
10
+ import {
11
+ displayName,
12
+ normalizeName
13
+ } from "./chunk-NOTA6TEI.js";
14
+ import {
15
+ ALL_CHART_TYPES,
16
+ OPTION_NOCOLON_RE,
17
+ measureIndent,
18
+ parseFirstLine,
19
+ tryParseSharedOption
20
+ } from "./chunk-Y3J7VR52.js";
21
+ import {
22
+ resolveColorWithDiagnostic
23
+ } from "./chunk-TLVIHFRO.js";
24
+ import {
25
+ NAME_DIAGNOSTIC_CODES,
26
+ formatDgmoError,
27
+ makeDgmoError,
28
+ nameMergedMessage,
29
+ suggest
30
+ } from "./chunk-CXK4DZH3.js";
31
+
32
+ // src/graph/state-parser.ts
33
+ var PSEUDOSTATE_ID = "pseudostate:[*]";
34
+ var PSEUDOSTATE_LABEL = "[*]";
35
+ var GROUP_BRACKET_RE = /^\[([^\]]+)\](?:\s+(red|orange|yellow|green|blue|purple|teal|cyan|gray|black|white))?(?:,?\s+collapsed:\s*(\S+))?\s*$/;
36
+ function splitArrows(line) {
37
+ const segments = [];
38
+ const arrowPositions = [];
39
+ let searchFrom = 0;
40
+ let scanFloor = 0;
41
+ while (searchFrom < line.length) {
42
+ const idx = line.indexOf("->", searchFrom);
43
+ if (idx === -1) break;
44
+ let runStart = idx;
45
+ while (runStart > scanFloor && line[runStart - 1] === "-") runStart--;
46
+ const arrowEnd = idx + 2;
47
+ let arrowStart;
48
+ let label;
49
+ let openingStart = -1;
50
+ for (let i = scanFloor; i < runStart; i++) {
51
+ if (line[i] !== "-") continue;
52
+ const prevIsWsOrFloor = i === 0 || i === scanFloor || /\s/.test(line.charAt(i - 1));
53
+ if (prevIsWsOrFloor) {
54
+ openingStart = i;
55
+ break;
56
+ }
57
+ }
58
+ if (openingStart !== -1) {
59
+ let openingEnd = openingStart;
60
+ while (openingEnd < runStart && line[openingEnd] === "-") openingEnd++;
61
+ const labelPart = line.substring(openingEnd, runStart).trim();
62
+ if (labelPart) label = labelPart;
63
+ arrowStart = openingStart;
64
+ } else {
65
+ arrowStart = runStart;
66
+ }
67
+ arrowPositions.push({
68
+ start: arrowStart,
69
+ end: arrowEnd,
70
+ ...label !== void 0 && { label }
71
+ });
72
+ searchFrom = arrowEnd;
73
+ scanFloor = arrowEnd;
74
+ }
75
+ if (arrowPositions.length === 0) return [line];
76
+ let lastIndex = 0;
77
+ for (let i = 0; i < arrowPositions.length; i++) {
78
+ const arrow = arrowPositions[i];
79
+ const beforeText = line.substring(lastIndex, arrow.start).trim();
80
+ if (beforeText || i === 0) segments.push(beforeText);
81
+ const arrowToken = arrow.label ? `-${arrow.label}->` : "->";
82
+ segments.push(arrowToken);
83
+ lastIndex = arrow.end;
84
+ }
85
+ const remaining = line.substring(lastIndex).trim();
86
+ if (remaining) segments.push(remaining);
87
+ return segments;
88
+ }
89
+ function parseArrowToken(token, _palette, lineNumber, diagnostics) {
90
+ if (token === "->") return {};
91
+ const m = token.match(/^-(.+?)->$/);
92
+ if (m) {
93
+ const rawLabel = m[1] ?? "";
94
+ const labelResult = parseInArrowLabel(rawLabel, lineNumber);
95
+ diagnostics.push(...labelResult.diagnostics);
96
+ return {
97
+ ...labelResult.label !== void 0 && { label: labelResult.label }
98
+ };
99
+ }
100
+ return {};
101
+ }
102
+ function parseStateNodeRef(text) {
103
+ const t = text.trim();
104
+ if (!t) return null;
105
+ if (t === "[*]") {
106
+ return {
107
+ id: PSEUDOSTATE_ID,
108
+ label: PSEUDOSTATE_LABEL,
109
+ shape: "pseudostate"
110
+ };
111
+ }
112
+ const label = t;
113
+ if (!label) return null;
114
+ return {
115
+ id: `state:${normalizeName(label)}`,
116
+ label,
117
+ shape: "state"
118
+ };
119
+ }
120
+ function parseState(content, palette) {
121
+ const lines = content.split("\n");
122
+ const options = {};
123
+ const result = {
124
+ type: "state",
125
+ direction: "LR",
126
+ nodes: [],
127
+ edges: [],
128
+ options,
129
+ diagnostics: [],
130
+ error: null
131
+ };
132
+ const fail = (line, message) => {
133
+ const diag = makeDgmoError(line, message);
134
+ result.diagnostics.push(diag);
135
+ result.error = formatDgmoError(diag);
136
+ return result;
137
+ };
138
+ const nodeMap = /* @__PURE__ */ new Map();
139
+ const indentStack = [];
140
+ const notes = [];
141
+ let currentGroup = null;
142
+ let groupIndent = -1;
143
+ const groups = [];
144
+ let contentStarted = false;
145
+ let firstLineParsed = false;
146
+ const nameAliasMap = /* @__PURE__ */ new Map();
147
+ function peelAlias(seg) {
148
+ const trimmed = seg.trim();
149
+ const m = trimmed.match(/^(.*?)\s+as\s+([A-Za-z][A-Za-z0-9_]{0,11})\s*$/);
150
+ if (!m) return { seg: trimmed };
151
+ return { seg: m[1].trim(), alias: m[2] };
152
+ }
153
+ function getOrCreateNode(ref, lineNumber) {
154
+ const key = ref.id;
155
+ const existing = nodeMap.get(key);
156
+ if (existing) {
157
+ const incomingDisplay = displayName(ref.label);
158
+ const existingDisplay = displayName(existing.label);
159
+ if (incomingDisplay !== existingDisplay) {
160
+ result.diagnostics.push(
161
+ makeDgmoError(
162
+ lineNumber,
163
+ nameMergedMessage({
164
+ incomingDisplay,
165
+ incomingLine: lineNumber,
166
+ existingDisplay,
167
+ existingLine: existing.lineNumber
168
+ }),
169
+ "warning",
170
+ NAME_DIAGNOSTIC_CODES.NAME_MERGED
171
+ )
172
+ );
173
+ }
174
+ return existing;
175
+ }
176
+ const node = {
177
+ id: key,
178
+ label: ref.label,
179
+ shape: ref.shape,
180
+ lineNumber,
181
+ ...ref.color && { color: ref.color },
182
+ ...currentGroup && { group: currentGroup.id }
183
+ };
184
+ nodeMap.set(key, node);
185
+ result.nodes.push(node);
186
+ if (currentGroup && !currentGroup.nodeIds.includes(key)) {
187
+ currentGroup.nodeIds.push(key);
188
+ }
189
+ return node;
190
+ }
191
+ function addEdge(sourceId, targetId, lineNumber, label) {
192
+ result.edges.push({
193
+ source: sourceId,
194
+ target: targetId,
195
+ lineNumber,
196
+ ...label && { label }
197
+ });
198
+ }
199
+ for (let i = 0; i < lines.length; i++) {
200
+ const raw = lines[i];
201
+ const trimmed = raw.trim();
202
+ const lineNumber = i + 1;
203
+ const indent = measureIndent(raw);
204
+ if (!trimmed) continue;
205
+ if (trimmed.startsWith("//")) continue;
206
+ if (!firstLineParsed && !contentStarted) {
207
+ const firstLineResult = parseFirstLine(trimmed);
208
+ if (firstLineResult) {
209
+ firstLineParsed = true;
210
+ if (firstLineResult.chartType !== "state") {
211
+ const allTypes = Array.from(ALL_CHART_TYPES);
212
+ let msg = `Expected chart type "state", got "${firstLineResult.chartType}"`;
213
+ const hint = suggest(firstLineResult.chartType, allTypes);
214
+ if (hint) msg += `. ${hint}`;
215
+ return fail(lineNumber, msg);
216
+ }
217
+ if (firstLineResult.title) {
218
+ result.title = firstLineResult.title;
219
+ result.titleLineNumber = lineNumber;
220
+ }
221
+ continue;
222
+ }
223
+ }
224
+ const noteResult = tryCollectNote(
225
+ lines,
226
+ i,
227
+ indent,
228
+ palette,
229
+ result.diagnostics
230
+ );
231
+ if (noteResult) {
232
+ if (noteResult.note) notes.push(noteResult.note);
233
+ i = noteResult.lastIndex;
234
+ continue;
235
+ }
236
+ const groupMatch = trimmed.match(GROUP_BRACKET_RE);
237
+ if (groupMatch && groupMatch[1].trim() !== "*") {
238
+ const groupLabel = groupMatch[1].trim();
239
+ const groupColorName = groupMatch[2]?.trim();
240
+ const groupColor = groupColorName ? resolveColorWithDiagnostic(
241
+ groupColorName,
242
+ lineNumber,
243
+ result.diagnostics,
244
+ palette
245
+ ) : void 0;
246
+ const groupCollapsed = groupMatch[3]?.toLowerCase() === "true";
247
+ currentGroup = {
248
+ id: `group:${groupLabel.toLowerCase()}`,
249
+ label: groupLabel,
250
+ nodeIds: [],
251
+ lineNumber,
252
+ ...groupColor && { color: groupColor },
253
+ ...groupCollapsed && { collapsed: true }
254
+ };
255
+ groupIndent = indent;
256
+ groups.push(currentGroup);
257
+ continue;
258
+ }
259
+ if (!contentStarted) {
260
+ if (/^direction-tb$/i.test(trimmed)) {
261
+ result.direction = "TB";
262
+ continue;
263
+ }
264
+ if (/^solid-fill$/i.test(trimmed)) {
265
+ options["solid-fill"] = "on";
266
+ continue;
267
+ }
268
+ if (/^no-color$/i.test(trimmed)) {
269
+ result.diagnostics.push(
270
+ makeDgmoError(lineNumber, '"no-color" has been removed.', "warning")
271
+ );
272
+ continue;
273
+ }
274
+ if (tryParseSharedOption(trimmed, options)) {
275
+ continue;
276
+ }
277
+ const optMatch = trimmed.match(OPTION_NOCOLON_RE);
278
+ if (optMatch && !trimmed.includes("->")) {
279
+ const key = optMatch[1].toLowerCase();
280
+ const value = optMatch[2].trim();
281
+ if (key === "no-color") {
282
+ result.diagnostics.push(
283
+ makeDgmoError(
284
+ lineNumber,
285
+ '"no-color" was removed \u2014 state colors are assigned automatically; delete this line.',
286
+ "warning"
287
+ )
288
+ );
289
+ continue;
290
+ }
291
+ options[key] = value;
292
+ continue;
293
+ }
294
+ }
295
+ contentStarted = true;
296
+ if (currentGroup && indent <= groupIndent) {
297
+ currentGroup = null;
298
+ groupIndent = -1;
299
+ }
300
+ while (indentStack.length > 0) {
301
+ const top = indentStack[indentStack.length - 1];
302
+ if (top.indent >= indent) {
303
+ indentStack.pop();
304
+ } else {
305
+ break;
306
+ }
307
+ }
308
+ const implicitSourceId = indentStack.length > 0 ? (
309
+ // In-bounds by length check above.
310
+ indentStack[indentStack.length - 1].nodeId
311
+ ) : null;
312
+ const segments = splitArrows(trimmed);
313
+ if (segments.length === 1) {
314
+ const peeled = peelAlias(segments[0]);
315
+ const ref = parseStateNodeRef(peeled.seg);
316
+ if (ref) {
317
+ const node = getOrCreateNode(ref, lineNumber);
318
+ if (peeled.alias) nameAliasMap.set(peeled.alias, node.id);
319
+ node.lineNumber = lineNumber;
320
+ indentStack.push({ nodeId: node.id, indent });
321
+ } else {
322
+ const aliasResolved = nameAliasMap.get(peeled.seg.trim());
323
+ if (aliasResolved !== void 0) {
324
+ indentStack.push({ nodeId: aliasResolved, indent });
325
+ }
326
+ }
327
+ continue;
328
+ }
329
+ let lastNodeId = null;
330
+ let pendingArrow = null;
331
+ for (let j = 0; j < segments.length; j++) {
332
+ const seg = segments[j];
333
+ if (seg === "->" || /^-.+->$/.test(seg)) {
334
+ pendingArrow = parseArrowToken(
335
+ seg,
336
+ palette,
337
+ lineNumber,
338
+ result.diagnostics
339
+ );
340
+ continue;
341
+ }
342
+ const peeled = peelAlias(seg);
343
+ let ref = parseStateNodeRef(peeled.seg);
344
+ if (!ref) {
345
+ const aliasResolved = nameAliasMap.get(peeled.seg.trim());
346
+ if (aliasResolved !== void 0) {
347
+ const existing = nodeMap.get(aliasResolved);
348
+ if (existing) {
349
+ const shape = existing.shape;
350
+ ref = {
351
+ id: aliasResolved,
352
+ label: existing.label,
353
+ shape
354
+ };
355
+ }
356
+ }
357
+ }
358
+ if (!ref) continue;
359
+ const node = getOrCreateNode(ref, lineNumber);
360
+ if (peeled.alias) nameAliasMap.set(peeled.alias, node.id);
361
+ if (pendingArrow !== null) {
362
+ const sourceId = lastNodeId ?? implicitSourceId;
363
+ if (sourceId) {
364
+ addEdge(sourceId, node.id, lineNumber, pendingArrow.label);
365
+ }
366
+ pendingArrow = null;
367
+ }
368
+ lastNodeId = node.id;
369
+ }
370
+ if (lastNodeId) {
371
+ indentStack.push({ nodeId: lastNodeId, indent });
372
+ }
373
+ }
374
+ if (groups.length > 0) result.groups = groups;
375
+ if (notes.length > 0) {
376
+ result.notes = notes;
377
+ resolveNotes(notes, result.nodes, result.diagnostics);
378
+ }
379
+ if (result.nodes.length === 0 && !result.error) {
380
+ const diag = makeDgmoError(
381
+ 1,
382
+ "No states found. Add state transitions like: Idle -> Active"
383
+ );
384
+ result.diagnostics.push(diag);
385
+ result.error = formatDgmoError(diag);
386
+ }
387
+ if (result.nodes.length >= 2 && result.edges.length >= 1 && !result.error) {
388
+ const connectedIds = /* @__PURE__ */ new Set();
389
+ for (const edge of result.edges) {
390
+ connectedIds.add(edge.source);
391
+ connectedIds.add(edge.target);
392
+ }
393
+ for (const node of result.nodes) {
394
+ if (!connectedIds.has(node.id)) {
395
+ result.diagnostics.push(
396
+ makeDgmoError(
397
+ node.lineNumber,
398
+ `State "${node.label}" is not connected to any other state`,
399
+ "warning"
400
+ )
401
+ );
402
+ }
403
+ }
404
+ }
405
+ return result;
406
+ }
407
+ function looksLikeState(content) {
408
+ return content.includes("[*]") && content.includes("->");
409
+ }
410
+
411
+ export {
412
+ parseState,
413
+ looksLikeState
414
+ };
415
+ //# sourceMappingURL=chunk-3MQQNXPD.js.map