@diagrammo/dgmo 0.45.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 (250) hide show
  1. package/dist/advanced.cjs +31 -25
  2. package/dist/advanced.d.cts +3 -855
  3. package/dist/advanced.d.ts +3 -855
  4. package/dist/advanced.js +541 -70101
  5. package/dist/analyzer-UYKBXAKR.js +15 -0
  6. package/dist/auto.cjs +500 -341
  7. package/dist/auto.css +342 -159
  8. package/dist/auto.d.cts +10 -8
  9. package/dist/auto.d.ts +10 -8
  10. package/dist/auto.js +373 -265
  11. package/dist/auto.mjs +500 -341
  12. package/dist/block.cjs +31 -25
  13. package/dist/block.js +83 -69411
  14. package/dist/calculator-LDYQCDDY.js +11 -0
  15. package/dist/charts-d3-QOZHKTCT.js +25 -0
  16. package/dist/chunk-2DXMZRWJ.js +800 -0
  17. package/dist/chunk-2LACINWN.js +786 -0
  18. package/dist/chunk-33LCUH4H.js +893 -0
  19. package/dist/chunk-3CIOJ5YJ.js +35 -0
  20. package/dist/chunk-3HDBAXF5.js +86 -0
  21. package/dist/chunk-3JLKYGBQ.js +290 -0
  22. package/dist/chunk-3MQQNXPD.js +415 -0
  23. package/dist/chunk-3R5POCTZ.js +967 -0
  24. package/dist/chunk-3SMGIJDD.js +112 -0
  25. package/dist/chunk-44CM72SQ.js +409 -0
  26. package/dist/chunk-4GRI7MEB.js +1604 -0
  27. package/dist/chunk-4OHACBGX.js +606 -0
  28. package/dist/chunk-5DH3KYFH.js +21 -0
  29. package/dist/chunk-5MLYVTYM.js +76 -0
  30. package/dist/chunk-5QXL4NYS.js +553 -0
  31. package/dist/chunk-5WRI5ZAA.js +31 -0
  32. package/dist/chunk-6EK55ART.js +117 -0
  33. package/dist/chunk-6FZYCKXB.js +2065 -0
  34. package/dist/chunk-6HO5ZTXK.js +277 -0
  35. package/dist/chunk-6KFWC4CO.js +7 -0
  36. package/dist/chunk-6MTWIQVO.js +121 -0
  37. package/dist/chunk-6NYWYNBI.js +329 -0
  38. package/dist/chunk-6SM5NJQH.js +620 -0
  39. package/dist/chunk-725LDASD.js +422 -0
  40. package/dist/chunk-76OWZ3BA.js +130 -0
  41. package/dist/chunk-7JEGTRLD.js +338 -0
  42. package/dist/chunk-A44USUV7.js +923 -0
  43. package/dist/chunk-A4GOY3PE.js +25 -0
  44. package/dist/chunk-A4VFQH5G.js +251 -0
  45. package/dist/chunk-AELOBFW5.js +375 -0
  46. package/dist/chunk-AN2MOO5T.js +522 -0
  47. package/dist/chunk-BMR4CIEO.js +41 -0
  48. package/dist/chunk-BS7SV7C3.js +51 -0
  49. package/dist/chunk-BUPDIHML.js +613 -0
  50. package/dist/chunk-BUVJFRPY.js +887 -0
  51. package/dist/chunk-C3Z4DX3V.js +112 -0
  52. package/dist/chunk-CI2G3OEB.js +1818 -0
  53. package/dist/chunk-CKNVO24D.js +54 -0
  54. package/dist/chunk-CUVHQHZ7.js +391 -0
  55. package/dist/chunk-CXK4DZH3.js +114 -0
  56. package/dist/chunk-DKEPS5LH.js +315 -0
  57. package/dist/chunk-DU7W62N5.js +487 -0
  58. package/dist/chunk-DZAQBW35.js +751 -0
  59. package/dist/chunk-EB6FPQUP.js +316 -0
  60. package/dist/chunk-EMS2SK26.js +376 -0
  61. package/dist/chunk-ERLBPDGU.js +510 -0
  62. package/dist/chunk-EVCVDTXE.js +732 -0
  63. package/dist/chunk-FCIIHT24.js +384 -0
  64. package/dist/chunk-FFUN5D66.js +97 -0
  65. package/dist/chunk-FITOLXSX.js +714 -0
  66. package/dist/chunk-FMDSF3OV.js +68 -0
  67. package/dist/chunk-FNB3PNGF.js +410 -0
  68. package/dist/chunk-G2H74XJZ.js +2104 -0
  69. package/dist/chunk-GMR5MFHJ.js +339 -0
  70. package/dist/chunk-H6PI3KJT.js +305 -0
  71. package/dist/chunk-I46X5VUA.js +59 -0
  72. package/dist/chunk-I5IGB56C.js +255 -0
  73. package/dist/chunk-IH6ZMVQ5.js +3950 -0
  74. package/dist/chunk-IJZFN3HM.js +463 -0
  75. package/dist/chunk-IPWPWM6R.js +3079 -0
  76. package/dist/chunk-IYULMRBE.js +23 -0
  77. package/dist/chunk-IZMRON6C.js +167 -0
  78. package/dist/chunk-J5FIXQRT.js +813 -0
  79. package/dist/chunk-JED6ZDEE.js +73 -0
  80. package/dist/chunk-JEUJOX5X.js +136 -0
  81. package/dist/chunk-JM4LEPY3.js +436 -0
  82. package/dist/chunk-L3UHP6TD.js +101 -0
  83. package/dist/chunk-L66GEFB6.js +524 -0
  84. package/dist/chunk-LIOHW36Z.js +469 -0
  85. package/dist/chunk-LP7EC4MI.js +16 -0
  86. package/dist/chunk-MITI6NOL.js +548 -0
  87. package/dist/chunk-MO5YHHMQ.js +168 -0
  88. package/dist/chunk-MZSBFAPJ.js +885 -0
  89. package/dist/chunk-NNAAJVBU.js +9 -0
  90. package/dist/chunk-NOTA6TEI.js +47 -0
  91. package/dist/chunk-NURGB5Z4.js +335 -0
  92. package/dist/chunk-NX4EQS3U.js +1062 -0
  93. package/dist/chunk-NXMESY4J.js +1 -0
  94. package/dist/chunk-OJR3MQYV.js +1458 -0
  95. package/dist/chunk-OURHMODR.js +454 -0
  96. package/dist/chunk-P235SVAH.js +1057 -0
  97. package/dist/chunk-P4RH4OSP.js +1038 -0
  98. package/dist/chunk-P6T66CCZ.js +226 -0
  99. package/dist/chunk-PBAHEPLQ.js +223 -0
  100. package/dist/chunk-PBHE5UG6.js +1530 -0
  101. package/dist/chunk-PDKUANDZ.js +35 -0
  102. package/dist/chunk-PWIHZ6NJ.js +296 -0
  103. package/dist/chunk-QEBUY5NY.js +1685 -0
  104. package/dist/chunk-QLCCJEJI.js +253 -0
  105. package/dist/chunk-QOOUC2J5.js +52 -0
  106. package/dist/chunk-QYTPPDAO.js +402 -0
  107. package/dist/chunk-R3XI2VC7.js +801 -0
  108. package/dist/chunk-RCERWOJR.js +154 -0
  109. package/dist/chunk-RJE5JTVK.js +362 -0
  110. package/dist/chunk-RTLBSQ3G.js +1155 -0
  111. package/dist/chunk-RUNNI6VE.js +448 -0
  112. package/dist/chunk-RVMRZAPB.js +354 -0
  113. package/dist/chunk-RYEGFMUO.js +955 -0
  114. package/dist/chunk-RZCF2VVM.js +528 -0
  115. package/dist/chunk-SML67VPV.js +1025 -0
  116. package/dist/chunk-SQ7IY53Q.js +44 -0
  117. package/dist/chunk-SQAG3UXH.js +161 -0
  118. package/dist/chunk-SRTU6HMQ.js +1851 -0
  119. package/dist/chunk-T2OE3YQB.js +550 -0
  120. package/dist/chunk-T3UBLACL.js +299 -0
  121. package/dist/chunk-TLVIHFRO.js +296 -0
  122. package/dist/chunk-TYS6CSS5.js +52 -0
  123. package/dist/chunk-U6EQI3U6.js +130 -0
  124. package/dist/chunk-UJ4FJLBF.js +86 -0
  125. package/dist/chunk-ULOEATBZ.js +347 -0
  126. package/dist/chunk-UNCCZ3NU.js +127 -0
  127. package/dist/chunk-USZW2HHU.js +197 -0
  128. package/dist/chunk-UWN33VNX.js +1610 -0
  129. package/dist/chunk-UZ7EZW3B.js +40 -0
  130. package/dist/chunk-VOKGH627.js +37 -0
  131. package/dist/chunk-WBRZJOEC.js +204 -0
  132. package/dist/chunk-WCSOJFU3.js +380 -0
  133. package/dist/chunk-WCT3NYCV.js +160 -0
  134. package/dist/chunk-WVAJFAIA.js +529 -0
  135. package/dist/chunk-X5LCYCL5.js +394 -0
  136. package/dist/chunk-XAKEUMEJ.js +1256 -0
  137. package/dist/chunk-Y2ZE3MSG.js +590 -0
  138. package/dist/chunk-Y3J7VR52.js +646 -0
  139. package/dist/chunk-Y5QGVTVC.js +33 -0
  140. package/dist/chunk-YAA6IID3.js +548 -0
  141. package/dist/chunk-YGJTDXVR.js +692 -0
  142. package/dist/chunk-YRYKTYMQ.js +186 -0
  143. package/dist/chunk-YYVTBZZC.js +61 -0
  144. package/dist/chunk-Z5CGSFJB.js +647 -0
  145. package/dist/chunk-Z72XRXD4.js +787 -0
  146. package/dist/chunk-ZGR7ULFJ.js +978 -0
  147. package/dist/chunk-ZJEL4H2R.js +851 -0
  148. package/dist/chunk-ZO27FGJS.js +554 -0
  149. package/dist/cli.cjs +112 -112
  150. package/dist/collapse-CLPJD2RL.js +11 -0
  151. package/dist/collapse-SLINJQW6.js +9 -0
  152. package/dist/collapse-ZWUFFCK2.js +9 -0
  153. package/dist/compute-G55RG53N.js +8 -0
  154. package/dist/dgmo-router-DZCIDUO5.js +73 -0
  155. package/dist/dimensions-J3FHIMJ6.js +22 -0
  156. package/dist/element.cjs +492 -325
  157. package/dist/element.js +367 -259
  158. package/dist/element.mjs +492 -325
  159. package/dist/flowchart-parser-ZNSKIBVR.js +21 -0
  160. package/dist/flowchart-renderer-ZAEOL4DX.js +35 -0
  161. package/dist/index.cjs +34 -28
  162. package/dist/index.d.cts +3 -469
  163. package/dist/index.d.ts +3 -469
  164. package/dist/index.js +137 -69679
  165. package/dist/layout-46N4JJYK.js +17 -0
  166. package/dist/layout-5RA6QWR6.js +26 -0
  167. package/dist/layout-5T6RH5M6.js +14 -0
  168. package/dist/layout-7QXCNOVS.js +13 -0
  169. package/dist/layout-EE6GE46Y.js +17 -0
  170. package/dist/layout-G23F7LDH.js +9 -0
  171. package/dist/layout-HRBZPFCN.js +23 -0
  172. package/dist/layout-HWDSRX5E.js +20 -0
  173. package/dist/layout-HYZPWAK5.js +18 -0
  174. package/dist/layout-N76NR4ZO.js +19 -0
  175. package/dist/layout-OB3RI63S.js +14 -0
  176. package/dist/layout-S2QBYSK2.js +15 -0
  177. package/dist/layout-UM5F4DJB.js +15 -0
  178. package/dist/layout-search-OYV77HHS.js +1655 -0
  179. package/dist/load-data-EHDDZ5ZS.js +8 -0
  180. package/dist/palettes-PRJ2RI6D.js +56 -0
  181. package/dist/parser-2MFP2H2E.js +11 -0
  182. package/dist/parser-3STE62GB.js +21 -0
  183. package/dist/parser-4FL2CMDG.js +18 -0
  184. package/dist/parser-4OGOBJJ4.js +13 -0
  185. package/dist/parser-6BTRLKRZ.js +15 -0
  186. package/dist/parser-AQETEVRW.js +21 -0
  187. package/dist/parser-CFZD5IBL.js +12 -0
  188. package/dist/parser-FUSKFGZN.js +16 -0
  189. package/dist/parser-I6KXEYFK.js +13 -0
  190. package/dist/parser-IXSZZQHY.js +18 -0
  191. package/dist/parser-JAL2HD4I.js +13 -0
  192. package/dist/parser-KNSQSKQO.js +20 -0
  193. package/dist/parser-N5O4IHUN.js +13 -0
  194. package/dist/parser-NGU3ETO6.js +16 -0
  195. package/dist/parser-NRAI6O25.js +19 -0
  196. package/dist/parser-O5J4VBII.js +11 -0
  197. package/dist/parser-OV7NOBW6.js +21 -0
  198. package/dist/parser-PQ3POX45.js +23 -0
  199. package/dist/parser-TFZFBVWN.js +11 -0
  200. package/dist/parser-TRTHDFPP.js +18 -0
  201. package/dist/parser-VQP2UJ6W.js +11 -0
  202. package/dist/parser-XDVELHRK.js +13 -0
  203. package/dist/parser-XKRP7QKP.js +11 -0
  204. package/dist/parser-Y6WTBU76.js +14 -0
  205. package/dist/parser-ZSDPZYQP.js +12 -0
  206. package/dist/renderer-2XQQQ6QR.js +28 -0
  207. package/dist/renderer-5NDVNDAZ.js +26 -0
  208. package/dist/renderer-6EEZHMH4.js +26 -0
  209. package/dist/renderer-6W5462RB.js +43 -0
  210. package/dist/renderer-7MVLWWQD.js +22 -0
  211. package/dist/renderer-AWWAF6XD.js +33 -0
  212. package/dist/renderer-BYCNMBF7.js +34 -0
  213. package/dist/renderer-CLJHQPBJ.js +29 -0
  214. package/dist/renderer-GHPZMFU2.js +15 -0
  215. package/dist/renderer-JGBKUCZD.js +16 -0
  216. package/dist/renderer-KQB7UGDS.js +19 -0
  217. package/dist/renderer-PGX2TKVS.js +24 -0
  218. package/dist/renderer-QIWVHWZO.js +15 -0
  219. package/dist/renderer-RPOA5YPZ.js +35 -0
  220. package/dist/renderer-SMIBCRVB.js +24 -0
  221. package/dist/renderer-T7YKC5VP.js +28 -0
  222. package/dist/renderer-TOCOVLHS.js +37 -0
  223. package/dist/renderer-UWA5XS74.js +39 -0
  224. package/dist/renderer-VACVQYML.js +25 -0
  225. package/dist/renderer-W4M6QLIJ.js +37 -0
  226. package/dist/renderer-WZRREQ2P.js +23 -0
  227. package/dist/renderer-YY2OSF6E.js +27 -0
  228. package/dist/renderer-Z7I3W2PP.js +24 -0
  229. package/dist/renderer-ZGNTUWC4.js +22 -0
  230. package/dist/renderer-ZTR3DER3.js +19 -0
  231. package/dist/renderer-radial-C32GPJQ7.js +21 -0
  232. package/dist/resolver-NOAA7ID7.js +13 -0
  233. package/dist/state-collapse-HCGD6IVJ.js +8 -0
  234. package/dist/state-parser-Z2V23ATR.js +18 -0
  235. package/dist/state-renderer-RFYHSP4K.js +34 -0
  236. package/dist/themes-1-CuKpeH.d.cts +908 -0
  237. package/dist/themes-1-CuKpeH.d.ts +908 -0
  238. package/package.json +1 -1
  239. package/src/auto/index.ts +55 -57
  240. package/src/auto/shared.ts +142 -142
  241. package/src/auto/styles.ts +44 -199
  242. package/src/c4/renderer.ts +2 -2
  243. package/src/element/index.ts +29 -21
  244. package/src/infra/renderer.ts +1 -1
  245. package/src/render.ts +34 -14
  246. package/src/sitemap/renderer.ts +1 -1
  247. package/src/timeline/renderer.ts +1 -1
  248. package/src/utils/hover-styles.ts +6 -1
  249. package/src/utils/legend-d3.ts +1 -4
  250. package/src/utils/legend-svg.ts +1 -1
