@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.
- package/dist/advanced.cjs +31 -25
- package/dist/advanced.d.cts +3 -855
- package/dist/advanced.d.ts +3 -855
- package/dist/advanced.js +541 -70101
- package/dist/analyzer-UYKBXAKR.js +15 -0
- package/dist/auto.cjs +500 -341
- package/dist/auto.css +342 -159
- package/dist/auto.d.cts +10 -8
- package/dist/auto.d.ts +10 -8
- package/dist/auto.js +373 -265
- package/dist/auto.mjs +500 -341
- package/dist/block.cjs +31 -25
- package/dist/block.js +83 -69411
- package/dist/calculator-LDYQCDDY.js +11 -0
- package/dist/charts-d3-QOZHKTCT.js +25 -0
- package/dist/chunk-2DXMZRWJ.js +800 -0
- package/dist/chunk-2LACINWN.js +786 -0
- package/dist/chunk-33LCUH4H.js +893 -0
- package/dist/chunk-3CIOJ5YJ.js +35 -0
- package/dist/chunk-3HDBAXF5.js +86 -0
- package/dist/chunk-3JLKYGBQ.js +290 -0
- package/dist/chunk-3MQQNXPD.js +415 -0
- package/dist/chunk-3R5POCTZ.js +967 -0
- package/dist/chunk-3SMGIJDD.js +112 -0
- package/dist/chunk-44CM72SQ.js +409 -0
- package/dist/chunk-4GRI7MEB.js +1604 -0
- package/dist/chunk-4OHACBGX.js +606 -0
- package/dist/chunk-5DH3KYFH.js +21 -0
- package/dist/chunk-5MLYVTYM.js +76 -0
- package/dist/chunk-5QXL4NYS.js +553 -0
- package/dist/chunk-5WRI5ZAA.js +31 -0
- package/dist/chunk-6EK55ART.js +117 -0
- package/dist/chunk-6FZYCKXB.js +2065 -0
- package/dist/chunk-6HO5ZTXK.js +277 -0
- package/dist/chunk-6KFWC4CO.js +7 -0
- package/dist/chunk-6MTWIQVO.js +121 -0
- package/dist/chunk-6NYWYNBI.js +329 -0
- package/dist/chunk-6SM5NJQH.js +620 -0
- package/dist/chunk-725LDASD.js +422 -0
- package/dist/chunk-76OWZ3BA.js +130 -0
- package/dist/chunk-7JEGTRLD.js +338 -0
- package/dist/chunk-A44USUV7.js +923 -0
- package/dist/chunk-A4GOY3PE.js +25 -0
- package/dist/chunk-A4VFQH5G.js +251 -0
- package/dist/chunk-AELOBFW5.js +375 -0
- package/dist/chunk-AN2MOO5T.js +522 -0
- package/dist/chunk-BMR4CIEO.js +41 -0
- package/dist/chunk-BS7SV7C3.js +51 -0
- package/dist/chunk-BUPDIHML.js +613 -0
- package/dist/chunk-BUVJFRPY.js +887 -0
- package/dist/chunk-C3Z4DX3V.js +112 -0
- package/dist/chunk-CI2G3OEB.js +1818 -0
- package/dist/chunk-CKNVO24D.js +54 -0
- package/dist/chunk-CUVHQHZ7.js +391 -0
- package/dist/chunk-CXK4DZH3.js +114 -0
- package/dist/chunk-DKEPS5LH.js +315 -0
- package/dist/chunk-DU7W62N5.js +487 -0
- package/dist/chunk-DZAQBW35.js +751 -0
- package/dist/chunk-EB6FPQUP.js +316 -0
- package/dist/chunk-EMS2SK26.js +376 -0
- package/dist/chunk-ERLBPDGU.js +510 -0
- package/dist/chunk-EVCVDTXE.js +732 -0
- package/dist/chunk-FCIIHT24.js +384 -0
- package/dist/chunk-FFUN5D66.js +97 -0
- package/dist/chunk-FITOLXSX.js +714 -0
- package/dist/chunk-FMDSF3OV.js +68 -0
- package/dist/chunk-FNB3PNGF.js +410 -0
- package/dist/chunk-G2H74XJZ.js +2104 -0
- package/dist/chunk-GMR5MFHJ.js +339 -0
- package/dist/chunk-H6PI3KJT.js +305 -0
- package/dist/chunk-I46X5VUA.js +59 -0
- package/dist/chunk-I5IGB56C.js +255 -0
- package/dist/chunk-IH6ZMVQ5.js +3950 -0
- package/dist/chunk-IJZFN3HM.js +463 -0
- package/dist/chunk-IPWPWM6R.js +3079 -0
- package/dist/chunk-IYULMRBE.js +23 -0
- package/dist/chunk-IZMRON6C.js +167 -0
- package/dist/chunk-J5FIXQRT.js +813 -0
- package/dist/chunk-JED6ZDEE.js +73 -0
- package/dist/chunk-JEUJOX5X.js +136 -0
- package/dist/chunk-JM4LEPY3.js +436 -0
- package/dist/chunk-L3UHP6TD.js +101 -0
- package/dist/chunk-L66GEFB6.js +524 -0
- package/dist/chunk-LIOHW36Z.js +469 -0
- package/dist/chunk-LP7EC4MI.js +16 -0
- package/dist/chunk-MITI6NOL.js +548 -0
- package/dist/chunk-MO5YHHMQ.js +168 -0
- package/dist/chunk-MZSBFAPJ.js +885 -0
- package/dist/chunk-NNAAJVBU.js +9 -0
- package/dist/chunk-NOTA6TEI.js +47 -0
- package/dist/chunk-NURGB5Z4.js +335 -0
- package/dist/chunk-NX4EQS3U.js +1062 -0
- package/dist/chunk-NXMESY4J.js +1 -0
- package/dist/chunk-OJR3MQYV.js +1458 -0
- package/dist/chunk-OURHMODR.js +454 -0
- package/dist/chunk-P235SVAH.js +1057 -0
- package/dist/chunk-P4RH4OSP.js +1038 -0
- package/dist/chunk-P6T66CCZ.js +226 -0
- package/dist/chunk-PBAHEPLQ.js +223 -0
- package/dist/chunk-PBHE5UG6.js +1530 -0
- package/dist/chunk-PDKUANDZ.js +35 -0
- package/dist/chunk-PWIHZ6NJ.js +296 -0
- package/dist/chunk-QEBUY5NY.js +1685 -0
- package/dist/chunk-QLCCJEJI.js +253 -0
- package/dist/chunk-QOOUC2J5.js +52 -0
- package/dist/chunk-QYTPPDAO.js +402 -0
- package/dist/chunk-R3XI2VC7.js +801 -0
- package/dist/chunk-RCERWOJR.js +154 -0
- package/dist/chunk-RJE5JTVK.js +362 -0
- package/dist/chunk-RTLBSQ3G.js +1155 -0
- package/dist/chunk-RUNNI6VE.js +448 -0
- package/dist/chunk-RVMRZAPB.js +354 -0
- package/dist/chunk-RYEGFMUO.js +955 -0
- package/dist/chunk-RZCF2VVM.js +528 -0
- package/dist/chunk-SML67VPV.js +1025 -0
- package/dist/chunk-SQ7IY53Q.js +44 -0
- package/dist/chunk-SQAG3UXH.js +161 -0
- package/dist/chunk-SRTU6HMQ.js +1851 -0
- package/dist/chunk-T2OE3YQB.js +550 -0
- package/dist/chunk-T3UBLACL.js +299 -0
- package/dist/chunk-TLVIHFRO.js +296 -0
- package/dist/chunk-TYS6CSS5.js +52 -0
- package/dist/chunk-U6EQI3U6.js +130 -0
- package/dist/chunk-UJ4FJLBF.js +86 -0
- package/dist/chunk-ULOEATBZ.js +347 -0
- package/dist/chunk-UNCCZ3NU.js +127 -0
- package/dist/chunk-USZW2HHU.js +197 -0
- package/dist/chunk-UWN33VNX.js +1610 -0
- package/dist/chunk-UZ7EZW3B.js +40 -0
- package/dist/chunk-VOKGH627.js +37 -0
- package/dist/chunk-WBRZJOEC.js +204 -0
- package/dist/chunk-WCSOJFU3.js +380 -0
- package/dist/chunk-WCT3NYCV.js +160 -0
- package/dist/chunk-WVAJFAIA.js +529 -0
- package/dist/chunk-X5LCYCL5.js +394 -0
- package/dist/chunk-XAKEUMEJ.js +1256 -0
- package/dist/chunk-Y2ZE3MSG.js +590 -0
- package/dist/chunk-Y3J7VR52.js +646 -0
- package/dist/chunk-Y5QGVTVC.js +33 -0
- package/dist/chunk-YAA6IID3.js +548 -0
- package/dist/chunk-YGJTDXVR.js +692 -0
- package/dist/chunk-YRYKTYMQ.js +186 -0
- package/dist/chunk-YYVTBZZC.js +61 -0
- package/dist/chunk-Z5CGSFJB.js +647 -0
- package/dist/chunk-Z72XRXD4.js +787 -0
- package/dist/chunk-ZGR7ULFJ.js +978 -0
- package/dist/chunk-ZJEL4H2R.js +851 -0
- package/dist/chunk-ZO27FGJS.js +554 -0
- package/dist/cli.cjs +112 -112
- package/dist/collapse-CLPJD2RL.js +11 -0
- package/dist/collapse-SLINJQW6.js +9 -0
- package/dist/collapse-ZWUFFCK2.js +9 -0
- package/dist/compute-G55RG53N.js +8 -0
- package/dist/dgmo-router-DZCIDUO5.js +73 -0
- package/dist/dimensions-J3FHIMJ6.js +22 -0
- package/dist/element.cjs +492 -325
- package/dist/element.js +367 -259
- package/dist/element.mjs +492 -325
- package/dist/flowchart-parser-ZNSKIBVR.js +21 -0
- package/dist/flowchart-renderer-ZAEOL4DX.js +35 -0
- package/dist/index.cjs +34 -28
- package/dist/index.d.cts +3 -469
- package/dist/index.d.ts +3 -469
- package/dist/index.js +137 -69679
- package/dist/layout-46N4JJYK.js +17 -0
- package/dist/layout-5RA6QWR6.js +26 -0
- package/dist/layout-5T6RH5M6.js +14 -0
- package/dist/layout-7QXCNOVS.js +13 -0
- package/dist/layout-EE6GE46Y.js +17 -0
- package/dist/layout-G23F7LDH.js +9 -0
- package/dist/layout-HRBZPFCN.js +23 -0
- package/dist/layout-HWDSRX5E.js +20 -0
- package/dist/layout-HYZPWAK5.js +18 -0
- package/dist/layout-N76NR4ZO.js +19 -0
- package/dist/layout-OB3RI63S.js +14 -0
- package/dist/layout-S2QBYSK2.js +15 -0
- package/dist/layout-UM5F4DJB.js +15 -0
- package/dist/layout-search-OYV77HHS.js +1655 -0
- package/dist/load-data-EHDDZ5ZS.js +8 -0
- package/dist/palettes-PRJ2RI6D.js +56 -0
- package/dist/parser-2MFP2H2E.js +11 -0
- package/dist/parser-3STE62GB.js +21 -0
- package/dist/parser-4FL2CMDG.js +18 -0
- package/dist/parser-4OGOBJJ4.js +13 -0
- package/dist/parser-6BTRLKRZ.js +15 -0
- package/dist/parser-AQETEVRW.js +21 -0
- package/dist/parser-CFZD5IBL.js +12 -0
- package/dist/parser-FUSKFGZN.js +16 -0
- package/dist/parser-I6KXEYFK.js +13 -0
- package/dist/parser-IXSZZQHY.js +18 -0
- package/dist/parser-JAL2HD4I.js +13 -0
- package/dist/parser-KNSQSKQO.js +20 -0
- package/dist/parser-N5O4IHUN.js +13 -0
- package/dist/parser-NGU3ETO6.js +16 -0
- package/dist/parser-NRAI6O25.js +19 -0
- package/dist/parser-O5J4VBII.js +11 -0
- package/dist/parser-OV7NOBW6.js +21 -0
- package/dist/parser-PQ3POX45.js +23 -0
- package/dist/parser-TFZFBVWN.js +11 -0
- package/dist/parser-TRTHDFPP.js +18 -0
- package/dist/parser-VQP2UJ6W.js +11 -0
- package/dist/parser-XDVELHRK.js +13 -0
- package/dist/parser-XKRP7QKP.js +11 -0
- package/dist/parser-Y6WTBU76.js +14 -0
- package/dist/parser-ZSDPZYQP.js +12 -0
- package/dist/renderer-2XQQQ6QR.js +28 -0
- package/dist/renderer-5NDVNDAZ.js +26 -0
- package/dist/renderer-6EEZHMH4.js +26 -0
- package/dist/renderer-6W5462RB.js +43 -0
- package/dist/renderer-7MVLWWQD.js +22 -0
- package/dist/renderer-AWWAF6XD.js +33 -0
- package/dist/renderer-BYCNMBF7.js +34 -0
- package/dist/renderer-CLJHQPBJ.js +29 -0
- package/dist/renderer-GHPZMFU2.js +15 -0
- package/dist/renderer-JGBKUCZD.js +16 -0
- package/dist/renderer-KQB7UGDS.js +19 -0
- package/dist/renderer-PGX2TKVS.js +24 -0
- package/dist/renderer-QIWVHWZO.js +15 -0
- package/dist/renderer-RPOA5YPZ.js +35 -0
- package/dist/renderer-SMIBCRVB.js +24 -0
- package/dist/renderer-T7YKC5VP.js +28 -0
- package/dist/renderer-TOCOVLHS.js +37 -0
- package/dist/renderer-UWA5XS74.js +39 -0
- package/dist/renderer-VACVQYML.js +25 -0
- package/dist/renderer-W4M6QLIJ.js +37 -0
- package/dist/renderer-WZRREQ2P.js +23 -0
- package/dist/renderer-YY2OSF6E.js +27 -0
- package/dist/renderer-Z7I3W2PP.js +24 -0
- package/dist/renderer-ZGNTUWC4.js +22 -0
- package/dist/renderer-ZTR3DER3.js +19 -0
- package/dist/renderer-radial-C32GPJQ7.js +21 -0
- package/dist/resolver-NOAA7ID7.js +13 -0
- package/dist/state-collapse-HCGD6IVJ.js +8 -0
- package/dist/state-parser-Z2V23ATR.js +18 -0
- package/dist/state-renderer-RFYHSP4K.js +34 -0
- package/dist/themes-1-CuKpeH.d.cts +908 -0
- package/dist/themes-1-CuKpeH.d.ts +908 -0
- package/package.json +1 -1
- package/src/auto/index.ts +55 -57
- package/src/auto/shared.ts +142 -142
- package/src/auto/styles.ts +44 -199
- package/src/c4/renderer.ts +2 -2
- package/src/element/index.ts +29 -21
- package/src/infra/renderer.ts +1 -1
- package/src/render.ts +34 -14
- package/src/sitemap/renderer.ts +1 -1
- package/src/timeline/renderer.ts +1 -1
- package/src/utils/hover-styles.ts +6 -1
- package/src/utils/legend-d3.ts +1 -4
- 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
|