callman-core 1.28.0 → 1.29.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 (345) hide show
  1. package/ai-packs/scenario-nodes.md +451 -0
  2. package/dist/ai/index.d.ts +2 -1
  3. package/dist/ai/index.d.ts.map +1 -1
  4. package/dist/ai/index.js +1 -0
  5. package/dist/ai/index.js.map +1 -1
  6. package/dist/ai/outputSchemas.d.ts +3 -0
  7. package/dist/ai/outputSchemas.d.ts.map +1 -1
  8. package/dist/ai/outputSchemas.js +1 -0
  9. package/dist/ai/outputSchemas.js.map +1 -1
  10. package/dist/ai/parse/diagram.d.ts.map +1 -1
  11. package/dist/ai/parse/diagram.js +6 -3
  12. package/dist/ai/parse/diagram.js.map +1 -1
  13. package/dist/ai/prompts/diagram.d.ts +7 -3
  14. package/dist/ai/prompts/diagram.d.ts.map +1 -1
  15. package/dist/ai/prompts/diagram.js +44 -5
  16. package/dist/ai/prompts/diagram.js.map +1 -1
  17. package/dist/ai/prompts/scenario.d.ts.map +1 -1
  18. package/dist/ai/prompts/scenario.js +9 -8
  19. package/dist/ai/prompts/scenario.js.map +1 -1
  20. package/dist/ai/prompts/scenarioNodeReference.d.ts +16 -0
  21. package/dist/ai/prompts/scenarioNodeReference.d.ts.map +1 -0
  22. package/dist/ai/prompts/scenarioNodeReference.js +882 -0
  23. package/dist/ai/prompts/scenarioNodeReference.js.map +1 -0
  24. package/dist/ai/types.d.ts +6 -0
  25. package/dist/ai/types.d.ts.map +1 -1
  26. package/dist/diagram/bpmn/derive.d.ts +74 -0
  27. package/dist/diagram/bpmn/derive.d.ts.map +1 -0
  28. package/dist/diagram/bpmn/derive.js +392 -0
  29. package/dist/diagram/bpmn/derive.js.map +1 -0
  30. package/dist/diagram/bpmn/index.d.ts +7 -0
  31. package/dist/diagram/bpmn/index.d.ts.map +1 -0
  32. package/dist/diagram/bpmn/index.js +12 -0
  33. package/dist/diagram/bpmn/index.js.map +1 -0
  34. package/dist/diagram/bpmn/patch.d.ts +14 -0
  35. package/dist/diagram/bpmn/patch.d.ts.map +1 -0
  36. package/dist/diagram/bpmn/patch.js +770 -0
  37. package/dist/diagram/bpmn/patch.js.map +1 -0
  38. package/dist/diagram/bpmn/place.d.ts +4 -0
  39. package/dist/diagram/bpmn/place.d.ts.map +1 -0
  40. package/dist/diagram/bpmn/place.js +65 -0
  41. package/dist/diagram/bpmn/place.js.map +1 -0
  42. package/dist/diagram/bpmn/serialize.d.ts +12 -0
  43. package/dist/diagram/bpmn/serialize.d.ts.map +1 -0
  44. package/dist/diagram/bpmn/serialize.js +292 -0
  45. package/dist/diagram/bpmn/serialize.js.map +1 -0
  46. package/dist/diagram/bpmn/types.d.ts +42 -0
  47. package/dist/diagram/bpmn/types.d.ts.map +1 -0
  48. package/dist/diagram/bpmn/types.js +84 -0
  49. package/dist/diagram/bpmn/types.js.map +1 -0
  50. package/dist/diagram/bpmn/xml.d.ts +60 -0
  51. package/dist/diagram/bpmn/xml.d.ts.map +1 -0
  52. package/dist/diagram/bpmn/xml.js +342 -0
  53. package/dist/diagram/bpmn/xml.js.map +1 -0
  54. package/dist/diagram/elkGraph.d.ts +1 -3
  55. package/dist/diagram/elkGraph.d.ts.map +1 -1
  56. package/dist/diagram/elkGraph.js +1 -0
  57. package/dist/diagram/elkGraph.js.map +1 -1
  58. package/dist/diagram/fixtures.d.ts +10 -0
  59. package/dist/diagram/fixtures.d.ts.map +1 -0
  60. package/dist/diagram/fixtures.js +113 -0
  61. package/dist/diagram/fixtures.js.map +1 -0
  62. package/dist/diagram/geometry.d.ts +27 -0
  63. package/dist/diagram/geometry.d.ts.map +1 -0
  64. package/dist/diagram/geometry.js +122 -0
  65. package/dist/diagram/geometry.js.map +1 -0
  66. package/dist/diagram/history.d.ts +36 -0
  67. package/dist/diagram/history.d.ts.map +1 -0
  68. package/dist/diagram/history.js +54 -0
  69. package/dist/diagram/history.js.map +1 -0
  70. package/dist/diagram/ids.d.ts +5 -0
  71. package/dist/diagram/ids.d.ts.map +1 -0
  72. package/dist/diagram/ids.js +52 -0
  73. package/dist/diagram/ids.js.map +1 -0
  74. package/dist/diagram/index.d.ts +14 -2
  75. package/dist/diagram/index.d.ts.map +1 -1
  76. package/dist/diagram/index.js +20 -8
  77. package/dist/diagram/index.js.map +1 -1
  78. package/dist/diagram/layout.d.ts +107 -0
  79. package/dist/diagram/layout.d.ts.map +1 -0
  80. package/dist/diagram/layout.js +356 -0
  81. package/dist/diagram/layout.js.map +1 -0
  82. package/dist/diagram/mermaid/derive.d.ts +55 -0
  83. package/dist/diagram/mermaid/derive.d.ts.map +1 -0
  84. package/dist/diagram/mermaid/derive.js +343 -0
  85. package/dist/diagram/mermaid/derive.js.map +1 -0
  86. package/dist/diagram/mermaid/index.d.ts +8 -0
  87. package/dist/diagram/mermaid/index.d.ts.map +1 -0
  88. package/dist/diagram/mermaid/index.js +24 -0
  89. package/dist/diagram/mermaid/index.js.map +1 -0
  90. package/dist/diagram/mermaid/parse.d.ts +96 -0
  91. package/dist/diagram/mermaid/parse.d.ts.map +1 -0
  92. package/dist/diagram/mermaid/parse.js +672 -0
  93. package/dist/diagram/mermaid/parse.js.map +1 -0
  94. package/dist/diagram/mermaid/patch.d.ts +16 -0
  95. package/dist/diagram/mermaid/patch.d.ts.map +1 -0
  96. package/dist/diagram/mermaid/patch.js +463 -0
  97. package/dist/diagram/mermaid/patch.js.map +1 -0
  98. package/dist/diagram/mermaid/serialize.d.ts +14 -0
  99. package/dist/diagram/mermaid/serialize.d.ts.map +1 -0
  100. package/dist/diagram/mermaid/serialize.js +125 -0
  101. package/dist/diagram/mermaid/serialize.js.map +1 -0
  102. package/dist/diagram/mermaid/shapes.d.ts +11 -0
  103. package/dist/diagram/mermaid/shapes.d.ts.map +1 -0
  104. package/dist/diagram/mermaid/shapes.js +320 -0
  105. package/dist/diagram/mermaid/shapes.js.map +1 -0
  106. package/dist/diagram/migrations.d.ts +1 -0
  107. package/dist/diagram/migrations.d.ts.map +1 -1
  108. package/dist/diagram/migrations.js +7 -2
  109. package/dist/diagram/migrations.js.map +1 -1
  110. package/dist/diagram/normalize.d.ts +9 -1
  111. package/dist/diagram/normalize.d.ts.map +1 -1
  112. package/dist/diagram/normalize.js +194 -0
  113. package/dist/diagram/normalize.js.map +1 -1
  114. package/dist/diagram/ops.d.ts +146 -0
  115. package/dist/diagram/ops.d.ts.map +1 -0
  116. package/dist/diagram/ops.js +823 -0
  117. package/dist/diagram/ops.js.map +1 -0
  118. package/dist/diagram/opsReference.d.ts +3 -0
  119. package/dist/diagram/opsReference.d.ts.map +1 -0
  120. package/dist/diagram/opsReference.js +51 -0
  121. package/dist/diagram/opsReference.js.map +1 -0
  122. package/dist/diagram/patchInput.d.ts +193 -0
  123. package/dist/diagram/patchInput.d.ts.map +1 -0
  124. package/dist/diagram/patchInput.js +621 -0
  125. package/dist/diagram/patchInput.js.map +1 -0
  126. package/dist/diagram/routing/batch.d.ts +45 -0
  127. package/dist/diagram/routing/batch.d.ts.map +1 -0
  128. package/dist/diagram/routing/batch.js +136 -0
  129. package/dist/diagram/routing/batch.js.map +1 -0
  130. package/dist/diagram/routing/curves.d.ts +7 -0
  131. package/dist/diagram/routing/curves.d.ts.map +1 -0
  132. package/dist/diagram/routing/curves.js +120 -0
  133. package/dist/diagram/routing/curves.js.map +1 -0
  134. package/dist/diagram/routing/grid.d.ts +15 -0
  135. package/dist/diagram/routing/grid.d.ts.map +1 -0
  136. package/dist/diagram/routing/grid.js +245 -0
  137. package/dist/diagram/routing/grid.js.map +1 -0
  138. package/dist/diagram/routing/index.d.ts +10 -0
  139. package/dist/diagram/routing/index.d.ts.map +1 -0
  140. package/dist/diagram/routing/index.js +10 -0
  141. package/dist/diagram/routing/index.js.map +1 -0
  142. package/dist/diagram/routing/legacy.d.ts +6 -0
  143. package/dist/diagram/routing/legacy.d.ts.map +1 -0
  144. package/dist/diagram/routing/legacy.js +27 -0
  145. package/dist/diagram/routing/legacy.js.map +1 -0
  146. package/dist/diagram/routing/nudge.d.ts +4 -0
  147. package/dist/diagram/routing/nudge.d.ts.map +1 -0
  148. package/dist/diagram/routing/nudge.js +96 -0
  149. package/dist/diagram/routing/nudge.js.map +1 -0
  150. package/dist/diagram/routing/orthogonal.d.ts +6 -0
  151. package/dist/diagram/routing/orthogonal.d.ts.map +1 -0
  152. package/dist/diagram/routing/orthogonal.js +56 -0
  153. package/dist/diagram/routing/orthogonal.js.map +1 -0
  154. package/dist/diagram/routing/path.d.ts +16 -0
  155. package/dist/diagram/routing/path.d.ts.map +1 -0
  156. package/dist/diagram/routing/path.js +128 -0
  157. package/dist/diagram/routing/path.js.map +1 -0
  158. package/dist/diagram/routing/sides.d.ts +22 -0
  159. package/dist/diagram/routing/sides.d.ts.map +1 -0
  160. package/dist/diagram/routing/sides.js +74 -0
  161. package/dist/diagram/routing/sides.js.map +1 -0
  162. package/dist/diagram/routing/types.d.ts +46 -0
  163. package/dist/diagram/routing/types.d.ts.map +1 -0
  164. package/dist/diagram/routing/types.js +11 -0
  165. package/dist/diagram/routing/types.js.map +1 -0
  166. package/dist/diagram/schema.d.ts +70 -37
  167. package/dist/diagram/schema.d.ts.map +1 -1
  168. package/dist/diagram/schema.js +62 -8
  169. package/dist/diagram/schema.js.map +1 -1
  170. package/dist/diagram/styleInput.d.ts +41 -0
  171. package/dist/diagram/styleInput.d.ts.map +1 -0
  172. package/dist/diagram/styleInput.js +105 -0
  173. package/dist/diagram/styleInput.js.map +1 -0
  174. package/dist/diagram/views.d.ts +9 -0
  175. package/dist/diagram/views.d.ts.map +1 -0
  176. package/dist/diagram/views.js +42 -0
  177. package/dist/diagram/views.js.map +1 -0
  178. package/dist/http-file/flatImport.d.ts +1 -0
  179. package/dist/http-file/flatImport.d.ts.map +1 -1
  180. package/dist/http-file/flatImport.js.map +1 -1
  181. package/dist/http-file/index.d.ts +1 -1
  182. package/dist/http-file/index.d.ts.map +1 -1
  183. package/dist/http-file/index.js +1 -1
  184. package/dist/http-file/index.js.map +1 -1
  185. package/dist/http-file/parseHttpFile.d.ts +1 -0
  186. package/dist/http-file/parseHttpFile.d.ts.map +1 -1
  187. package/dist/http-file/parseHttpFile.js +40 -8
  188. package/dist/http-file/parseHttpFile.js.map +1 -1
  189. package/dist/index.d.ts +1 -0
  190. package/dist/index.d.ts.map +1 -1
  191. package/dist/index.js +3 -0
  192. package/dist/index.js.map +1 -1
  193. package/dist/request/requestBody.d.ts +55 -0
  194. package/dist/request/requestBody.d.ts.map +1 -0
  195. package/dist/request/requestBody.js +198 -0
  196. package/dist/request/requestBody.js.map +1 -0
  197. package/dist/runner/requestRunner.d.ts.map +1 -1
  198. package/dist/runner/requestRunner.js +127 -43
  199. package/dist/runner/requestRunner.js.map +1 -1
  200. package/dist/runner/runCollection.d.ts +1 -1
  201. package/dist/runner/runCollection.d.ts.map +1 -1
  202. package/dist/runner/runCollection.js +9 -2
  203. package/dist/runner/runCollection.js.map +1 -1
  204. package/dist/scenario-runner/adapters/helpers/request-helpers.d.ts +2 -1
  205. package/dist/scenario-runner/adapters/helpers/request-helpers.d.ts.map +1 -1
  206. package/dist/scenario-runner/adapters/helpers/request-helpers.js +8 -40
  207. package/dist/scenario-runner/adapters/helpers/request-helpers.js.map +1 -1
  208. package/dist/scenario-runner/adapters/request-executor.d.ts.map +1 -1
  209. package/dist/scenario-runner/adapters/request-executor.js +2 -29
  210. package/dist/scenario-runner/adapters/request-executor.js.map +1 -1
  211. package/dist/scenario-runner/index.d.ts +1 -0
  212. package/dist/scenario-runner/index.d.ts.map +1 -1
  213. package/dist/scenario-runner/index.js +1 -0
  214. package/dist/scenario-runner/index.js.map +1 -1
  215. package/dist/scenario-runner/labels.d.ts +3 -0
  216. package/dist/scenario-runner/labels.d.ts.map +1 -0
  217. package/dist/scenario-runner/labels.js +20 -0
  218. package/dist/scenario-runner/labels.js.map +1 -0
  219. package/dist/scenario-runner/runScenario.d.ts.map +1 -1
  220. package/dist/scenario-runner/runScenario.js +4 -11
  221. package/dist/scenario-runner/runScenario.js.map +1 -1
  222. package/dist/script/legacy.d.ts.map +1 -1
  223. package/dist/script/legacy.js +24 -9
  224. package/dist/script/legacy.js.map +1 -1
  225. package/dist/types/index.d.ts +18 -1
  226. package/dist/types/index.d.ts.map +1 -1
  227. package/dist/variables/resolver.d.ts.map +1 -1
  228. package/dist/variables/resolver.js +27 -5
  229. package/dist/variables/resolver.js.map +1 -1
  230. package/dist-cjs/ai/index.js +4 -1
  231. package/dist-cjs/ai/index.js.map +1 -1
  232. package/dist-cjs/ai/outputSchemas.js +1 -0
  233. package/dist-cjs/ai/outputSchemas.js.map +1 -1
  234. package/dist-cjs/ai/parse/diagram.js +6 -3
  235. package/dist-cjs/ai/parse/diagram.js.map +1 -1
  236. package/dist-cjs/ai/prompts/diagram.js +44 -5
  237. package/dist-cjs/ai/prompts/diagram.js.map +1 -1
  238. package/dist-cjs/ai/prompts/scenario.js +9 -8
  239. package/dist-cjs/ai/prompts/scenario.js.map +1 -1
  240. package/dist-cjs/ai/prompts/scenarioNodeReference.js +886 -0
  241. package/dist-cjs/ai/prompts/scenarioNodeReference.js.map +1 -0
  242. package/dist-cjs/diagram/bpmn/derive.js +398 -0
  243. package/dist-cjs/diagram/bpmn/derive.js.map +1 -0
  244. package/dist-cjs/diagram/bpmn/index.js +31 -0
  245. package/dist-cjs/diagram/bpmn/index.js.map +1 -0
  246. package/dist-cjs/diagram/bpmn/patch.js +774 -0
  247. package/dist-cjs/diagram/bpmn/patch.js.map +1 -0
  248. package/dist-cjs/diagram/bpmn/place.js +69 -0
  249. package/dist-cjs/diagram/bpmn/place.js.map +1 -0
  250. package/dist-cjs/diagram/bpmn/serialize.js +299 -0
  251. package/dist-cjs/diagram/bpmn/serialize.js.map +1 -0
  252. package/dist-cjs/diagram/bpmn/types.js +99 -0
  253. package/dist-cjs/diagram/bpmn/types.js.map +1 -0
  254. package/dist-cjs/diagram/bpmn/xml.js +367 -0
  255. package/dist-cjs/diagram/bpmn/xml.js.map +1 -0
  256. package/dist-cjs/diagram/elkGraph.js +1 -0
  257. package/dist-cjs/diagram/elkGraph.js.map +1 -1
  258. package/dist-cjs/diagram/fixtures.js +117 -0
  259. package/dist-cjs/diagram/fixtures.js.map +1 -0
  260. package/dist-cjs/diagram/geometry.js +143 -0
  261. package/dist-cjs/diagram/geometry.js.map +1 -0
  262. package/dist-cjs/diagram/history.js +65 -0
  263. package/dist-cjs/diagram/history.js.map +1 -0
  264. package/dist-cjs/diagram/ids.js +58 -0
  265. package/dist-cjs/diagram/ids.js.map +1 -0
  266. package/dist-cjs/diagram/index.js +23 -8
  267. package/dist-cjs/diagram/index.js.map +1 -1
  268. package/dist-cjs/diagram/layout.js +364 -0
  269. package/dist-cjs/diagram/layout.js.map +1 -0
  270. package/dist-cjs/diagram/mermaid/derive.js +353 -0
  271. package/dist-cjs/diagram/mermaid/derive.js.map +1 -0
  272. package/dist-cjs/diagram/mermaid/index.js +44 -0
  273. package/dist-cjs/diagram/mermaid/index.js.map +1 -0
  274. package/dist-cjs/diagram/mermaid/parse.js +681 -0
  275. package/dist-cjs/diagram/mermaid/parse.js.map +1 -0
  276. package/dist-cjs/diagram/mermaid/patch.js +468 -0
  277. package/dist-cjs/diagram/mermaid/patch.js.map +1 -0
  278. package/dist-cjs/diagram/mermaid/serialize.js +133 -0
  279. package/dist-cjs/diagram/mermaid/serialize.js.map +1 -0
  280. package/dist-cjs/diagram/mermaid/shapes.js +327 -0
  281. package/dist-cjs/diagram/mermaid/shapes.js.map +1 -0
  282. package/dist-cjs/diagram/migrations.js +9 -3
  283. package/dist-cjs/diagram/migrations.js.map +1 -1
  284. package/dist-cjs/diagram/normalize.js +198 -1
  285. package/dist-cjs/diagram/normalize.js.map +1 -1
  286. package/dist-cjs/diagram/ops.js +829 -0
  287. package/dist-cjs/diagram/ops.js.map +1 -0
  288. package/dist-cjs/diagram/opsReference.js +55 -0
  289. package/dist-cjs/diagram/opsReference.js.map +1 -0
  290. package/dist-cjs/diagram/patchInput.js +636 -0
  291. package/dist-cjs/diagram/patchInput.js.map +1 -0
  292. package/dist-cjs/diagram/routing/batch.js +142 -0
  293. package/dist-cjs/diagram/routing/batch.js.map +1 -0
  294. package/dist-cjs/diagram/routing/curves.js +127 -0
  295. package/dist-cjs/diagram/routing/curves.js.map +1 -0
  296. package/dist-cjs/diagram/routing/grid.js +250 -0
  297. package/dist-cjs/diagram/routing/grid.js.map +1 -0
  298. package/dist-cjs/diagram/routing/index.js +29 -0
  299. package/dist-cjs/diagram/routing/index.js.map +1 -0
  300. package/dist-cjs/diagram/routing/legacy.js +32 -0
  301. package/dist-cjs/diagram/routing/legacy.js.map +1 -0
  302. package/dist-cjs/diagram/routing/nudge.js +100 -0
  303. package/dist-cjs/diagram/routing/nudge.js.map +1 -0
  304. package/dist-cjs/diagram/routing/orthogonal.js +62 -0
  305. package/dist-cjs/diagram/routing/orthogonal.js.map +1 -0
  306. package/dist-cjs/diagram/routing/path.js +137 -0
  307. package/dist-cjs/diagram/routing/path.js.map +1 -0
  308. package/dist-cjs/diagram/routing/sides.js +82 -0
  309. package/dist-cjs/diagram/routing/sides.js.map +1 -0
  310. package/dist-cjs/diagram/routing/types.js +15 -0
  311. package/dist-cjs/diagram/routing/types.js.map +1 -0
  312. package/dist-cjs/diagram/schema.js +64 -9
  313. package/dist-cjs/diagram/schema.js.map +1 -1
  314. package/dist-cjs/diagram/styleInput.js +113 -0
  315. package/dist-cjs/diagram/styleInput.js.map +1 -0
  316. package/dist-cjs/diagram/views.js +46 -0
  317. package/dist-cjs/diagram/views.js.map +1 -0
  318. package/dist-cjs/http-file/flatImport.js.map +1 -1
  319. package/dist-cjs/http-file/index.js +2 -1
  320. package/dist-cjs/http-file/index.js.map +1 -1
  321. package/dist-cjs/http-file/parseHttpFile.js +42 -9
  322. package/dist-cjs/http-file/parseHttpFile.js.map +1 -1
  323. package/dist-cjs/index.js +9 -1
  324. package/dist-cjs/index.js.map +1 -1
  325. package/dist-cjs/request/requestBody.js +206 -0
  326. package/dist-cjs/request/requestBody.js.map +1 -0
  327. package/dist-cjs/runner/requestRunner.js +127 -43
  328. package/dist-cjs/runner/requestRunner.js.map +1 -1
  329. package/dist-cjs/runner/runCollection.js +9 -2
  330. package/dist-cjs/runner/runCollection.js.map +1 -1
  331. package/dist-cjs/scenario-runner/adapters/helpers/request-helpers.js +7 -42
  332. package/dist-cjs/scenario-runner/adapters/helpers/request-helpers.js.map +1 -1
  333. package/dist-cjs/scenario-runner/adapters/request-executor.js +3 -30
  334. package/dist-cjs/scenario-runner/adapters/request-executor.js.map +1 -1
  335. package/dist-cjs/scenario-runner/index.js +4 -1
  336. package/dist-cjs/scenario-runner/index.js.map +1 -1
  337. package/dist-cjs/scenario-runner/labels.js +24 -0
  338. package/dist-cjs/scenario-runner/labels.js.map +1 -0
  339. package/dist-cjs/scenario-runner/runScenario.js +4 -11
  340. package/dist-cjs/scenario-runner/runScenario.js.map +1 -1
  341. package/dist-cjs/script/legacy.js +24 -9
  342. package/dist-cjs/script/legacy.js.map +1 -1
  343. package/dist-cjs/variables/resolver.js +27 -5
  344. package/dist-cjs/variables/resolver.js.map +1 -1
  345. package/package.json +1 -1
