@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,9 @@
1
+ // src/block/types.ts
2
+ function isBlockNode(cell) {
3
+ return cell.empty !== true;
4
+ }
5
+
6
+ export {
7
+ isBlockNode
8
+ };
9
+ //# sourceMappingURL=chunk-NNAAJVBU.js.map
@@ -0,0 +1,47 @@
1
+ // src/utils/name-normalize.ts
2
+ var WHITESPACE_RUN_RE = /\s+/gu;
3
+ function normalizeName(input) {
4
+ return input.normalize("NFC").replace(WHITESPACE_RUN_RE, " ").trim().toLocaleLowerCase("en-US");
5
+ }
6
+ function displayName(input) {
7
+ return input.normalize("NFC").trim();
8
+ }
9
+ function getOrCreateName(input, store, lineNumber, aliasStore) {
10
+ if (aliasStore !== void 0) {
11
+ const aliased = aliasStore.get(input.trim());
12
+ if (aliased !== void 0) {
13
+ return { entry: aliased, created: false };
14
+ }
15
+ }
16
+ const key = normalizeName(input);
17
+ const incomingDisplay = displayName(input);
18
+ const existing = store.get(key);
19
+ if (existing) {
20
+ if (existing.displayLabel !== incomingDisplay) {
21
+ return {
22
+ entry: existing,
23
+ created: false,
24
+ merged: {
25
+ existingLine: existing.declaredLine,
26
+ existingDisplay: existing.displayLabel,
27
+ incomingDisplay
28
+ }
29
+ };
30
+ }
31
+ return { entry: existing, created: false };
32
+ }
33
+ const entry = {
34
+ normalizedKey: key,
35
+ displayLabel: incomingDisplay,
36
+ declaredLine: lineNumber
37
+ };
38
+ store.set(key, entry);
39
+ return { entry, created: true };
40
+ }
41
+
42
+ export {
43
+ normalizeName,
44
+ displayName,
45
+ getOrCreateName
46
+ };
47
+ //# sourceMappingURL=chunk-NOTA6TEI.js.map
@@ -0,0 +1,335 @@
1
+ import {
2
+ OPTION_NOCOLON_RE,
3
+ TECH_RADAR_REGISTRY,
4
+ measureIndent,
5
+ parseFirstLine,
6
+ splitNameAndMeta,
7
+ warnUnknownMetaKeys
8
+ } from "./chunk-Y3J7VR52.js";
9
+ import {
10
+ makeDgmoError,
11
+ makeFail,
12
+ suggest
13
+ } from "./chunk-CXK4DZH3.js";
14
+
15
+ // src/tech-radar/parser.ts
16
+ var VALID_POSITIONS = [
17
+ "top-left",
18
+ "top-right",
19
+ "bottom-left",
20
+ "bottom-right"
21
+ ];
22
+ var VALID_TRENDS = ["new", "up", "down", "stable"];
23
+ var POSITION_ORDER = [
24
+ "top-left",
25
+ "top-right",
26
+ "bottom-right",
27
+ "bottom-left"
28
+ ];
29
+ var KNOWN_OPTIONS = /* @__PURE__ */ new Set([]);
30
+ var KNOWN_BOOLEANS = /* @__PURE__ */ new Set([
31
+ "show-blip-legend",
32
+ "solid-fill",
33
+ "no-title"
34
+ ]);
35
+ function parseTechRadar(content) {
36
+ const result = {
37
+ type: "tech-radar",
38
+ title: "",
39
+ titleLineNumber: 0,
40
+ rings: [],
41
+ quadrants: [],
42
+ options: {},
43
+ diagnostics: [],
44
+ error: null
45
+ };
46
+ const fail = makeFail(result);
47
+ const warn = (line, message) => {
48
+ result.diagnostics.push(makeDgmoError(line, message, "warning"));
49
+ };
50
+ if (!content?.trim()) {
51
+ return fail(0, "No content provided");
52
+ }
53
+ function isRingName(name) {
54
+ const lower = name.toLowerCase();
55
+ return result.rings.some(
56
+ (r) => r.name.toLowerCase() === lower || r.alias !== null && r.alias.toLowerCase() === lower
57
+ );
58
+ }
59
+ function canonicalRingName(name) {
60
+ const lower = name.toLowerCase();
61
+ const ring = result.rings.find(
62
+ (r) => r.name.toLowerCase() === lower || r.alias !== null && r.alias.toLowerCase() === lower
63
+ );
64
+ return ring?.name ?? name;
65
+ }
66
+ const lines = content.split("\n");
67
+ let headerParsed = false;
68
+ let inRingsBlock = false;
69
+ let currentQuadrant = null;
70
+ let currentBlip = null;
71
+ let blipBaseIndent = 0;
72
+ let currentRing = null;
73
+ for (let i = 0; i < lines.length; i++) {
74
+ const line = lines[i];
75
+ const lineNumber = i + 1;
76
+ const trimmed = line.trim();
77
+ const indent = measureIndent(line);
78
+ if (!trimmed) {
79
+ if (inRingsBlock && result.rings.length > 0) {
80
+ inRingsBlock = false;
81
+ }
82
+ continue;
83
+ }
84
+ if (trimmed.startsWith("//")) continue;
85
+ if (!headerParsed) {
86
+ const firstLine = parseFirstLine(trimmed);
87
+ if (firstLine?.chartType === "tech-radar") {
88
+ result.title = firstLine.title ?? "";
89
+ result.titleLineNumber = lineNumber;
90
+ headerParsed = true;
91
+ continue;
92
+ }
93
+ return fail(lineNumber, 'Expected "tech-radar" chart type declaration');
94
+ }
95
+ if (indent === 0 && trimmed.toLowerCase() === "rings") {
96
+ if (result.rings.length > 0) {
97
+ warn(
98
+ lineNumber,
99
+ 'Duplicate "rings" block \u2014 only the last is kept; merge all ring names into one "rings" block.'
100
+ );
101
+ result.rings = [];
102
+ }
103
+ inRingsBlock = true;
104
+ currentBlip = null;
105
+ currentQuadrant = null;
106
+ currentRing = null;
107
+ continue;
108
+ }
109
+ if (inRingsBlock) {
110
+ if (indent > 0) {
111
+ const aliasMatch = trimmed.match(/^(.+?)\s+(?:alias|aka)\s+(\S+)\s*$/i);
112
+ if (aliasMatch) {
113
+ result.rings.push({
114
+ // Capture groups [1] and [2] guaranteed by regex match.
115
+ name: aliasMatch[1].trim(),
116
+ alias: aliasMatch[2].trim(),
117
+ lineNumber
118
+ });
119
+ } else {
120
+ result.rings.push({ name: trimmed, alias: null, lineNumber });
121
+ }
122
+ continue;
123
+ }
124
+ inRingsBlock = false;
125
+ }
126
+ if (indent === 0 && !trimmed.includes("|")) {
127
+ const optMatch = trimmed.match(OPTION_NOCOLON_RE);
128
+ if (optMatch) {
129
+ const key = optMatch[1].toLowerCase();
130
+ if (KNOWN_OPTIONS.has(key)) {
131
+ result.options[key] = optMatch[2].trim();
132
+ currentBlip = null;
133
+ continue;
134
+ }
135
+ }
136
+ if (KNOWN_BOOLEANS.has(trimmed.toLowerCase())) {
137
+ result.options[trimmed.toLowerCase()] = "on";
138
+ currentBlip = null;
139
+ continue;
140
+ }
141
+ }
142
+ if (indent === 0 && /\bquadrant\s*:/.test(trimmed)) {
143
+ const split = splitNameAndMeta(
144
+ trimmed,
145
+ TECH_RADAR_REGISTRY,
146
+ void 0,
147
+ void 0,
148
+ void 0,
149
+ void 0,
150
+ { peelAlias: false }
151
+ );
152
+ warnUnknownMetaKeys(
153
+ split.meta,
154
+ TECH_RADAR_REGISTRY,
155
+ (msg) => warn(lineNumber, msg),
156
+ split.name
157
+ );
158
+ const segments = [split.name];
159
+ const meta = split.meta;
160
+ const quadrantPos = meta["quadrant"];
161
+ if (quadrantPos) {
162
+ const position = quadrantPos.toLowerCase();
163
+ if (!VALID_POSITIONS.includes(position)) {
164
+ const hint = suggest(position, [...VALID_POSITIONS]);
165
+ let msg = `Invalid quadrant position "${quadrantPos}". Must be one of: ${VALID_POSITIONS.join(", ")}`;
166
+ if (hint) msg += `. ${hint}`;
167
+ result.diagnostics.push(makeDgmoError(lineNumber, msg));
168
+ continue;
169
+ }
170
+ const existing = result.quadrants.find((q) => q.position === position);
171
+ if (existing) {
172
+ result.diagnostics.push(
173
+ makeDgmoError(
174
+ lineNumber,
175
+ `Duplicate quadrant position "${position}" \u2014 already used by "${existing.name}"`
176
+ )
177
+ );
178
+ continue;
179
+ }
180
+ const name = segments[0].trim();
181
+ const color = meta["color"] ?? null;
182
+ currentQuadrant = {
183
+ name,
184
+ position,
185
+ color,
186
+ lineNumber,
187
+ blips: []
188
+ };
189
+ result.quadrants.push(currentQuadrant);
190
+ currentBlip = null;
191
+ currentRing = null;
192
+ continue;
193
+ }
194
+ }
195
+ if (currentQuadrant && indent > 0) {
196
+ if (!trimmed.includes("|") && result.rings.length > 0 && isRingName(trimmed)) {
197
+ currentRing = canonicalRingName(trimmed);
198
+ currentBlip = null;
199
+ continue;
200
+ }
201
+ if (currentBlip && indent > blipBaseIndent) {
202
+ currentBlip.description.push(trimmed);
203
+ continue;
204
+ }
205
+ if (/\b(?:ring|trend|color|description)\s*:/.test(trimmed)) {
206
+ const split = splitNameAndMeta(
207
+ trimmed,
208
+ TECH_RADAR_REGISTRY,
209
+ void 0,
210
+ void 0,
211
+ void 0,
212
+ void 0,
213
+ { peelAlias: false }
214
+ );
215
+ warnUnknownMetaKeys(
216
+ split.meta,
217
+ TECH_RADAR_REGISTRY,
218
+ (msg) => warn(lineNumber, msg),
219
+ split.name
220
+ );
221
+ const segments = [split.name];
222
+ const meta = split.meta;
223
+ const explicitRing = meta["ring"];
224
+ const effectiveRing = explicitRing ? canonicalRingName(explicitRing) : currentRing;
225
+ if (!effectiveRing) {
226
+ result.diagnostics.push(
227
+ makeDgmoError(
228
+ lineNumber,
229
+ `Blip "${segments[0].trim()}" has no ring assignment. Use a ring section header or add "ring: RingName" metadata.`
230
+ )
231
+ );
232
+ continue;
233
+ }
234
+ if (explicitRing && result.rings.length > 0 && !isRingName(explicitRing)) {
235
+ const hint = suggest(
236
+ explicitRing,
237
+ result.rings.map((r) => r.name)
238
+ );
239
+ let msg = `Unknown ring "${explicitRing}" on blip "${segments[0].trim()}"`;
240
+ if (hint) msg += `. ${hint}`;
241
+ result.diagnostics.push(makeDgmoError(lineNumber, msg));
242
+ continue;
243
+ }
244
+ let trend = null;
245
+ if (meta["trend"]) {
246
+ const trendVal = meta["trend"].toLowerCase();
247
+ if (!VALID_TRENDS.includes(trendVal)) {
248
+ const hint = suggest(meta["trend"], [...VALID_TRENDS]);
249
+ let msg = `Unknown trend "${meta["trend"]}" on blip "${segments[0].trim()}". Must be one of: ${VALID_TRENDS.join(", ")}`;
250
+ if (hint) msg += `. ${hint}`;
251
+ result.diagnostics.push(makeDgmoError(lineNumber, msg, "warning"));
252
+ } else {
253
+ trend = trendVal;
254
+ }
255
+ }
256
+ currentBlip = {
257
+ // In-bounds: split() always returns at least one element.
258
+ name: segments[0].trim(),
259
+ ring: effectiveRing,
260
+ trend,
261
+ description: [],
262
+ lineNumber,
263
+ globalNumber: 0
264
+ };
265
+ blipBaseIndent = indent;
266
+ currentQuadrant.blips.push(currentBlip);
267
+ continue;
268
+ }
269
+ if (currentRing) {
270
+ currentBlip = {
271
+ name: trimmed,
272
+ ring: currentRing,
273
+ trend: null,
274
+ description: [],
275
+ lineNumber,
276
+ globalNumber: 0
277
+ };
278
+ blipBaseIndent = indent;
279
+ currentQuadrant.blips.push(currentBlip);
280
+ continue;
281
+ }
282
+ result.diagnostics.push(
283
+ makeDgmoError(
284
+ lineNumber,
285
+ `Blip "${trimmed}" has no ring. Put it under a ring section header, or add a colon-keyed ring \u2014 '${trimmed} ring: RingName' (per \xA720).`
286
+ )
287
+ );
288
+ continue;
289
+ }
290
+ if (indent === 0) {
291
+ if (!trimmed.includes("|") && headerParsed && result.rings.length > 0) {
292
+ warn(
293
+ lineNumber,
294
+ `Unrecognized line "${trimmed}". A quadrant header is 'Name quadrant: <top-left|top-right|bottom-left|bottom-right>' (per \xA720).`
295
+ );
296
+ }
297
+ }
298
+ }
299
+ if (result.rings.length === 0) {
300
+ result.diagnostics.push(
301
+ makeDgmoError(
302
+ 0,
303
+ 'Missing "rings" block \u2014 declare ring names before quadrant sections'
304
+ )
305
+ );
306
+ }
307
+ if (result.quadrants.length !== 4) {
308
+ const msg = result.quadrants.length === 0 ? "No quadrants declared. Exactly 4 quadrants are required." : `Expected exactly 4 quadrants, found ${result.quadrants.length}. Each quadrant needs a unique position (top-left, top-right, bottom-left, bottom-right).`;
309
+ result.diagnostics.push(makeDgmoError(0, msg));
310
+ }
311
+ assignGlobalNumbers(result);
312
+ return result;
313
+ }
314
+ function assignGlobalNumbers(result) {
315
+ const ringOrder = result.rings.map((r) => r.name);
316
+ let counter = 1;
317
+ for (const position of POSITION_ORDER) {
318
+ const quadrant = result.quadrants.find((q) => q.position === position);
319
+ if (!quadrant) continue;
320
+ const sortedBlips = [...quadrant.blips].sort((a, b) => {
321
+ const aRing = ringOrder.indexOf(a.ring);
322
+ const bRing = ringOrder.indexOf(b.ring);
323
+ if (aRing !== bRing) return aRing - bRing;
324
+ return a.lineNumber - b.lineNumber;
325
+ });
326
+ for (const blip of sortedBlips) {
327
+ blip.globalNumber = counter++;
328
+ }
329
+ }
330
+ }
331
+
332
+ export {
333
+ parseTechRadar
334
+ };
335
+ //# sourceMappingURL=chunk-NURGB5Z4.js.map