@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,469 @@
1
+ import {
2
+ GRAPH_DX
3
+ } from "./chunk-I46X5VUA.js";
4
+ import {
5
+ tryCollectNote
6
+ } from "./chunk-5MLYVTYM.js";
7
+ import {
8
+ resolveNotes
9
+ } from "./chunk-FMDSF3OV.js";
10
+ import {
11
+ parseInArrowLabel
12
+ } from "./chunk-FFUN5D66.js";
13
+ import {
14
+ displayName,
15
+ normalizeName
16
+ } from "./chunk-NOTA6TEI.js";
17
+ import {
18
+ ALL_CHART_TYPES,
19
+ OPTION_NOCOLON_RE,
20
+ measureIndent,
21
+ parseFirstLine,
22
+ tryParseSharedOption
23
+ } from "./chunk-Y3J7VR52.js";
24
+ import {
25
+ NAME_DIAGNOSTIC_CODES,
26
+ emit,
27
+ formatDgmoError,
28
+ makeDgmoError,
29
+ nameMergedMessage,
30
+ suggest
31
+ } from "./chunk-CXK4DZH3.js";
32
+
33
+ // src/graph/flowchart-parser.ts
34
+ function nodeId(shape, label) {
35
+ return `${shape}:${normalizeName(label)}`;
36
+ }
37
+ function parseNodeRef(text) {
38
+ const t = text.trim();
39
+ if (!t) return null;
40
+ let m = t.match(/^\[\[([^\]]+)\]\]$/);
41
+ if (m) {
42
+ const label = m[1].trim();
43
+ return { id: nodeId("subroutine", label), label, shape: "subroutine" };
44
+ }
45
+ m = t.match(/^\[([^\]]+)~\]$/);
46
+ if (m) {
47
+ const label = m[1].trim();
48
+ return { id: nodeId("document", label), label, shape: "document" };
49
+ }
50
+ m = t.match(/^\[([^\]]+)\]$/);
51
+ if (m) {
52
+ const label = m[1].trim();
53
+ return { id: nodeId("process", label), label, shape: "process" };
54
+ }
55
+ m = t.match(/^\((.+)\)$/);
56
+ if (m) {
57
+ const label = m[1].trim();
58
+ return { id: nodeId("terminal", label), label, shape: "terminal" };
59
+ }
60
+ m = t.match(/^<([^>]+)>$/);
61
+ if (m) {
62
+ const label = m[1].trim();
63
+ return { id: nodeId("decision", label), label, shape: "decision" };
64
+ }
65
+ m = t.match(/^\/([^/]+)\/$/);
66
+ if (m) {
67
+ const label = m[1].trim();
68
+ return { id: nodeId("io", label), label, shape: "io" };
69
+ }
70
+ return null;
71
+ }
72
+ function parseNodeRefLoose(text) {
73
+ const t = text.trim();
74
+ const shapeRe = /^(\[\[.+?\]\]|\[.+?~\]|\[.+?\]|\(.+?\)|<.+?>|\/.+?\/)\s+(\S.*)$/;
75
+ const m = t.match(shapeRe);
76
+ if (!m) return null;
77
+ const ref = parseNodeRef(m[1]);
78
+ if (!ref) return null;
79
+ return { ref, trailing: m[2].trim() };
80
+ }
81
+ function splitArrows(line) {
82
+ const segments = [];
83
+ const arrowPositions = [];
84
+ let searchFrom = 0;
85
+ let scanFloor = 0;
86
+ while (searchFrom < line.length) {
87
+ const idx = line.indexOf("->", searchFrom);
88
+ if (idx === -1) break;
89
+ let runStart = idx;
90
+ while (runStart > scanFloor && line[runStart - 1] === "-") runStart--;
91
+ const arrowEnd = idx + 2;
92
+ let arrowStart;
93
+ let label;
94
+ let openingStart = -1;
95
+ for (let i = scanFloor; i < runStart; i++) {
96
+ if (line[i] !== "-") continue;
97
+ const prevIsWsOrFloor = i === 0 || i === scanFloor || /\s/.test(line.charAt(i - 1));
98
+ if (prevIsWsOrFloor) {
99
+ openingStart = i;
100
+ break;
101
+ }
102
+ }
103
+ if (openingStart !== -1) {
104
+ let openingEnd = openingStart;
105
+ while (openingEnd < runStart && line[openingEnd] === "-") openingEnd++;
106
+ const labelPart = line.substring(openingEnd, runStart).trim();
107
+ if (labelPart) label = labelPart;
108
+ arrowStart = openingStart;
109
+ } else {
110
+ arrowStart = runStart;
111
+ }
112
+ arrowPositions.push({
113
+ start: arrowStart,
114
+ end: arrowEnd,
115
+ ...label !== void 0 && { label }
116
+ });
117
+ searchFrom = arrowEnd;
118
+ scanFloor = arrowEnd;
119
+ }
120
+ if (arrowPositions.length === 0) {
121
+ return [line];
122
+ }
123
+ let lastIndex = 0;
124
+ for (let i = 0; i < arrowPositions.length; i++) {
125
+ const arrow = arrowPositions[i];
126
+ const beforeText = line.substring(lastIndex, arrow.start).trim();
127
+ if (beforeText || i === 0) {
128
+ segments.push(beforeText);
129
+ }
130
+ const arrowToken = arrow.label ? `-${arrow.label}->` : "->";
131
+ segments.push(arrowToken);
132
+ lastIndex = arrow.end;
133
+ }
134
+ const remaining = line.substring(lastIndex).trim();
135
+ if (remaining) {
136
+ segments.push(remaining);
137
+ }
138
+ return segments;
139
+ }
140
+ function parseArrowToken(token, _palette, lineNumber, diagnostics) {
141
+ if (token === "->") return {};
142
+ const m = token.match(/^-(.+?)->$/);
143
+ if (m) {
144
+ const rawLabel = m[1] ?? "";
145
+ const labelResult = parseInArrowLabel(rawLabel, lineNumber);
146
+ diagnostics.push(...labelResult.diagnostics);
147
+ return {
148
+ ...labelResult.label !== void 0 && { label: labelResult.label }
149
+ };
150
+ }
151
+ return {};
152
+ }
153
+ function parseFlowchart(content, palette) {
154
+ const lines = content.split("\n");
155
+ const options = {};
156
+ const result = {
157
+ type: "flowchart",
158
+ direction: "TB",
159
+ nodes: [],
160
+ edges: [],
161
+ options,
162
+ diagnostics: [],
163
+ error: null
164
+ };
165
+ const fail = (line, message) => {
166
+ const diag = makeDgmoError(line, message);
167
+ result.diagnostics.push(diag);
168
+ result.error = formatDgmoError(diag);
169
+ return result;
170
+ };
171
+ const nodeMap = /* @__PURE__ */ new Map();
172
+ const indentStack = [];
173
+ const notes = [];
174
+ let contentStarted = false;
175
+ let firstLineParsed = false;
176
+ let prevLineLastNodeId = null;
177
+ const nameAliasMap = /* @__PURE__ */ new Map();
178
+ function peelAlias(seg) {
179
+ const trimmed = seg.trim();
180
+ const m = trimmed.match(/^(.*?)\s+as\s+([A-Za-z][A-Za-z0-9_]{0,11})\s*$/);
181
+ if (!m) return { seg: trimmed };
182
+ return { seg: m[1].trim(), alias: m[2] };
183
+ }
184
+ const suffixWarnedLines = /* @__PURE__ */ new Set();
185
+ function warnUnsupportedSuffix(lineNumber, trailing) {
186
+ if (suffixWarnedLines.has(lineNumber)) return;
187
+ suffixWarnedLines.add(lineNumber);
188
+ result.diagnostics.push(
189
+ emit(GRAPH_DX.FLOWCHART_NODE_SUFFIX, lineNumber, { trailing })
190
+ );
191
+ }
192
+ function getOrCreateNode(ref, lineNumber) {
193
+ const key = ref.id;
194
+ const existing = nodeMap.get(key);
195
+ if (existing) {
196
+ const incomingDisplay = displayName(ref.label);
197
+ const existingDisplay = displayName(existing.label);
198
+ if (incomingDisplay !== existingDisplay) {
199
+ result.diagnostics.push(
200
+ makeDgmoError(
201
+ lineNumber,
202
+ nameMergedMessage({
203
+ incomingDisplay,
204
+ incomingLine: lineNumber,
205
+ existingDisplay,
206
+ existingLine: existing.lineNumber
207
+ }),
208
+ "warning",
209
+ NAME_DIAGNOSTIC_CODES.NAME_MERGED
210
+ )
211
+ );
212
+ }
213
+ return existing;
214
+ }
215
+ const node = {
216
+ id: key,
217
+ label: ref.label,
218
+ shape: ref.shape,
219
+ lineNumber,
220
+ ...ref.color && { color: ref.color }
221
+ };
222
+ nodeMap.set(key, node);
223
+ result.nodes.push(node);
224
+ return node;
225
+ }
226
+ function addEdge(sourceId, targetId, lineNumber, label) {
227
+ const edge = {
228
+ source: sourceId,
229
+ target: targetId,
230
+ lineNumber,
231
+ ...label && { label }
232
+ };
233
+ result.edges.push(edge);
234
+ }
235
+ function processContentLine(trimmed, lineNumber, indent) {
236
+ contentStarted = true;
237
+ while (indentStack.length > 0) {
238
+ const top = indentStack[indentStack.length - 1];
239
+ if (top.indent >= indent) {
240
+ indentStack.pop();
241
+ } else {
242
+ break;
243
+ }
244
+ }
245
+ const implicitSourceId = indentStack.length > 0 ? (
246
+ // In-bounds: length > 0 guarded by ternary.
247
+ indentStack[indentStack.length - 1].nodeId
248
+ ) : null;
249
+ const segments = splitArrows(trimmed);
250
+ const startsWithArrow = segments.length >= 2 && segments[0].trim() === "";
251
+ const effectiveSource = implicitSourceId ?? (startsWithArrow ? prevLineLastNodeId : null);
252
+ if (segments.length === 1) {
253
+ const peeled = peelAlias(segments[0]);
254
+ const ref = parseNodeRef(peeled.seg);
255
+ if (ref) {
256
+ const node = getOrCreateNode(ref, lineNumber);
257
+ if (peeled.alias) nameAliasMap.set(peeled.alias, node.id);
258
+ indentStack.push({ nodeId: node.id, indent });
259
+ return node.id;
260
+ }
261
+ const loose = parseNodeRefLoose(peeled.seg);
262
+ if (loose) {
263
+ warnUnsupportedSuffix(lineNumber, loose.trailing);
264
+ const node = getOrCreateNode(loose.ref, lineNumber);
265
+ indentStack.push({ nodeId: node.id, indent });
266
+ return node.id;
267
+ }
268
+ const aliasResolved = nameAliasMap.get(peeled.seg.trim());
269
+ if (aliasResolved !== void 0) {
270
+ indentStack.push({ nodeId: aliasResolved, indent });
271
+ return aliasResolved;
272
+ }
273
+ return null;
274
+ }
275
+ let lastNodeId = null;
276
+ let pendingArrow = null;
277
+ for (let i = 0; i < segments.length; i++) {
278
+ const seg = segments[i];
279
+ if (seg === "->" || /^-.+->$/.test(seg)) {
280
+ pendingArrow = parseArrowToken(
281
+ seg,
282
+ palette,
283
+ lineNumber,
284
+ result.diagnostics
285
+ );
286
+ continue;
287
+ }
288
+ const peeled = peelAlias(seg);
289
+ let ref = parseNodeRef(peeled.seg);
290
+ if (!ref) {
291
+ const aliasResolved = nameAliasMap.get(peeled.seg.trim());
292
+ if (aliasResolved !== void 0) {
293
+ const existing = nodeMap.get(aliasResolved);
294
+ if (existing) {
295
+ ref = {
296
+ id: aliasResolved,
297
+ label: existing.label,
298
+ shape: existing.shape
299
+ };
300
+ }
301
+ }
302
+ }
303
+ if (!ref) {
304
+ const loose = parseNodeRefLoose(peeled.seg);
305
+ if (loose) {
306
+ warnUnsupportedSuffix(lineNumber, loose.trailing);
307
+ ref = loose.ref;
308
+ }
309
+ }
310
+ if (!ref) continue;
311
+ const node = getOrCreateNode(ref, lineNumber);
312
+ if (peeled.alias) nameAliasMap.set(peeled.alias, node.id);
313
+ if (pendingArrow !== null) {
314
+ const sourceId = lastNodeId ?? effectiveSource;
315
+ if (sourceId) {
316
+ addEdge(sourceId, node.id, lineNumber, pendingArrow.label);
317
+ }
318
+ pendingArrow = null;
319
+ } else if (lastNodeId === null && effectiveSource === null) {
320
+ }
321
+ lastNodeId = node.id;
322
+ }
323
+ if (pendingArrow !== null && lastNodeId === null && implicitSourceId) {
324
+ }
325
+ if (segments.length >= 2 && segments[0] === "" && implicitSourceId && lastNodeId) {
326
+ }
327
+ if (lastNodeId) {
328
+ indentStack.push({ nodeId: lastNodeId, indent });
329
+ }
330
+ return lastNodeId;
331
+ }
332
+ for (let i = 0; i < lines.length; i++) {
333
+ const raw = lines[i];
334
+ const trimmed = raw.trim();
335
+ const lineNumber = i + 1;
336
+ const indent = measureIndent(raw);
337
+ if (!trimmed) continue;
338
+ if (trimmed.startsWith("//")) continue;
339
+ if (!firstLineParsed && !contentStarted) {
340
+ const firstLineResult = parseFirstLine(trimmed);
341
+ if (firstLineResult) {
342
+ firstLineParsed = true;
343
+ if (firstLineResult.chartType !== "flowchart") {
344
+ const allTypes = Array.from(ALL_CHART_TYPES);
345
+ let msg = `Expected chart type "flowchart", got "${firstLineResult.chartType}"`;
346
+ const hint = suggest(firstLineResult.chartType, allTypes);
347
+ if (hint) msg += `. ${hint}`;
348
+ return fail(lineNumber, msg);
349
+ }
350
+ if (firstLineResult.title) {
351
+ result.title = firstLineResult.title;
352
+ result.titleLineNumber = lineNumber;
353
+ }
354
+ continue;
355
+ }
356
+ }
357
+ const noteResult = tryCollectNote(
358
+ lines,
359
+ i,
360
+ indent,
361
+ palette,
362
+ result.diagnostics
363
+ );
364
+ if (noteResult) {
365
+ if (noteResult.note) notes.push(noteResult.note);
366
+ i = noteResult.lastIndex;
367
+ continue;
368
+ }
369
+ if (!contentStarted) {
370
+ if (/^direction-lr$/i.test(trimmed)) {
371
+ result.direction = "LR";
372
+ continue;
373
+ }
374
+ if (/^solid-fill$/i.test(trimmed)) {
375
+ options["solid-fill"] = "on";
376
+ continue;
377
+ }
378
+ if (/^no-color$/i.test(trimmed)) {
379
+ result.diagnostics.push(
380
+ makeDgmoError(lineNumber, '"no-color" has been removed.', "warning")
381
+ );
382
+ continue;
383
+ }
384
+ if (tryParseSharedOption(trimmed, options)) {
385
+ continue;
386
+ }
387
+ const optMatch = trimmed.match(OPTION_NOCOLON_RE);
388
+ if (optMatch && !trimmed.includes("->")) {
389
+ const key = optMatch[1].toLowerCase();
390
+ const value = optMatch[2].trim();
391
+ if (key === "no-color") {
392
+ result.diagnostics.push(
393
+ makeDgmoError(
394
+ lineNumber,
395
+ '"no-color" was removed \u2014 node colors are assigned automatically by shape; delete this line.',
396
+ "warning"
397
+ )
398
+ );
399
+ continue;
400
+ }
401
+ options[key] = value;
402
+ continue;
403
+ }
404
+ }
405
+ const lastId = processContentLine(trimmed, lineNumber, indent);
406
+ if (lastId) prevLineLastNodeId = lastId;
407
+ }
408
+ if (result.nodes.length === 0 && !result.error) {
409
+ const diag = makeDgmoError(
410
+ 1,
411
+ "No nodes found. Add flowchart content with shape syntax like [Process] or (Start)."
412
+ );
413
+ result.diagnostics.push(diag);
414
+ result.error = formatDgmoError(diag);
415
+ }
416
+ if (notes.length > 0) {
417
+ result.notes = notes;
418
+ resolveNotes(notes, result.nodes, result.diagnostics);
419
+ }
420
+ if (result.nodes.length >= 2 && result.edges.length >= 1 && !result.error) {
421
+ const connectedIds = /* @__PURE__ */ new Set();
422
+ for (const edge of result.edges) {
423
+ connectedIds.add(edge.source);
424
+ connectedIds.add(edge.target);
425
+ }
426
+ for (const node of result.nodes) {
427
+ if (!connectedIds.has(node.id)) {
428
+ result.diagnostics.push(
429
+ makeDgmoError(
430
+ node.lineNumber,
431
+ `Node "${node.label}" is not connected to any other node`,
432
+ "warning"
433
+ )
434
+ );
435
+ }
436
+ }
437
+ }
438
+ return result;
439
+ }
440
+ function looksLikeFlowchart(content) {
441
+ if (!content.includes("->")) return false;
442
+ const hasShapeDelimiter = /\[[^\]]+\]/.test(content) || /\([^)]+\)/.test(content) || /<[^>]+>/.test(content) || /\/[^/]+\//.test(content);
443
+ if (!hasShapeDelimiter) return false;
444
+ const shapeNearArrow = /[\])][ \t]*-.*->/.test(content) || // shape ] or ) followed by arrow
445
+ /->[ \t]*[[(</]/.test(content);
446
+ return shapeNearArrow;
447
+ }
448
+ var NODE_ID_RE = /^([a-zA-Z_][\w-]*)[\s([</{]/;
449
+ function extractSymbols(docText) {
450
+ const entities = [];
451
+ let inMetadata = true;
452
+ for (const rawLine of docText.split("\n")) {
453
+ const line = rawLine.trim();
454
+ if (inMetadata && (/^[a-z-]+\s*:/i.test(line) || /^[a-z-]+\s+\S/i.test(line)))
455
+ continue;
456
+ inMetadata = false;
457
+ if (line.length === 0 || /^\s/.test(rawLine)) continue;
458
+ const m = NODE_ID_RE.exec(line);
459
+ if (m && !entities.includes(m[1])) entities.push(m[1]);
460
+ }
461
+ return { kind: "flowchart", entities };
462
+ }
463
+
464
+ export {
465
+ parseFlowchart,
466
+ looksLikeFlowchart,
467
+ extractSymbols
468
+ };
469
+ //# sourceMappingURL=chunk-LIOHW36Z.js.map
@@ -0,0 +1,16 @@
1
+ // src/utils/arrow-markers.ts
2
+ function appendArrowheadMarkers(defs, opts) {
3
+ const { idPrefix, width, height, baseFill, colors } = opts;
4
+ const appendMarker = (id, fill) => {
5
+ defs.append("marker").attr("id", id).attr("viewBox", `0 0 ${width} ${height}`).attr("refX", width).attr("refY", height / 2).attr("markerWidth", width).attr("markerHeight", height).attr("orient", "auto").append("polygon").attr("points", `0,0 ${width},${height / 2} 0,${height}`).attr("fill", fill);
6
+ };
7
+ appendMarker(`${idPrefix}-arrow`, baseFill);
8
+ for (const color of colors ?? []) {
9
+ appendMarker(`${idPrefix}-arrow-${color.replace("#", "")}`, color);
10
+ }
11
+ }
12
+
13
+ export {
14
+ appendArrowheadMarkers
15
+ };
16
+ //# sourceMappingURL=chunk-LP7EC4MI.js.map