@@ -0,0 +1,681 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.looksLikeMermaid = exports.isMermaidFlowchart = exports.walkStatements = exports.parseMermaidFlowchart = exports.parseAttrs = exports.unescapeLabel = void 0;
4
+ // A tolerant parser for the Mermaid FLOWCHART dialect that produces a
5
+ // concrete syntax tree WITH SOURCE RANGES. The ranges are the point: the
6
+ // patcher (patch.ts) edits exactly the statement an operation concerns and
7
+ // leaves every other byte — comments, formatting, constructs we do not model
8
+ // — untouched. Lines the parser does not understand become `unknown`
9
+ // statements that are preserved verbatim and reported as diagnostics.
10
+ //
11
+ // Covered: `flowchart|graph <DIR>`, frontmatter (`---` blocks), `%%`
12
+ // comments and `%%{init}%%` directives, node declarations with every
13
+ // classic bracket and `@{ shape, label, … }`, `:::class`, chains
14
+ // (`A --> B --> C`), fans (`A & B --> C`), all link forms (`-->`, `---`,
15
+ // `-.->`, `==>`, `<-->`, `--o`, `--x`, `~~~`, extra length, `|label|`,
16
+ // `-- label -->`), edge ids (`e1@-->`) and edge attributes (`e1@{ curve }`),
17
+ // nested `subgraph id [title] … end` with `direction`, and the statement
18
+ // kinds classDef/class/style/linkStyle/click, kept as opaque text.
19
+ const shapes_js_1 = require("./shapes.js");
20
+ // --- helpers ------------------------------------------------------------------
21
+ const ID_START = /[A-Za-z0-9_]/;
22
+ const isIdChar = (text, i) => {
23
+ const ch = text[i];
24
+ if (ch === undefined)
25
+ return false;
26
+ if (/[A-Za-z0-9_.]/.test(ch))
27
+ return true;
28
+ // A dash belongs to the id unless it starts a link (`-->`, `--`, `-.`).
29
+ if (ch === "-") {
30
+ const next = text[i + 1];
31
+ return next !== undefined && next !== ">" && next !== "-" && next !== "." && next !== "=" && /[A-Za-z0-9_]/.test(next);
32
+ }
33
+ return false;
34
+ };
35
+ const RESERVED = new Set(["end", "subgraph", "graph", "flowchart", "style", "classDef", "class", "click", "linkStyle", "direction"]);
36
+ const unescapeLabel = (raw) => raw
37
+ .replace(/<br\s*\/?>/gi, "\n")
38
+ .replace(/#quot;/g, '"')
39
+ .replace(/#(\d+);/g, (_m, code) => String.fromCharCode(Number(code)))
40
+ .replace(/&quot;/g, '"')
41
+ .replace(/&amp;/g, "&")
42
+ .trim();
43
+ exports.unescapeLabel = unescapeLabel;
44
+ // Parses `key: value, key2: "v 2"` (the inside of `@{ … }`).
45
+ const parseAttrs = (inner) => {
46
+ const out = {};
47
+ let i = 0;
48
+ while (i < inner.length) {
49
+ while (i < inner.length && /[\s,]/.test(inner[i]))
50
+ i += 1;
51
+ const keyStart = i;
52
+ while (i < inner.length && /[A-Za-z0-9_-]/.test(inner[i]))
53
+ i += 1;
54
+ const key = inner.slice(keyStart, i).trim();
55
+ if (!key)
56
+ break;
57
+ while (i < inner.length && /\s/.test(inner[i]))
58
+ i += 1;
59
+ if (inner[i] !== ":") {
60
+ out[key] = "true";
61
+ continue;
62
+ }
63
+ i += 1;
64
+ while (i < inner.length && /\s/.test(inner[i]))
65
+ i += 1;
66
+ let value = "";
67
+ if (inner[i] === '"' || inner[i] === "'") {
68
+ const quote = inner[i];
69
+ i += 1;
70
+ const start = i;
71
+ while (i < inner.length && inner[i] !== quote)
72
+ i += 1;
73
+ value = inner.slice(start, i);
74
+ i += 1;
75
+ }
76
+ else {
77
+ const start = i;
78
+ while (i < inner.length && inner[i] !== ",")
79
+ i += 1;
80
+ value = inner.slice(start, i).trim();
81
+ }
82
+ out[key] = value;
83
+ }
84
+ return out;
85
+ };
86
+ exports.parseAttrs = parseAttrs;
87
+ const splitLines = (text) => {
88
+ const lines = [];
89
+ let offset = 0;
90
+ let line = 1;
91
+ for (const part of text.split("\n")) {
92
+ const body = part.endsWith("\r") ? part.slice(0, -1) : part;
93
+ lines.push({ text: body, start: offset, line });
94
+ offset += part.length + 1;
95
+ line += 1;
96
+ }
97
+ return lines;
98
+ };
99
+ // --- the chain scanner ---------------------------------------------------------------
100
+ class Scanner {
101
+ text;
102
+ base; // offset of text[0] in the document
103
+ pos = 0;
104
+ constructor(text, base) {
105
+ this.text = text;
106
+ this.base = base;
107
+ }
108
+ get done() {
109
+ return this.pos >= this.text.length;
110
+ }
111
+ peek(offset = 0) {
112
+ return this.text[this.pos + offset] ?? "";
113
+ }
114
+ skipSpaces() {
115
+ while (!this.done && /\s/.test(this.peek()))
116
+ this.pos += 1;
117
+ }
118
+ startsWith(s) {
119
+ return this.text.startsWith(s, this.pos);
120
+ }
121
+ span(start, end) {
122
+ return { start: this.base + start, end: this.base + end };
123
+ }
124
+ }
125
+ const readBalanced = (scanner, open, close) => {
126
+ // scanner.pos is at `open`. Quotes protect the closer.
127
+ if (!scanner.startsWith(open))
128
+ return null;
129
+ let i = scanner.pos + open.length;
130
+ const innerStart = i;
131
+ let quote = null;
132
+ let depth = 0;
133
+ while (i < scanner.text.length) {
134
+ const ch = scanner.text[i];
135
+ if (quote) {
136
+ if (ch === quote)
137
+ quote = null;
138
+ i += 1;
139
+ continue;
140
+ }
141
+ if (ch === '"' || (ch === "'" && open === "@{")) {
142
+ quote = ch;
143
+ i += 1;
144
+ continue;
145
+ }
146
+ if (open === "@{") {
147
+ if (ch === "{")
148
+ depth += 1;
149
+ if (ch === "}") {
150
+ if (depth === 0)
151
+ return { inner: scanner.text.slice(innerStart, i), innerStart, end: i + 1 };
152
+ depth -= 1;
153
+ }
154
+ i += 1;
155
+ continue;
156
+ }
157
+ if (scanner.text.startsWith(close, i))
158
+ return { inner: scanner.text.slice(innerStart, i), innerStart, end: i + close.length };
159
+ i += 1;
160
+ }
161
+ return null;
162
+ };
163
+ // Bracket kinds ordered so longer openers win.
164
+ const BRACKETS = [
165
+ ["((()))", "(((", ")))"],
166
+ ["(())", "((", "))"],
167
+ ["([])", "([", "])"],
168
+ ["[[]]", "[[", "]]"],
169
+ ["[()]", "[(", ")]"],
170
+ ["[//]", "[/", "/]"],
171
+ ["[\\\\]", "[\\", "\\]"],
172
+ ["[/\\]", "[/", "\\]"],
173
+ ["[\\/]", "[\\", "/]"],
174
+ ["{{}}", "{{", "}}"],
175
+ ["{}", "{", "}"],
176
+ ["()", "(", ")"],
177
+ ["[]", "[", "]"],
178
+ [">]", ">", "]"],
179
+ ];
180
+ const readLabelText = (raw) => {
181
+ const trimmed = raw.trim();
182
+ if (trimmed.length >= 2 && trimmed.startsWith('"') && trimmed.endsWith('"')) {
183
+ return { label: (0, exports.unescapeLabel)(trimmed.slice(1, -1)), quoted: true };
184
+ }
185
+ return { label: (0, exports.unescapeLabel)(trimmed), quoted: false };
186
+ };
187
+ const readNodeRef = (scanner, diagnostics, line) => {
188
+ scanner.skipSpaces();
189
+ const start = scanner.pos;
190
+ if (!ID_START.test(scanner.peek()))
191
+ return null;
192
+ let i = scanner.pos;
193
+ while (isIdChar(scanner.text, i))
194
+ i += 1;
195
+ const id = scanner.text.slice(scanner.pos, i);
196
+ if (RESERVED.has(id))
197
+ return null;
198
+ const idSpan = scanner.span(scanner.pos, i);
199
+ scanner.pos = i;
200
+ const ref = { id, span: scanner.span(start, i), idSpan, classes: [] };
201
+ // `@{ … }` attributes.
202
+ if (scanner.startsWith("@{")) {
203
+ const block = readBalanced(scanner, "@{", "}");
204
+ if (!block) {
205
+ diagnostics.push({ line, column: scanner.pos - 0 + 1, message: "Unterminated @{ … } block", severity: "error" });
206
+ return null;
207
+ }
208
+ ref.attrs = (0, exports.parseAttrs)(block.inner);
209
+ ref.attrsSpan = scanner.span(scanner.pos, block.end);
210
+ if (ref.attrs.label !== undefined) {
211
+ ref.label = (0, exports.unescapeLabel)(ref.attrs.label);
212
+ const labelIndex = block.inner.indexOf(ref.attrs.label);
213
+ if (labelIndex >= 0)
214
+ ref.labelSpan = scanner.span(block.innerStart + labelIndex, block.innerStart + labelIndex + ref.attrs.label.length);
215
+ }
216
+ if (ref.attrs.shape !== undefined)
217
+ ref.shape = (0, shapes_js_1.canonicalMermaidShape)(ref.attrs.shape) ?? ref.attrs.shape;
218
+ scanner.pos = block.end;
219
+ }
220
+ else {
221
+ // Classic bracket label. Some openers belong to several kinds (`[/` opens
222
+ // `[/ … /]` and `[/ … \]`, `[\` opens `[\ … \]` and `[\ … /]`): the
223
+ // NEAREST closer decides, so a closer of a later node never wins.
224
+ let unterminated = null;
225
+ let best = null;
226
+ for (const [kind, open, close] of BRACKETS) {
227
+ if (!scanner.startsWith(open))
228
+ continue;
229
+ if (best && open.length < best.open.length)
230
+ break; // longer openers already matched
231
+ const block = readBalanced(scanner, open, close);
232
+ if (!block) {
233
+ unterminated ??= `Unterminated ${open} … ${close} label`;
234
+ continue;
235
+ }
236
+ if (!best || block.end < best.block.end)
237
+ best = { kind, open, block };
238
+ }
239
+ if (best) {
240
+ unterminated = null;
241
+ const { kind, block } = best;
242
+ const { label, quoted } = readLabelText(block.inner);
243
+ ref.label = label;
244
+ const trimmedStart = block.inner.indexOf(block.inner.trim());
245
+ const innerStart = block.innerStart + trimmedStart + (quoted ? 1 : 0);
246
+ ref.labelSpan = scanner.span(innerStart, innerStart + block.inner.trim().length - (quoted ? 2 : 0));
247
+ ref.bracket = kind;
248
+ ref.bracketSpan = scanner.span(scanner.pos, block.end);
249
+ ref.shape = shapes_js_1.BRACKET_SHAPE[kind];
250
+ scanner.pos = block.end;
251
+ }
252
+ if (unterminated) {
253
+ diagnostics.push({ line, column: scanner.pos + 1, message: unterminated, severity: "error" });
254
+ return null;
255
+ }
256
+ }
257
+ // `:::class1:::class2`
258
+ const classStart = scanner.pos;
259
+ while (scanner.startsWith(":::")) {
260
+ let j = scanner.pos + 3;
261
+ while (j < scanner.text.length && /[A-Za-z0-9_-]/.test(scanner.text[j]))
262
+ j += 1;
263
+ ref.classes.push(scanner.text.slice(scanner.pos + 3, j));
264
+ scanner.pos = j;
265
+ }
266
+ if (scanner.pos > classStart)
267
+ ref.classSpan = scanner.span(classStart, scanner.pos);
268
+ ref.span = scanner.span(start, scanner.pos);
269
+ return ref;
270
+ };
271
+ // `-.` alone (followed by a space) opens an inline-labelled dotted link.
272
+ const LINK_BODY = /^(?:-{2,}|={2,}|-\.+-|-\.(?=\s)|~{3,})/;
273
+ const readLink = (scanner) => {
274
+ scanner.skipSpaces();
275
+ const start = scanner.pos;
276
+ const token = { labelStyle: "none" };
277
+ // Optional `id@` prefix.
278
+ const idMatch = /^([A-Za-z0-9_-]+)@(?=[<ox]?(?:-|=|~))/.exec(scanner.text.slice(scanner.pos));
279
+ if (idMatch) {
280
+ token.id = idMatch[1];
281
+ token.idSpan = scanner.span(scanner.pos, scanner.pos + idMatch[1].length);
282
+ scanner.pos += idMatch[0].length;
283
+ }
284
+ // Optional start marker.
285
+ const startCh = scanner.peek();
286
+ if ((startCh === "<" || startCh === "o" || startCh === "x") && /[-=.]/.test(scanner.peek(1))) {
287
+ token.startMarker = startCh;
288
+ scanner.pos += 1;
289
+ }
290
+ const bodyMatch = LINK_BODY.exec(scanner.text.slice(scanner.pos));
291
+ if (!bodyMatch) {
292
+ scanner.pos = start;
293
+ return null;
294
+ }
295
+ let body = bodyMatch[0];
296
+ scanner.pos += body.length;
297
+ const strokeOf = (b) => (b.startsWith("~") ? "invisible" : b.startsWith("=") ? "thick" : b.includes(".") ? "dotted" : "normal");
298
+ token.stroke = strokeOf(body);
299
+ token.length = body.startsWith("~") ? 1 : Math.max(1, body.replace(/[^-=.]/g, "").length - 2);
300
+ // Inline label: `-- text -->`, `-. text .->`, `== text ==>`.
301
+ const inlineOpener = body === "--" || body === "==" || body === "-.";
302
+ if (inlineOpener && /\s/.test(scanner.peek())) {
303
+ const rest = scanner.text.slice(scanner.pos);
304
+ const closer = /\s(-{2,}|={2,}|\.-+|\.{1,}-)([>ox])?/.exec(rest);
305
+ if (closer && closer.index >= 0) {
306
+ const labelRaw = rest.slice(0, closer.index);
307
+ const labelStart = scanner.pos + (labelRaw.length - labelRaw.trimStart().length);
308
+ token.label = (0, exports.unescapeLabel)(labelRaw);
309
+ token.labelSpan = scanner.span(labelStart, labelStart + labelRaw.trim().length);
310
+ token.labelStyle = "inline";
311
+ scanner.pos += closer.index + closer[0].length;
312
+ body = closer[1];
313
+ if (closer[2])
314
+ token.endMarker = closer[2];
315
+ token.stroke = body.includes("=") ? "thick" : body.includes(".") || token.stroke === "dotted" ? "dotted" : "normal";
316
+ }
317
+ }
318
+ if (token.endMarker === undefined) {
319
+ const endCh = scanner.peek();
320
+ if (endCh === ">" || endCh === "o" || endCh === "x") {
321
+ // `o`/`x` are markers only when followed by a space/pipe (else they start a node id).
322
+ const after = scanner.peek(1);
323
+ if (endCh === ">" || after === "" || /[\s|;]/.test(after)) {
324
+ token.endMarker = endCh;
325
+ scanner.pos += 1;
326
+ }
327
+ }
328
+ }
329
+ // Pipe label `|text|` (the span grows only when one is found).
330
+ const beforeSpaces = scanner.pos;
331
+ scanner.skipSpaces();
332
+ if (scanner.peek() === "|") {
333
+ const close = scanner.text.indexOf("|", scanner.pos + 1);
334
+ if (close > scanner.pos) {
335
+ const raw = scanner.text.slice(scanner.pos + 1, close);
336
+ token.label = readLabelText(raw).label;
337
+ token.labelSpan = scanner.span(scanner.pos + 1, close);
338
+ token.labelStyle = "pipe";
339
+ scanner.pos = close + 1;
340
+ }
341
+ }
342
+ else {
343
+ scanner.pos = beforeSpaces;
344
+ }
345
+ token.span = scanner.span(start, scanner.pos);
346
+ return token;
347
+ };
348
+ // Mermaid lets an edge take attributes on its own line (`e1@{ curve: linear }`)
349
+ // once it was declared with an id (`a e1@--> b`). Such a line reads as a lone
350
+ // node reference with attributes; when its id is an edge id anywhere in the
351
+ // text it is an edge-attribute statement instead. Runs after the whole text
352
+ // was read because the declaration may come later.
353
+ const reclassifyEdgeAttrs = (statements, text) => {
354
+ const edgeIds = new Set();
355
+ const collect = (list) => {
356
+ for (const statement of list) {
357
+ if (statement.kind === "chain") {
358
+ for (const link of statement.links)
359
+ if (link.id)
360
+ edgeIds.add(link.id);
361
+ }
362
+ else if (statement.kind === "subgraph") {
363
+ collect(statement.statements);
364
+ }
365
+ }
366
+ };
367
+ collect(statements);
368
+ if (edgeIds.size === 0)
369
+ return;
370
+ const rewrite = (list) => {
371
+ for (let index = 0; index < list.length; index += 1) {
372
+ const statement = list[index];
373
+ if (statement.kind === "subgraph") {
374
+ rewrite(statement.statements);
375
+ continue;
376
+ }
377
+ if (statement.kind !== "chain" || statement.links.length > 0 || statement.groups.length !== 1 || statement.groups[0].length !== 1)
378
+ continue;
379
+ const ref = statement.groups[0][0];
380
+ if (!ref.attrs || !edgeIds.has(ref.id) || ref.bracket || ref.classes.length > 0)
381
+ continue;
382
+ list[index] = {
383
+ kind: "edgeAttrs",
384
+ span: statement.span,
385
+ line: statement.line,
386
+ indent: statement.indent,
387
+ text: text.slice(statement.span.start, statement.span.end),
388
+ edgeId: ref.id,
389
+ attrs: ref.attrs,
390
+ };
391
+ }
392
+ };
393
+ rewrite(statements);
394
+ };
395
+ const parseChain = (raw, base, line, diagnostics) => {
396
+ const scanner = new Scanner(raw, base);
397
+ const groups = [];
398
+ const links = [];
399
+ let group = [];
400
+ const indent = raw.match(/^\s*/)?.[0] ?? "";
401
+ for (;;) {
402
+ const ref = readNodeRef(scanner, diagnostics, line);
403
+ if (!ref) {
404
+ if (group.length === 0)
405
+ return null;
406
+ break;
407
+ }
408
+ group.push(ref);
409
+ scanner.skipSpaces();
410
+ if (scanner.peek() === "&") {
411
+ scanner.pos += 1;
412
+ continue;
413
+ }
414
+ const link = readLink(scanner);
415
+ if (!link)
416
+ break;
417
+ groups.push(group);
418
+ group = [];
419
+ links.push(link);
420
+ }
421
+ if (group.length > 0)
422
+ groups.push(group);
423
+ scanner.skipSpaces();
424
+ if (!scanner.done) {
425
+ // Trailing junk we did not understand: this line is not ours to edit.
426
+ return null;
427
+ }
428
+ if (links.length !== groups.length - 1)
429
+ return null;
430
+ return { kind: "chain", span: { start: base + indent.length, end: base + raw.length }, line, indent, groups, links };
431
+ };
432
+ // --- top level ----------------------------------------------------------------------------
433
+ const HEADER = /^\s*(flowchart|graph)\b\s*([A-Za-z]{2})?\s*;?\s*$/;
434
+ const parseMermaidFlowchart = (text) => {
435
+ const diagnostics = [];
436
+ const cst = { text, diagramType: null, direction: "TB", statements: [], diagnostics };
437
+ const lines = splitLines(text);
438
+ const stack = [{ statements: cst.statements }];
439
+ let index = 0;
440
+ // Frontmatter: `---` … `---` at the very top.
441
+ if (lines[0]?.text.trim() === "---") {
442
+ let close = 1;
443
+ while (close < lines.length && lines[close].text.trim() !== "---")
444
+ close += 1;
445
+ if (close < lines.length) {
446
+ const block = lines.slice(0, close + 1);
447
+ const raw = block.map((l) => l.text).join("\n");
448
+ const titleLine = block.find((l) => /^\s*title\s*:/.test(l.text));
449
+ const fm = { span: { start: block[0].start, end: block[close].start + block[close].text.length }, raw };
450
+ if (titleLine) {
451
+ const match = /^(\s*title\s*:\s*)(.*)$/.exec(titleLine.text);
452
+ if (match) {
453
+ fm.title = match[2].trim().replace(/^["']|["']$/g, "");
454
+ fm.titleSpan = { start: titleLine.start + match[1].length, end: titleLine.start + titleLine.text.length };
455
+ }
456
+ }
457
+ cst.frontmatter = fm;
458
+ cst.statements.push({ kind: "frontmatter", span: fm.span, line: 1, indent: "", text: raw });
459
+ index = close + 1;
460
+ }
461
+ }
462
+ const pushOther = (kind, rawLine) => {
463
+ const indent = rawLine.text.match(/^\s*/)?.[0] ?? "";
464
+ stack[stack.length - 1].statements.push({
465
+ kind,
466
+ span: { start: rawLine.start, end: rawLine.start + rawLine.text.length },
467
+ line: rawLine.line,
468
+ indent,
469
+ text: rawLine.text,
470
+ });
471
+ };
472
+ for (; index < lines.length; index += 1) {
473
+ const rawLine = lines[index];
474
+ const trimmed = rawLine.text.trim();
475
+ const current = stack[stack.length - 1];
476
+ if (trimmed === "") {
477
+ // Trailing empty line after the final newline is not a statement.
478
+ if (index === lines.length - 1 && rawLine.text === "")
479
+ break;
480
+ pushOther("blank", rawLine);
481
+ continue;
482
+ }
483
+ if (trimmed.startsWith("%%{")) {
484
+ pushOther("directive", rawLine);
485
+ continue;
486
+ }
487
+ if (trimmed.startsWith("%%")) {
488
+ pushOther("comment", rawLine);
489
+ continue;
490
+ }
491
+ if (cst.diagramType === null) {
492
+ const header = HEADER.exec(rawLine.text);
493
+ if (header) {
494
+ cst.diagramType = "flowchart";
495
+ cst.direction = (header[2] ?? "TB").toUpperCase();
496
+ cst.headerSpan = { start: rawLine.start, end: rawLine.start + rawLine.text.length };
497
+ pushOther("header", rawLine);
498
+ continue;
499
+ }
500
+ const otherType = /^\s*([A-Za-z]+(?:-beta)?)\b/.exec(rawLine.text);
501
+ if (otherType) {
502
+ cst.diagramType = otherType[1];
503
+ cst.headerSpan = { start: rawLine.start, end: rawLine.start + rawLine.text.length };
504
+ diagnostics.push({ line: rawLine.line, column: 1, message: `"${otherType[1]}" diagrams are previewed only — the canvas and diagram operations need a flowchart`, severity: "warning" });
505
+ pushOther("header", rawLine);
506
+ // Everything below belongs to a dialect we do not model.
507
+ for (index += 1; index < lines.length; index += 1) {
508
+ if (lines[index].text.trim() === "" && index === lines.length - 1)
509
+ break;
510
+ pushOther("unknown", lines[index]);
511
+ }
512
+ break;
513
+ }
514
+ }
515
+ const subgraph = /^(\s*)subgraph\s+(.*)$/.exec(rawLine.text);
516
+ if (subgraph) {
517
+ const indent = subgraph[1];
518
+ const rest = subgraph[2].trim();
519
+ let id = "";
520
+ let title;
521
+ let titleSpan;
522
+ let attrs;
523
+ const restStart = rawLine.start + rawLine.text.indexOf(rest, indent.length + "subgraph".length);
524
+ const attrMatch = /^([A-Za-z0-9_-]+)\s*@\{(.*)\}\s*$/.exec(rest);
525
+ const titled = /^([A-Za-z0-9_-]+)\s*\[(.*)\]\s*$/.exec(rest);
526
+ if (attrMatch) {
527
+ id = attrMatch[1];
528
+ attrs = (0, exports.parseAttrs)(attrMatch[2]);
529
+ if (attrs.label !== undefined)
530
+ title = (0, exports.unescapeLabel)(attrs.label);
531
+ }
532
+ else if (titled) {
533
+ id = titled[1];
534
+ const inner = readLabelText(titled[2]);
535
+ title = inner.label;
536
+ const bracketAt = rest.indexOf("[");
537
+ titleSpan = { start: restStart + bracketAt + 1 + (inner.quoted ? 1 : 0), end: restStart + rest.lastIndexOf("]") - (inner.quoted ? 1 : 0) };
538
+ }
539
+ else {
540
+ const quoted = /^"(.*)"$/.exec(rest);
541
+ if (quoted) {
542
+ title = (0, exports.unescapeLabel)(quoted[1]);
543
+ id = title.replace(/[^A-Za-z0-9_]+/g, "_");
544
+ titleSpan = { start: restStart + 1, end: restStart + rest.length - 1 };
545
+ }
546
+ else {
547
+ id = rest;
548
+ title = rest.includes(" ") ? rest : undefined;
549
+ if (rest.includes(" ")) {
550
+ id = rest.replace(/[^A-Za-z0-9_]+/g, "_");
551
+ titleSpan = { start: restStart, end: restStart + rest.length };
552
+ }
553
+ }
554
+ }
555
+ const idSpanStart = rawLine.start + rawLine.text.indexOf(rest);
556
+ const statement = {
557
+ kind: "subgraph",
558
+ span: { start: rawLine.start, end: rawLine.start + rawLine.text.length },
559
+ line: rawLine.line,
560
+ indent,
561
+ id,
562
+ idSpan: { start: idSpanStart, end: idSpanStart + id.length },
563
+ title,
564
+ titleSpan,
565
+ headerSpan: { start: rawLine.start, end: rawLine.start + rawLine.text.length },
566
+ endSpan: { start: rawLine.start + rawLine.text.length, end: rawLine.start + rawLine.text.length },
567
+ attrs,
568
+ statements: [],
569
+ };
570
+ current.statements.push(statement);
571
+ stack.push({ statements: statement.statements, subgraph: statement });
572
+ continue;
573
+ }
574
+ if (/^\s*end\s*;?\s*$/.test(rawLine.text)) {
575
+ if (stack.length > 1) {
576
+ const frame = stack.pop();
577
+ const sg = frame.subgraph;
578
+ sg.endSpan = { start: rawLine.start, end: rawLine.start + rawLine.text.length };
579
+ sg.span = { start: sg.span.start, end: sg.endSpan.end };
580
+ }
581
+ else {
582
+ diagnostics.push({ line: rawLine.line, column: 1, message: "`end` without a matching `subgraph`", severity: "error" });
583
+ pushOther("unknown", rawLine);
584
+ }
585
+ continue;
586
+ }
587
+ const directionMatch = /^\s*direction\s+([A-Za-z]{2})\s*$/.exec(rawLine.text);
588
+ if (directionMatch) {
589
+ if (current.subgraph)
590
+ current.subgraph.direction = directionMatch[1].toUpperCase();
591
+ pushOther("direction", rawLine);
592
+ continue;
593
+ }
594
+ const keyword = /^\s*(classDef|class|style|linkStyle|click)\b/.exec(rawLine.text);
595
+ if (keyword) {
596
+ pushOther(keyword[1], rawLine);
597
+ continue;
598
+ }
599
+ // Statements separated by `;` on one line — only split outside quotes/brackets.
600
+ const pieces = splitStatements(rawLine.text);
601
+ let anyChain = false;
602
+ for (const piece of pieces) {
603
+ const chain = parseChain(piece.text, rawLine.start + piece.offset, rawLine.line, diagnostics);
604
+ if (chain) {
605
+ current.statements.push(chain);
606
+ anyChain = true;
607
+ }
608
+ else if (piece.text.trim() !== "") {
609
+ diagnostics.push({ line: rawLine.line, column: piece.offset + 1, message: `Not understood: "${piece.text.trim().slice(0, 60)}" (kept as is)`, severity: "warning" });
610
+ current.statements.push({
611
+ kind: "unknown",
612
+ span: { start: rawLine.start + piece.offset, end: rawLine.start + piece.offset + piece.text.length },
613
+ line: rawLine.line,
614
+ indent: piece.text.match(/^\s*/)?.[0] ?? "",
615
+ text: piece.text,
616
+ });
617
+ }
618
+ }
619
+ if (!anyChain && pieces.length === 0)
620
+ pushOther("unknown", rawLine);
621
+ }
622
+ while (stack.length > 1) {
623
+ const frame = stack.pop();
624
+ diagnostics.push({ line: frame.subgraph?.line ?? 1, column: 1, message: `subgraph "${frame.subgraph?.id}" is missing its \`end\``, severity: "error" });
625
+ }
626
+ reclassifyEdgeAttrs(cst.statements, cst.text);
627
+ if (cst.diagramType === null) {
628
+ diagnostics.push({ line: 1, column: 1, message: "Missing `flowchart <direction>` header", severity: "error" });
629
+ }
630
+ return cst;
631
+ };
632
+ exports.parseMermaidFlowchart = parseMermaidFlowchart;
633
+ const splitStatements = (line) => {
634
+ const out = [];
635
+ let depth = 0;
636
+ let quote = null;
637
+ let start = 0;
638
+ for (let i = 0; i < line.length; i += 1) {
639
+ const ch = line[i];
640
+ if (quote) {
641
+ if (ch === quote)
642
+ quote = null;
643
+ continue;
644
+ }
645
+ if (ch === '"') {
646
+ quote = ch;
647
+ continue;
648
+ }
649
+ if ("[({".includes(ch))
650
+ depth += 1;
651
+ else if ("])}".includes(ch))
652
+ depth = Math.max(0, depth - 1);
653
+ else if (ch === ";" && depth === 0) {
654
+ out.push({ text: line.slice(start, i), offset: start });
655
+ start = i + 1;
656
+ }
657
+ }
658
+ out.push({ text: line.slice(start), offset: start });
659
+ return out;
660
+ };
661
+ // Walk every statement (depth first) — subgraph bodies included.
662
+ const walkStatements = (statements, visit, parent = null) => {
663
+ for (const statement of statements) {
664
+ visit(statement, parent);
665
+ if (statement.kind === "subgraph")
666
+ (0, exports.walkStatements)(statement.statements, visit, statement);
667
+ }
668
+ };
669
+ exports.walkStatements = walkStatements;
670
+ const isMermaidFlowchart = (text) => {
671
+ const withoutFrontmatter = text.replace(/^---[\s\S]*?\n---\s*\n/, "");
672
+ const firstMeaningful = withoutFrontmatter.split("\n").map((l) => l.trim()).find((l) => l !== "" && !l.startsWith("%%"));
673
+ return Boolean(firstMeaningful && /^(flowchart|graph)\b/.test(firstMeaningful));
674
+ };
675
+ exports.isMermaidFlowchart = isMermaidFlowchart;
676
+ const looksLikeMermaid = (text) => {
677
+ const first = text.replace(/^---[\s\S]*?\n---\s*\n/, "").split("\n").map((l) => l.trim()).find((l) => l !== "" && !l.startsWith("%%"));
678
+ return Boolean(first && /^(flowchart|graph|sequenceDiagram|classDiagram|stateDiagram(-v2)?|erDiagram|gantt|pie|mindmap|timeline|journey|gitGraph|quadrantChart|requirementDiagram|C4Context|sankey-beta|xychart-beta|block-beta|packet-beta|kanban|architecture-beta|radar-beta|treemap-beta|agentflow-beta)\b/.test(first));
679
+ };
680
+ exports.looksLikeMermaid = looksLikeMermaid;
681
+ //# sourceMappingURL=parse.js.map