@@ -0,0 +1,101 @@
1
+ import {
2
+ formatDateKey,
3
+ parseGanttDate
4
+ } from "./chunk-USZW2HHU.js";
5
+
6
+ // src/pert/internal.ts
7
+ var CONFIDENCE_TABLE = {
8
+ high: { oFactor: 0.9, pFactor: 1.5 },
9
+ medium: { oFactor: 0.75, pFactor: 3 },
10
+ low: { oFactor: 0.5, pFactor: 4 }
11
+ };
12
+ function resolveConfidence(value) {
13
+ const trimmed = value.trim().toLowerCase();
14
+ if (trimmed in CONFIDENCE_TABLE) {
15
+ return CONFIDENCE_TABLE[trimmed];
16
+ }
17
+ const factorMatch = trimmed.match(/^(\d+(?:\.\d+)?)\s*\/\s*(\d+(?:\.\d+)?)$/);
18
+ if (factorMatch) {
19
+ const oFactor = parseFloat(factorMatch[1]);
20
+ const pFactor = parseFloat(factorMatch[2]);
21
+ if (oFactor > 0 && pFactor > 0) return { oFactor, pFactor };
22
+ }
23
+ return null;
24
+ }
25
+ var UNIT_TO_DAYS_LOCAL = {
26
+ min: 1 / (60 * 24),
27
+ h: 1 / 24,
28
+ d: 1,
29
+ bd: 1,
30
+ // PERT has no calendar; bd ≈ d for analytical purposes
31
+ w: 7,
32
+ m: 30,
33
+ q: 90,
34
+ y: 365,
35
+ s: 14
36
+ // sprint (14 calendar days) — not seconds
37
+ };
38
+ function unitToDays(unit) {
39
+ return UNIT_TO_DAYS_LOCAL[unit];
40
+ }
41
+ var ISO_DATE_RE = /^\d{4}-\d{2}-\d{2}$/;
42
+ function parseLocalISODate(iso) {
43
+ if (!ISO_DATE_RE.test(iso)) return null;
44
+ const date = parseGanttDate(iso);
45
+ if (formatDateKey(date) !== iso) return null;
46
+ return date;
47
+ }
48
+ function formatLocalISODate(date) {
49
+ return formatDateKey(date);
50
+ }
51
+ function addCalendarDays(iso, days) {
52
+ const start = parseLocalISODate(iso);
53
+ if (!start) return iso;
54
+ const whole = Math.sign(days) * Math.round(Math.abs(days));
55
+ const result = new Date(
56
+ start.getFullYear(),
57
+ start.getMonth(),
58
+ start.getDate() + whole,
59
+ start.getHours(),
60
+ start.getMinutes()
61
+ );
62
+ return formatLocalISODate(result);
63
+ }
64
+ function formatDuration(value, unit, nullLabel) {
65
+ if (value === null) return nullLabel ?? "?";
66
+ const rounded = Math.round(value * 100) / 100;
67
+ const display = rounded.toFixed(2).replace(/\.?0+$/, "");
68
+ return `${display}${unit}`;
69
+ }
70
+ function formatScheduleValue(value, projectStart, unit, nullLabel) {
71
+ if (value === null) return nullLabel ?? "?";
72
+ if (projectStart === null) return formatDuration(value, unit, nullLabel);
73
+ return addCalendarDays(projectStart, value * unitToDays(unit));
74
+ }
75
+ function formatSprintCell(value, sprintNumber, nullLabel) {
76
+ if (value === null) return nullLabel ?? "?";
77
+ const rounded = Math.round(value);
78
+ return `S${sprintNumber + rounded}`;
79
+ }
80
+ function formatSlackValue(value, projectStart, unit, nullLabel) {
81
+ if (value === null) return nullLabel ?? "?";
82
+ if (projectStart === null) return formatDuration(value, unit, nullLabel);
83
+ const days = value * unitToDays(unit);
84
+ const rounded = Math.round(days * 100) / 100;
85
+ const display = rounded.toFixed(2).replace(/\.?0+$/, "");
86
+ return `${display}d`;
87
+ }
88
+
89
+ export {
90
+ CONFIDENCE_TABLE,
91
+ resolveConfidence,
92
+ unitToDays,
93
+ parseLocalISODate,
94
+ formatLocalISODate,
95
+ addCalendarDays,
96
+ formatDuration,
97
+ formatScheduleValue,
98
+ formatSprintCell,
99
+ formatSlackValue
100
+ };
101
+ //# sourceMappingURL=chunk-L3UHP6TD.js.map
@@ -0,0 +1,524 @@
1
+ import {
2
+ AUTO_TAG_COLOR_SENTINEL,
3
+ finalizeAutoTagColors,
4
+ matchTagBlockHeading,
5
+ stripDefaultModifier,
6
+ tagAttrKey,
7
+ validateTagGroupNames,
8
+ validateTagValues
9
+ } from "./chunk-QLCCJEJI.js";
10
+ import {
11
+ tryCollectNote
12
+ } from "./chunk-5MLYVTYM.js";
13
+ import {
14
+ resolveNotes
15
+ } from "./chunk-FMDSF3OV.js";
16
+ import {
17
+ validateLabelCharacters
18
+ } from "./chunk-FFUN5D66.js";
19
+ import {
20
+ displayName,
21
+ normalizeName
22
+ } from "./chunk-NOTA6TEI.js";
23
+ import {
24
+ ER_REGISTRY,
25
+ OPTION_NOCOLON_RE,
26
+ extractColor,
27
+ measureIndent,
28
+ parseFirstLine,
29
+ splitNameAndMeta,
30
+ stripQuotes,
31
+ tokenizeQuoteAware,
32
+ tryParseSharedOption,
33
+ warnUnknownMetaKeys,
34
+ withTagAliases
35
+ } from "./chunk-Y3J7VR52.js";
36
+ import {
37
+ resolveColorWithDiagnostic
38
+ } from "./chunk-TLVIHFRO.js";
39
+ import {
40
+ NAME_DIAGNOSTIC_CODES,
41
+ formatDgmoError,
42
+ makeDgmoError,
43
+ nameMergedMessage,
44
+ suggest
45
+ } from "./chunk-CXK4DZH3.js";
46
+
47
+ // src/er/parser.ts
48
+ function tableId(name) {
49
+ return normalizeName(name);
50
+ }
51
+ var TABLE_DECL_RE = /^(?:"([^"]+)"|([a-zA-Z_][^|":(]*?))(?:\s+(red|orange|yellow|green|blue|purple|teal|cyan|gray|black|white))?(?:\s*\|(.+))?$/;
52
+ var INDENT_REL_RE = /^([1*?])-{1,2}(?:(.+?)-{1,2})?([1*?])\s+(?:"([^"]+)"|([a-zA-Z_][^":]*?))\s*$/;
53
+ var CONSTRAINT_MAP = {
54
+ pk: "pk",
55
+ fk: "fk",
56
+ unique: "unique",
57
+ nullable: "nullable"
58
+ };
59
+ var KNOWN_OPTIONS = /* @__PURE__ */ new Set(["notation", "active-tag"]);
60
+ function parseCardSide(token) {
61
+ if (token === "1" || token === "*" || token === "?") return token;
62
+ return null;
63
+ }
64
+ var REL_SYMBOLIC_RE = /^(?:"([^"]+)"|([a-zA-Z_][^":]*?))\s+([1*?])\s*-{1,2}\s*([1*?])\s+(?:"([^"]+)"|([a-zA-Z_][^":]*?))(?:\s+(.+))?$/;
65
+ var REL_KEYWORD_RE = /^(?:"([^"]+)"|([a-zA-Z_][^":]*?))\s+(one|many|zero)[- ]to[- ](one|many|zero)\s+(?:"([^"]+)"|([a-zA-Z_][^":]*?))(?:\s+(.+))?$/i;
66
+ var KEYWORD_TO_SYMBOL = {
67
+ one: "1",
68
+ many: "*",
69
+ zero: "?"
70
+ };
71
+ function parseRelationship(trimmed, lineNumber, pushError) {
72
+ const sym = trimmed.match(REL_SYMBOLIC_RE);
73
+ if (sym) {
74
+ const fromCard = parseCardSide(sym[3]);
75
+ const toCard = parseCardSide(sym[4]);
76
+ if (fromCard && toCard) {
77
+ const sourceName = (sym[1] ?? sym[2] ?? "").trim();
78
+ const targetName = (sym[5] ?? sym[6] ?? "").trim();
79
+ const label = sym[7]?.trim();
80
+ if (label) {
81
+ validateLabelCharacters(label, lineNumber).forEach(
82
+ (d) => pushError(d.line, d.message)
83
+ );
84
+ }
85
+ return {
86
+ source: tableId(sourceName),
87
+ target: tableId(targetName),
88
+ from: fromCard,
89
+ to: toCard,
90
+ ...label !== void 0 && { label }
91
+ };
92
+ }
93
+ }
94
+ const kw = trimmed.match(REL_KEYWORD_RE);
95
+ if (kw) {
96
+ const sourceName = (kw[1] ?? kw[2] ?? "").trim();
97
+ const targetName = (kw[5] ?? kw[6] ?? "").trim();
98
+ const fromKw = kw[3];
99
+ const toKw = kw[4];
100
+ const fromSym = KEYWORD_TO_SYMBOL[fromKw.toLowerCase()] ?? fromKw;
101
+ const toSym = KEYWORD_TO_SYMBOL[toKw.toLowerCase()] ?? toKw;
102
+ pushError(
103
+ lineNumber,
104
+ `Use symbolic cardinality (1--*, ?--1, *--*) instead of "${fromKw}-to-${toKw}". Example: ${sourceName} ${fromSym}--${toSym} ${targetName}`
105
+ );
106
+ return null;
107
+ }
108
+ return null;
109
+ }
110
+ function parseColumn(trimmed) {
111
+ const rawTokens = tokenizeQuoteAware(trimmed);
112
+ if (rawTokens.length === 0) return null;
113
+ const firstRaw = rawTokens[0];
114
+ const wasQuoted = firstRaw.startsWith('"') || firstRaw.startsWith("'");
115
+ const name = stripQuotes(firstRaw);
116
+ if (!wasQuoted && !/^\w+$/.test(name)) return null;
117
+ const constraints = [];
118
+ let type;
119
+ for (let i = 1; i < rawTokens.length; i++) {
120
+ const tok = stripQuotes(rawTokens[i]);
121
+ const lower = tok.toLowerCase();
122
+ const constraint = CONSTRAINT_MAP[lower];
123
+ if (constraint) {
124
+ constraints.push(constraint);
125
+ } else if (type === void 0) {
126
+ type = tok;
127
+ } else {
128
+ return null;
129
+ }
130
+ }
131
+ return { name, ...type !== void 0 && { type }, constraints };
132
+ }
133
+ function parseERDiagram(content, palette) {
134
+ const lines = content.split("\n");
135
+ const options = {};
136
+ const result = {
137
+ type: "er",
138
+ options,
139
+ tables: [],
140
+ relationships: [],
141
+ tagGroups: [],
142
+ diagnostics: [],
143
+ error: null
144
+ };
145
+ const pushError = (line, message) => {
146
+ const diag = makeDgmoError(line, message);
147
+ result.diagnostics.push(diag);
148
+ if (!result.error) result.error = formatDgmoError(diag);
149
+ };
150
+ const tableMap = /* @__PURE__ */ new Map();
151
+ const tableMetadataMap = /* @__PURE__ */ new Map();
152
+ let currentTable = null;
153
+ const notes = [];
154
+ let contentStarted = false;
155
+ let currentTagGroup = null;
156
+ const metaAliasMap = /* @__PURE__ */ new Map();
157
+ const nameAliasMap = /* @__PURE__ */ new Map();
158
+ function peelAlias(label) {
159
+ const trimmed = label.trim();
160
+ const m = trimmed.match(/^(.*?)\s+as\s+([A-Za-z][A-Za-z0-9_]{0,11})\s*$/);
161
+ if (!m) return { label: trimmed };
162
+ return { label: m[1].trim(), alias: m[2] };
163
+ }
164
+ function resolveAliasName(token) {
165
+ return nameAliasMap.get(token.trim()) ?? token;
166
+ }
167
+ let firstLineParsed = false;
168
+ function getOrCreateTable(name, lineNumber) {
169
+ const key = tableId(name);
170
+ const existing = tableMap.get(key);
171
+ if (existing) {
172
+ const incomingDisplay = displayName(name);
173
+ const existingDisplay = displayName(existing.name);
174
+ if (incomingDisplay !== existingDisplay) {
175
+ result.diagnostics.push(
176
+ makeDgmoError(
177
+ lineNumber,
178
+ nameMergedMessage({
179
+ incomingDisplay,
180
+ incomingLine: lineNumber,
181
+ existingDisplay,
182
+ existingLine: existing.lineNumber
183
+ }),
184
+ "warning",
185
+ NAME_DIAGNOSTIC_CODES.NAME_MERGED
186
+ )
187
+ );
188
+ }
189
+ return existing;
190
+ }
191
+ const metadata = {};
192
+ const table = {
193
+ id: key,
194
+ name,
195
+ columns: [],
196
+ metadata,
197
+ lineNumber
198
+ };
199
+ tableMap.set(key, table);
200
+ tableMetadataMap.set(key, metadata);
201
+ result.tables.push(table);
202
+ return table;
203
+ }
204
+ for (let i = 0; i < lines.length; i++) {
205
+ const raw = lines[i];
206
+ const trimmed = raw.trim();
207
+ const lineNumber = i + 1;
208
+ const indent = measureIndent(raw);
209
+ if (!trimmed) {
210
+ if (indent === 0) currentTable = null;
211
+ continue;
212
+ }
213
+ if (trimmed.startsWith("//")) continue;
214
+ if (!firstLineParsed && indent === 0) {
215
+ const firstLineResult = parseFirstLine(trimmed);
216
+ if (firstLineResult?.chartType === "er") {
217
+ firstLineParsed = true;
218
+ if (firstLineResult.title) {
219
+ result.title = firstLineResult.title;
220
+ result.titleLineNumber = lineNumber;
221
+ }
222
+ continue;
223
+ }
224
+ firstLineParsed = true;
225
+ }
226
+ if (!contentStarted && indent === 0) {
227
+ const tagBlockMatch = matchTagBlockHeading(trimmed);
228
+ if (tagBlockMatch) {
229
+ currentTagGroup = {
230
+ name: tagBlockMatch.name,
231
+ ...tagBlockMatch.alias !== void 0 && {
232
+ alias: tagBlockMatch.alias
233
+ },
234
+ entries: [],
235
+ lineNumber
236
+ };
237
+ if (tagBlockMatch.alias) {
238
+ metaAliasMap.set(
239
+ normalizeName(tagBlockMatch.alias),
240
+ tagBlockMatch.name.toLowerCase()
241
+ );
242
+ }
243
+ metaAliasMap.set(
244
+ normalizeName(tagBlockMatch.name),
245
+ tagBlockMatch.name.toLowerCase()
246
+ );
247
+ result.tagGroups.push(currentTagGroup);
248
+ continue;
249
+ }
250
+ }
251
+ if (currentTagGroup && !contentStarted && indent > 0) {
252
+ const { text: cleanEntry, isDefault } = stripDefaultModifier(trimmed);
253
+ const { label, color } = extractColor(
254
+ cleanEntry,
255
+ palette,
256
+ result.diagnostics,
257
+ lineNumber
258
+ );
259
+ if (isDefault) {
260
+ currentTagGroup.defaultValue = label;
261
+ } else if (currentTagGroup.entries.length === 0) {
262
+ currentTagGroup.defaultValue = label;
263
+ }
264
+ currentTagGroup.entries.push({
265
+ value: label,
266
+ color: color ?? AUTO_TAG_COLOR_SENTINEL,
267
+ lineNumber
268
+ });
269
+ continue;
270
+ }
271
+ if (currentTagGroup && indent === 0) {
272
+ currentTagGroup = null;
273
+ }
274
+ if (!contentStarted && indent === 0) {
275
+ const optMatch = trimmed.match(OPTION_NOCOLON_RE);
276
+ if (optMatch) {
277
+ const key = optMatch[1].toLowerCase();
278
+ const value = optMatch[2].trim();
279
+ if (KNOWN_OPTIONS.has(key)) {
280
+ options[key] = value.toLowerCase();
281
+ continue;
282
+ }
283
+ }
284
+ if (trimmed.toLowerCase() === "no-semantic-colors") {
285
+ options["no-semantic-colors"] = "on";
286
+ continue;
287
+ }
288
+ if (tryParseSharedOption(trimmed, options)) {
289
+ continue;
290
+ }
291
+ }
292
+ if (indent > 0 && currentTable) {
293
+ const indentRel = trimmed.match(INDENT_REL_RE);
294
+ if (indentRel) {
295
+ const fromCard = parseCardSide(indentRel[1]);
296
+ const toCard = parseCardSide(indentRel[3]);
297
+ if (fromCard && toCard) {
298
+ const rawTarget = (indentRel[4] ?? indentRel[5] ?? "").trim();
299
+ const targetName = resolveAliasName(rawTarget);
300
+ getOrCreateTable(targetName, lineNumber);
301
+ const rawLabel = indentRel[2]?.trim();
302
+ if (rawLabel) {
303
+ result.diagnostics.push(
304
+ ...validateLabelCharacters(rawLabel, lineNumber)
305
+ );
306
+ }
307
+ result.relationships.push({
308
+ source: currentTable.id,
309
+ target: tableId(targetName),
310
+ cardinality: { from: fromCard, to: toCard },
311
+ ...rawLabel && { label: rawLabel },
312
+ lineNumber
313
+ });
314
+ }
315
+ continue;
316
+ }
317
+ const colResult = parseColumn(trimmed);
318
+ if (colResult) {
319
+ currentTable.columns.push({
320
+ name: colResult.name,
321
+ ...colResult.type && { type: colResult.type },
322
+ constraints: colResult.constraints,
323
+ lineNumber
324
+ });
325
+ }
326
+ continue;
327
+ }
328
+ currentTable = null;
329
+ contentStarted = true;
330
+ const noteResult = tryCollectNote(
331
+ lines,
332
+ i,
333
+ indent,
334
+ palette,
335
+ result.diagnostics
336
+ );
337
+ if (noteResult) {
338
+ if (noteResult.note) notes.push(noteResult.note);
339
+ i = noteResult.lastIndex;
340
+ continue;
341
+ }
342
+ const rel = parseRelationship(trimmed, lineNumber, pushError);
343
+ if (rel) {
344
+ result.diagnostics.push(
345
+ makeDgmoError(
346
+ lineNumber,
347
+ `Relationship "${rel.source} \u2192 ${rel.target}" must be indented under the source table "${rel.source}"`,
348
+ "warning"
349
+ )
350
+ );
351
+ continue;
352
+ }
353
+ const registry = withTagAliases(ER_REGISTRY, new Set(metaAliasMap.keys()));
354
+ const split = splitNameAndMeta(
355
+ trimmed,
356
+ registry,
357
+ metaAliasMap,
358
+ void 0,
359
+ result.diagnostics,
360
+ lineNumber
361
+ );
362
+ warnUnknownMetaKeys(
363
+ split.meta,
364
+ registry,
365
+ (msg) => result.diagnostics.push(makeDgmoError(lineNumber, msg, "warning")),
366
+ split.name
367
+ );
368
+ const tableDecl = split.name.match(TABLE_DECL_RE);
369
+ if (tableDecl) {
370
+ const rawName = (tableDecl[1] ?? tableDecl[2] ?? "").trim();
371
+ const peeled = peelAlias(rawName);
372
+ const name = peeled.label;
373
+ if (peeled.alias) nameAliasMap.set(peeled.alias, name);
374
+ const colorName = split.color ?? tableDecl[3]?.trim();
375
+ const color = colorName ? resolveColorWithDiagnostic(
376
+ colorName,
377
+ lineNumber,
378
+ result.diagnostics,
379
+ palette
380
+ ) : void 0;
381
+ const table = getOrCreateTable(name, lineNumber);
382
+ if (color) table.color = color;
383
+ table.lineNumber = lineNumber;
384
+ if (Object.keys(split.meta).length > 0) {
385
+ const mutableMeta = tableMetadataMap.get(table.id);
386
+ if (mutableMeta) Object.assign(mutableMeta, split.meta);
387
+ }
388
+ currentTable = table;
389
+ continue;
390
+ }
391
+ result.diagnostics.push(
392
+ makeDgmoError(
393
+ lineNumber,
394
+ `Unexpected line: '${trimmed}'. A table is a bare name at indent 0 ('users'); columns are indented and SPACE-separated, no colon ('id int pk'); relationships are indented ('1--* orders'). (\xA79)`,
395
+ "warning"
396
+ )
397
+ );
398
+ }
399
+ if (result.tables.length === 0 && !result.error) {
400
+ const diag = makeDgmoError(
401
+ 1,
402
+ 'No tables found. Add table declarations like "users" or "orders blue".'
403
+ );
404
+ result.diagnostics.push(diag);
405
+ result.error = formatDgmoError(diag);
406
+ }
407
+ finalizeAutoTagColors(result.tagGroups, palette);
408
+ if (result.tagGroups.length > 0) {
409
+ const tagEntities = result.tables.map((t) => ({
410
+ metadata: t.metadata,
411
+ lineNumber: t.lineNumber
412
+ }));
413
+ validateTagValues(
414
+ tagEntities,
415
+ result.tagGroups,
416
+ (line, msg) => result.diagnostics.push(makeDgmoError(line, msg, "warning")),
417
+ suggest
418
+ );
419
+ validateTagGroupNames(
420
+ result.tagGroups,
421
+ (line, msg) => result.diagnostics.push(makeDgmoError(line, msg, "warning"))
422
+ );
423
+ for (const group of result.tagGroups) {
424
+ if (!group.defaultValue) continue;
425
+ const key = tagAttrKey(group.name);
426
+ for (const table of result.tables) {
427
+ if (!table.metadata[key]) {
428
+ const mutableMeta = tableMetadataMap.get(table.id);
429
+ if (mutableMeta) mutableMeta[key] = group.defaultValue;
430
+ }
431
+ }
432
+ }
433
+ }
434
+ if (notes.length > 0) {
435
+ result.notes = notes;
436
+ resolveNotes(
437
+ notes,
438
+ result.tables.map((t) => ({ id: t.id, label: t.name })),
439
+ result.diagnostics
440
+ );
441
+ }
442
+ if (result.tables.length >= 2 && result.relationships.length >= 1 && !result.error) {
443
+ const connectedIds = /* @__PURE__ */ new Set();
444
+ for (const rel of result.relationships) {
445
+ connectedIds.add(rel.source);
446
+ connectedIds.add(rel.target);
447
+ }
448
+ for (const table of result.tables) {
449
+ if (!connectedIds.has(table.id)) {
450
+ result.diagnostics.push(
451
+ makeDgmoError(
452
+ table.lineNumber,
453
+ `Table "${table.name}" is not connected to any other table`,
454
+ "warning"
455
+ )
456
+ );
457
+ }
458
+ }
459
+ }
460
+ return result;
461
+ }
462
+ var CONSTRAINT_KEYWORD_RE = /\b(pk|fk)\b/i;
463
+ function looksLikeERDiagram(content) {
464
+ const lines = content.split("\n");
465
+ let hasConstraint = false;
466
+ let hasTableDecl = false;
467
+ let hasRelationship = false;
468
+ for (const line of lines) {
469
+ const trimmed = line.trim();
470
+ if (!trimmed || trimmed.startsWith("//")) continue;
471
+ if (/^(er|notation)\s/i.test(trimmed) || /^er$/i.test(trimmed)) continue;
472
+ const indent = measureIndent(line);
473
+ if (indent > 0) {
474
+ if (CONSTRAINT_KEYWORD_RE.test(trimmed)) {
475
+ hasConstraint = true;
476
+ }
477
+ if (INDENT_REL_RE.test(trimmed)) {
478
+ hasRelationship = true;
479
+ }
480
+ } else {
481
+ if (TABLE_DECL_RE.test(trimmed)) {
482
+ hasTableDecl = true;
483
+ }
484
+ if (REL_SYMBOLIC_RE.test(trimmed)) {
485
+ hasRelationship = true;
486
+ }
487
+ }
488
+ }
489
+ if (hasConstraint && hasTableDecl) return true;
490
+ if (hasRelationship && hasTableDecl) return true;
491
+ return false;
492
+ }
493
+ function extractSymbols(docText) {
494
+ const entities = [];
495
+ let inMetadata = true;
496
+ for (const rawLine of docText.split("\n")) {
497
+ const line = rawLine.trim();
498
+ if (inMetadata && /^er(\s|$)/i.test(line)) continue;
499
+ if (/^\s/.test(rawLine)) continue;
500
+ if (line.length === 0) continue;
501
+ const m = TABLE_DECL_RE.exec(line);
502
+ if (m) {
503
+ const name = (m[1] ?? m[2] ?? "").trim();
504
+ if (name) {
505
+ inMetadata = false;
506
+ entities.push(name);
507
+ continue;
508
+ }
509
+ }
510
+ if (inMetadata && OPTION_NOCOLON_RE.test(line)) continue;
511
+ inMetadata = false;
512
+ }
513
+ return {
514
+ kind: "er",
515
+ entities
516
+ };
517
+ }
518
+
519
+ export {
520
+ parseERDiagram,
521
+ looksLikeERDiagram,
522
+ extractSymbols
523
+ };
524
+ //# sourceMappingURL=chunk-L66GEFB6.js.map