mirror of
https://github.com/mermaid-js/mermaid.git
synced 2025-08-15 22:39:26 +02:00
Compare commits
942 Commits
v10.9.0
...
5237-unifi
Author | SHA1 | Date | |
---|---|---|---|
![]() |
771d3fcbbe | ||
![]() |
06377b8231 | ||
![]() |
4e55f4cf3d | ||
![]() |
d5a03a9054 | ||
![]() |
f3a65f3178 | ||
![]() |
b27d83e0e7 | ||
![]() |
55bd9e6efa | ||
![]() |
8b8c0dd57c | ||
![]() |
d8d608fd99 | ||
![]() |
2efb2565ad | ||
![]() |
c8a3290163 | ||
![]() |
14a231767a | ||
![]() |
803e9eb2bd | ||
![]() |
29a3967c0e | ||
![]() |
cf72d33335 | ||
![]() |
7534462966 | ||
![]() |
d4525331cb | ||
![]() |
501cdbfcf7 | ||
![]() |
13bba48e92 | ||
![]() |
f1bd8fa91b | ||
![]() |
d9a12997ce | ||
![]() |
1fad9e6eef | ||
![]() |
d9b2934a50 | ||
![]() |
6b87fb3418 | ||
![]() |
444de0f133 | ||
![]() |
51fc56b95d | ||
![]() |
195e314c42 | ||
![]() |
4c6e2783b0 | ||
![]() |
4a50feb5d9 | ||
![]() |
3f2e823330 | ||
![]() |
0ba712f53c | ||
![]() |
14622b0386 | ||
![]() |
35797f867f | ||
![]() |
3f0ababca6 | ||
![]() |
6231682867 | ||
![]() |
9400e46827 | ||
![]() |
b92eae5b34 | ||
![]() |
5e6215d4f2 | ||
![]() |
871a13aff8 | ||
![]() |
7f2902594c | ||
![]() |
ceb487f2d4 | ||
![]() |
6095aaae61 | ||
![]() |
c1052bd3c5 | ||
![]() |
a2cc86a414 | ||
![]() |
2057649581 | ||
![]() |
ba0d91da32 | ||
![]() |
63f81f36a9 | ||
![]() |
8e46e10429 | ||
![]() |
3411a6e46d | ||
![]() |
115a4976ff | ||
![]() |
a796940de3 | ||
![]() |
4b5e73102c | ||
![]() |
c5805383c7 | ||
![]() |
eb7d18dfca | ||
![]() |
eb0cb42f36 | ||
![]() |
18e2879867 | ||
![]() |
a46f993e3e | ||
![]() |
fc78ee0fc5 | ||
![]() |
ee6ae6a47a | ||
![]() |
6d7b2b1e14 | ||
![]() |
2117e71b51 | ||
![]() |
c3423beeda | ||
![]() |
de51bc40c7 | ||
![]() |
aa9f4a7760 | ||
![]() |
9979ea1d74 | ||
![]() |
fc31b22eb0 | ||
![]() |
c221350d59 | ||
![]() |
881a68241c | ||
![]() |
469acbe810 | ||
![]() |
ab726f008c | ||
![]() |
9b56cb3feb | ||
![]() |
cfacd3b2e1 | ||
![]() |
f45ae227a0 | ||
![]() |
97be6cbd73 | ||
![]() |
ce3b0af03a | ||
![]() |
c7c1218e02 | ||
![]() |
f5bdbf22e7 | ||
![]() |
1ab23d137f | ||
![]() |
cba968ccc0 | ||
![]() |
0f3778aea8 | ||
![]() |
ac5c61dbd4 | ||
![]() |
6c785c9316 | ||
![]() |
58483fb231 | ||
![]() |
0d8c3fcf8c | ||
![]() |
9f375139d5 | ||
![]() |
5ba3696f95 | ||
![]() |
0c49d2b84e | ||
![]() |
42414e85d1 | ||
![]() |
77a02fefe4 | ||
![]() |
1e43ad1ee3 | ||
![]() |
cda41a1cdf | ||
![]() |
1a199d630f | ||
![]() |
51c07163aa | ||
![]() |
9bbd3cab3c | ||
![]() |
6f61a71dda | ||
![]() |
3af4020cdc | ||
![]() |
d65e78f9e2 | ||
![]() |
82b120e567 | ||
![]() |
d95c159b1f | ||
![]() |
c468319869 | ||
![]() |
4de0182978 | ||
![]() |
4b21e1e745 | ||
![]() |
1601140511 | ||
![]() |
fb1942c2cf | ||
![]() |
81d8b9d02e | ||
![]() |
6db070197a | ||
![]() |
a331125187 | ||
![]() |
66bc461fa1 | ||
![]() |
b69c9821bc | ||
![]() |
df72febc00 | ||
![]() |
6d91ae4a09 | ||
![]() |
5aced51f9e | ||
![]() |
f791ea00ef | ||
![]() |
e07fdfedb6 | ||
![]() |
1096b185ee | ||
![]() |
fef433e844 | ||
![]() |
fe9fbd8618 | ||
![]() |
b031c6f182 | ||
![]() |
5a93afa7ca | ||
![]() |
2f792e33d6 | ||
![]() |
d408efdd1d | ||
![]() |
dc51a8f182 | ||
![]() |
e8d18189ac | ||
![]() |
a6276a94c3 | ||
![]() |
85628f2148 | ||
![]() |
1f70717a53 | ||
![]() |
493bb8a80e | ||
![]() |
788e7c96ff | ||
![]() |
caa0ff340d | ||
![]() |
44688a20b6 | ||
![]() |
3f1bba407e | ||
![]() |
91e8bcaba9 | ||
![]() |
a35e62db14 | ||
![]() |
66cd0b9621 | ||
![]() |
6382dcf7c8 | ||
![]() |
5587011f75 | ||
![]() |
0044aa3029 | ||
![]() |
9c3bcec7f0 | ||
![]() |
63f9e95795 | ||
![]() |
8f00555bf5 | ||
![]() |
029b3c1101 | ||
![]() |
2340a3b836 | ||
![]() |
d84b4403ab | ||
![]() |
323f72ce33 | ||
![]() |
6ae5fe7f17 | ||
![]() |
460e027b6e | ||
![]() |
406c0d869b | ||
![]() |
b6b2b3697d | ||
![]() |
83f2663f68 | ||
![]() |
a6f3316ddb | ||
![]() |
4a8c24a633 | ||
![]() |
6ca6403878 | ||
![]() |
5bd3a28667 | ||
![]() |
d52f4724fe | ||
![]() |
618f7977ef | ||
![]() |
ecee23d8ba | ||
![]() |
7ee22de5e2 | ||
![]() |
c904c7d21a | ||
![]() |
0d1ef9de07 | ||
![]() |
481f8186e4 | ||
![]() |
5731b72795 | ||
![]() |
92c05b9138 | ||
![]() |
dd7f8ac81b | ||
![]() |
1afd0a199e | ||
![]() |
e2e652ae0f | ||
![]() |
a5d24e5da5 | ||
![]() |
94512c0780 | ||
![]() |
ef83adb36e | ||
![]() |
926762a800 | ||
![]() |
ec0e9b8680 | ||
![]() |
fc17733770 | ||
![]() |
a5281e0464 | ||
![]() |
a6dc1eaa40 | ||
![]() |
9643e8f19c | ||
![]() |
bdca0a583e | ||
![]() |
a35152843f | ||
![]() |
f19a9d021f | ||
![]() |
1b5bd999e2 | ||
![]() |
36e4fcfdfe | ||
![]() |
913dbee2e7 | ||
![]() |
d895a62565 | ||
![]() |
50394e7af1 | ||
![]() |
9981d3fc8b | ||
![]() |
7763d9ceb8 | ||
![]() |
8cbceb611a | ||
![]() |
5f110e4cde | ||
![]() |
aaa4e8a794 | ||
![]() |
ea69d26a60 | ||
![]() |
ce3d0a23de | ||
![]() |
7fbe1661ec | ||
![]() |
1c4dd9b923 | ||
![]() |
1b29135cc1 | ||
![]() |
b285466130 | ||
![]() |
3754ac0872 | ||
![]() |
83ca6897bd | ||
![]() |
d2d7f2bcb0 | ||
![]() |
20f9abcc38 | ||
![]() |
0417a8ddff | ||
![]() |
a85f36c3be | ||
![]() |
d9d4a677ab | ||
![]() |
01297fa042 | ||
![]() |
46fe731379 | ||
![]() |
cca1c41749 | ||
![]() |
2c9c3b4571 | ||
![]() |
4266b2e4ca | ||
![]() |
0e63233845 | ||
![]() |
9855bdbaaa | ||
![]() |
51bdda0c34 | ||
![]() |
8fb9b21f59 | ||
![]() |
b8dd4b9048 | ||
![]() |
4f6586873f | ||
![]() |
37d799dd8e | ||
![]() |
c32116a21a | ||
![]() |
a56aa56cbc | ||
![]() |
48e313bf18 | ||
![]() |
fa6bcd8b30 | ||
![]() |
eed5ba6c1e | ||
![]() |
8e40f31ed3 | ||
![]() |
af05df937e | ||
![]() |
f01a9d50fb | ||
![]() |
f14b65cf43 | ||
![]() |
e5069083c9 | ||
![]() |
8a079299a6 | ||
![]() |
dfe223c3b8 | ||
![]() |
e09410448c | ||
![]() |
269ddf4a34 | ||
![]() |
e41bccad64 | ||
![]() |
d6ccd93cf2 | ||
![]() |
7da85b9005 | ||
![]() |
8d23b684f5 | ||
![]() |
47776e3ca1 | ||
![]() |
52e0dc6464 | ||
![]() |
5413668c1a | ||
![]() |
3e60270193 | ||
![]() |
ddaa7afbb5 | ||
![]() |
2377a0d753 | ||
![]() |
a4de1b4944 | ||
![]() |
5b66810646 | ||
![]() |
aa63f320f8 | ||
![]() |
cf20ccb126 | ||
![]() |
ca2c112c9a | ||
![]() |
75b0ee3daf | ||
![]() |
60c79dfb2f | ||
![]() |
c10ab23387 | ||
![]() |
ec7adb7e00 | ||
![]() |
0d2c7c3b2c | ||
![]() |
c8f2abad18 | ||
![]() |
b6ef7367c2 | ||
![]() |
4463e9d7a3 | ||
![]() |
44f42b2a63 | ||
![]() |
991721e955 | ||
![]() |
47d4929bc6 | ||
![]() |
ff36301cc5 | ||
![]() |
7fb079ef3c | ||
![]() |
7bcba29493 | ||
![]() |
8744008630 | ||
![]() |
418d34cbee | ||
![]() |
fcd5c2c21d | ||
![]() |
e3c6281b26 | ||
![]() |
ae5b886148 | ||
![]() |
c5badf8341 | ||
![]() |
da882de0d4 | ||
![]() |
633febaeab | ||
![]() |
bf9485c231 | ||
![]() |
a722bdcd37 | ||
![]() |
8a5fe53706 | ||
![]() |
362e49aa2c | ||
![]() |
6d2939c9b9 | ||
![]() |
9a11cb7bb3 | ||
![]() |
45cd2c005b | ||
![]() |
2d241808e9 | ||
![]() |
9fc17f67c6 | ||
![]() |
287e903385 | ||
![]() |
b1b27f7a2b | ||
![]() |
745ec0daae | ||
![]() |
64f1d2f005 | ||
![]() |
55afd8cdb8 | ||
![]() |
42a12a62ac | ||
![]() |
e8018ed779 | ||
![]() |
00eaebeac8 | ||
![]() |
dd92aecdca | ||
![]() |
20f9e503cb | ||
![]() |
e26dea6416 | ||
![]() |
3b2b8dacd8 | ||
![]() |
df94d3994d | ||
![]() |
6f56d94c64 | ||
![]() |
56c4f10607 | ||
![]() |
dfa71317ad | ||
![]() |
2df26ca323 | ||
![]() |
b7cb9673b0 | ||
![]() |
8d815f878c | ||
![]() |
dab26df9c4 | ||
![]() |
c7fe9a6465 | ||
![]() |
4f26f3ae2e | ||
![]() |
730fa89e4c | ||
![]() |
0326d899c4 | ||
![]() |
c993adfcdb | ||
![]() |
4885b311f8 | ||
![]() |
3274f673ab | ||
![]() |
f5fefc0499 | ||
![]() |
ab077992f5 | ||
![]() |
2f80c3a2c4 | ||
![]() |
4c0b8f6f40 | ||
![]() |
ce6f2739b5 | ||
![]() |
7ecb772c6c | ||
![]() |
f480fb7c85 | ||
![]() |
94bb43907d | ||
![]() |
32a62bede8 | ||
![]() |
7372d9055a | ||
![]() |
3ff4a6910d | ||
![]() |
683695bec2 | ||
![]() |
fbe13f4e9e | ||
![]() |
4f642428de | ||
![]() |
954f5d7d42 | ||
![]() |
4a12c46350 | ||
![]() |
9eb64cd6db | ||
![]() |
7b8e76c26f | ||
![]() |
665be1ecfe | ||
![]() |
edda73c7fc | ||
![]() |
6413529a6e | ||
![]() |
f5e1df08a0 | ||
![]() |
bb2bbfdf92 | ||
![]() |
7529db8254 | ||
![]() |
b9a73c88b5 | ||
![]() |
22bd26272d | ||
![]() |
d497a5c4ac | ||
![]() |
323737f3a6 | ||
![]() |
39bffcb3a0 | ||
![]() |
16cd7bf649 | ||
![]() |
da150e8767 | ||
![]() |
1f64452716 | ||
![]() |
10871af93b | ||
![]() |
50c9ede69d | ||
![]() |
ca4fa11859 | ||
![]() |
853948a93d | ||
![]() |
9986b023d7 | ||
![]() |
58af76384a | ||
![]() |
e2ca8e820e | ||
![]() |
1cbd730b8d | ||
![]() |
6f1a553234 | ||
![]() |
b2c286ff1d | ||
![]() |
024bffd683 | ||
![]() |
5e53d6cfee | ||
![]() |
913b29dbcb | ||
![]() |
e68ba3f1df | ||
![]() |
92f1941fb0 | ||
![]() |
e68125eb6a | ||
![]() |
4f1c3547bf | ||
![]() |
e102ac2b58 | ||
![]() |
a536484408 | ||
![]() |
63dca5bb86 | ||
![]() |
bc7ecf330b | ||
![]() |
703c25a6e2 | ||
![]() |
d4e00de1fd | ||
![]() |
0c36248073 | ||
![]() |
08e4489ede | ||
![]() |
76801ff564 | ||
![]() |
c4ccfec316 | ||
![]() |
1ac9244e68 | ||
![]() |
7e837dfee2 | ||
![]() |
21185227ad | ||
![]() |
b3e29dc11b | ||
![]() |
9f6fc5a074 | ||
![]() |
f2d3ac1e7b | ||
![]() |
edad740e15 | ||
![]() |
8265e53128 | ||
![]() |
d316b05fa1 | ||
![]() |
3000f0208f | ||
![]() |
e49c95c220 | ||
![]() |
47c5abb8a5 | ||
![]() |
be9b349e51 | ||
![]() |
b22ae106b2 | ||
![]() |
7fe4a2ce6c | ||
![]() |
8102ba4d52 | ||
![]() |
dd5bfb3b24 | ||
![]() |
18defaae6d | ||
![]() |
a2702e4058 | ||
![]() |
e6e463092c | ||
![]() |
128c69aa76 | ||
![]() |
17fd681bdb | ||
![]() |
3e4193e3d5 | ||
![]() |
da40dbf1dd | ||
![]() |
01350467bd | ||
![]() |
6b1d568172 | ||
![]() |
d220720dde | ||
![]() |
e852156b9f | ||
![]() |
b7f864cdb0 | ||
![]() |
1f8accd6e0 | ||
![]() |
8205e3619a | ||
![]() |
7f33ae0f40 | ||
![]() |
13aa3265e3 | ||
![]() |
3b0687e557 | ||
![]() |
273941a9fe | ||
![]() |
718811be9c | ||
![]() |
8d9cb09261 | ||
![]() |
196d88559c | ||
![]() |
357da0ca28 | ||
![]() |
9b411fa8d4 | ||
![]() |
087a5748c8 | ||
![]() |
6105185d05 | ||
![]() |
c993a817d1 | ||
![]() |
002aa29f19 | ||
![]() |
07de090723 | ||
![]() |
3809732e48 | ||
![]() |
eb4a6fd2ed | ||
![]() |
3357844a1f | ||
![]() |
0d8fe3b626 | ||
![]() |
5df988d2ac | ||
![]() |
e9ef277929 | ||
![]() |
2dcdcba227 | ||
![]() |
5b6c5dff0a | ||
![]() |
7fa887b644 | ||
![]() |
5c6b2cf490 | ||
![]() |
e0930b5cbb | ||
![]() |
2a3d03254d | ||
![]() |
e570863801 | ||
![]() |
866d9416b4 | ||
![]() |
e048085b5a | ||
![]() |
9ed2f4b2d3 | ||
![]() |
c2eb2184fc | ||
![]() |
a2e3b4ca06 | ||
![]() |
909ad02a18 | ||
![]() |
4a930d2b5b | ||
![]() |
4a19103891 | ||
![]() |
bb0c45b090 | ||
![]() |
d0583f9947 | ||
![]() |
12bd301401 | ||
![]() |
a14637b416 | ||
![]() |
5d1ac22fd1 | ||
![]() |
3ccfea84b8 | ||
![]() |
38beca11fd | ||
![]() |
3555577581 | ||
![]() |
e852596862 | ||
![]() |
f15fde26f9 | ||
![]() |
73c426f8be | ||
![]() |
8f40c1a77f | ||
![]() |
0d00e88580 | ||
![]() |
8792e0a978 | ||
![]() |
e27e56f7bf | ||
![]() |
6b7e1225dd | ||
![]() |
0051620840 | ||
![]() |
63f9d3e0b4 | ||
![]() |
90b1111382 | ||
![]() |
0aa526d707 | ||
![]() |
4daef2591d | ||
![]() |
2d91aa0b06 | ||
![]() |
2fd6de0af5 | ||
![]() |
799af4e550 | ||
![]() |
b8e0bcee5b | ||
![]() |
3567308a22 | ||
![]() |
aca0bebaf4 | ||
![]() |
4ee4555cbd | ||
![]() |
253adcb0eb | ||
![]() |
585609b907 | ||
![]() |
1d8332d61e | ||
![]() |
3f95c78428 | ||
![]() |
8e95c4db55 | ||
![]() |
f476a7566c | ||
![]() |
4304fba0f5 | ||
![]() |
07bd9825a1 | ||
![]() |
69c7cb9f6f | ||
![]() |
fd473af5b0 | ||
![]() |
d1f02f6bed | ||
![]() |
c5cc9dbffa | ||
![]() |
43e183b658 | ||
![]() |
153f319666 | ||
![]() |
3b8e6ecc42 | ||
![]() |
29ec8cbd0a | ||
![]() |
3072604070 | ||
![]() |
562d10809c | ||
![]() |
c7d41cd963 | ||
![]() |
c00bf26c77 | ||
![]() |
a2f54f7da4 | ||
![]() |
12bf139708 | ||
![]() |
dbb69ad7cd | ||
![]() |
b78f16ef19 | ||
![]() |
223f339682 | ||
![]() |
3f556fa3fc | ||
![]() |
16db0c039f | ||
![]() |
94874ddbbe | ||
![]() |
ea86697973 | ||
![]() |
fa1605e7e7 | ||
![]() |
46346d2a51 | ||
![]() |
830a58cebd | ||
![]() |
0edef7b3cb | ||
![]() |
64757670fc | ||
![]() |
edac77de74 | ||
![]() |
63e3b1af52 | ||
![]() |
f6fa88e5ff | ||
![]() |
78587e11c7 | ||
![]() |
784d06f0ae | ||
![]() |
6846c8f2ed | ||
![]() |
cfa4501793 | ||
![]() |
16f1dccd22 | ||
![]() |
3278899787 | ||
![]() |
cdbee64086 | ||
![]() |
90e134cb26 | ||
![]() |
725b618111 | ||
![]() |
f135a3a5e7 | ||
![]() |
8f8e4806a9 | ||
![]() |
100123b43e | ||
![]() |
45a5424ebf | ||
![]() |
be37f2c576 | ||
![]() |
26ed819664 | ||
![]() |
f907ac30c6 | ||
![]() |
60be7012aa | ||
![]() |
002d493035 | ||
![]() |
a41d6cfef1 | ||
![]() |
ecfa149efc | ||
![]() |
be1270d070 | ||
![]() |
75ee4b7709 | ||
![]() |
d5b1028732 | ||
![]() |
6c0be03e62 | ||
![]() |
7ddea1270f | ||
![]() |
97578c2d3d | ||
![]() |
64806ed169 | ||
![]() |
a14c3bcc89 | ||
![]() |
1699a23ff0 | ||
![]() |
268c3fdbd8 | ||
![]() |
7689e03739 | ||
![]() |
d875540b3a | ||
![]() |
16aa9a310c | ||
![]() |
d0a008566e | ||
![]() |
d6c1a59bd4 | ||
![]() |
07117b4c8a | ||
![]() |
46d20c9968 | ||
![]() |
de1b2c31a1 | ||
![]() |
1f9cbe218f | ||
![]() |
b914f48a91 | ||
![]() |
de89355a49 | ||
![]() |
6502036be9 | ||
![]() |
f86da19362 | ||
![]() |
b04e150dc1 | ||
![]() |
1c0c374c29 | ||
![]() |
fcda3dc8c6 | ||
![]() |
d370dd43b1 | ||
![]() |
c90d7b8395 | ||
![]() |
4feb2e639b | ||
![]() |
37ba7af6f6 | ||
![]() |
10fb85663f | ||
![]() |
33287a63ad | ||
![]() |
3134a87e72 | ||
![]() |
d68b59a390 | ||
![]() |
447263ecc2 | ||
![]() |
08a7f662ea | ||
![]() |
007fb5deb9 | ||
![]() |
6422175ef2 | ||
![]() |
32ca0b97fc | ||
![]() |
244b161032 | ||
![]() |
75a6fb1d91 | ||
![]() |
32c2aecc62 | ||
![]() |
b0ef0de032 | ||
![]() |
92692653a7 | ||
![]() |
77ba19cd04 | ||
![]() |
5b43460ea4 | ||
![]() |
579f1f9dc1 | ||
![]() |
de4ad764ce | ||
![]() |
33444466f3 | ||
![]() |
73888eafe1 | ||
![]() |
cd3d560e8d | ||
![]() |
c0497d3413 | ||
![]() |
648f779e2c | ||
![]() |
b1915132d5 | ||
![]() |
e6d80c60fb | ||
![]() |
05f59f6ed2 | ||
![]() |
8f457815e9 | ||
![]() |
233944bf24 | ||
![]() |
424d988f93 | ||
![]() |
3926594c6a | ||
![]() |
5f84344c3c | ||
![]() |
01082f86b7 | ||
![]() |
9fa681f5a8 | ||
![]() |
36b6733c4f | ||
![]() |
2c195c73a9 | ||
![]() |
1dd05ffbb1 | ||
![]() |
4884b01b8a | ||
![]() |
46136b5632 | ||
![]() |
ae29dd124c | ||
![]() |
703460ea95 | ||
![]() |
b7c889bb70 | ||
![]() |
12bbbcaff0 | ||
![]() |
b156c1ab25 | ||
![]() |
358d855c88 | ||
![]() |
1059dd389f | ||
![]() |
f1bcf89723 | ||
![]() |
099a239207 | ||
![]() |
821076ba9c | ||
![]() |
60dd27671b | ||
![]() |
0b0d901b7f | ||
![]() |
7fec51f322 | ||
![]() |
1659ace65d | ||
![]() |
3340608689 | ||
![]() |
5ccdb6f213 | ||
![]() |
0981b66a5f | ||
![]() |
3ddcc2d4ea | ||
![]() |
6005479918 | ||
![]() |
19e049642b | ||
![]() |
b8e6672e60 | ||
![]() |
dbeb0a4720 | ||
![]() |
a43cd55c53 | ||
![]() |
b67dee1eed | ||
![]() |
be6b3176f4 | ||
![]() |
aef29affa3 | ||
![]() |
70d236244f | ||
![]() |
171a2019ec | ||
![]() |
70df6bbbca | ||
![]() |
5807d521b7 | ||
![]() |
67e482ff97 | ||
![]() |
2b2bbe35d0 | ||
![]() |
8862d63377 | ||
![]() |
fc7427536c | ||
![]() |
0cb365cf31 | ||
![]() |
49a0d0d9bf | ||
![]() |
3602191f69 | ||
![]() |
5935e277e6 | ||
![]() |
0ce33cb160 | ||
![]() |
d945030803 | ||
![]() |
60a484f1e4 | ||
![]() |
c8fc989237 | ||
![]() |
392ebd0af4 | ||
![]() |
cabcf1e270 | ||
![]() |
af7364bdf9 | ||
![]() |
14e1e6368a | ||
![]() |
f1aa6fff9c | ||
![]() |
d11bfaa6c4 | ||
![]() |
25cd86feec | ||
![]() |
062176d8d0 | ||
![]() |
a344d88020 | ||
![]() |
30b180d77b | ||
![]() |
00423ed152 | ||
![]() |
48ff3b2c11 | ||
![]() |
eee0d4bf31 | ||
![]() |
e047755a21 | ||
![]() |
b30d609d19 | ||
![]() |
8ad056b8a2 | ||
![]() |
c1cb171071 | ||
![]() |
17959f648a | ||
![]() |
c3d9aa791a | ||
![]() |
f846e7719e | ||
![]() |
f25c215f6a | ||
![]() |
2640120be8 | ||
![]() |
b55014617e | ||
![]() |
42589a0034 | ||
![]() |
8691874dbb | ||
![]() |
82c405289d | ||
![]() |
191ea24e29 | ||
![]() |
72a6fad1db | ||
![]() |
a2a99485f9 | ||
![]() |
969e2c1ff1 | ||
![]() |
7d0faa3fed | ||
![]() |
4256177531 | ||
![]() |
327530fb9d | ||
![]() |
db92b5a219 | ||
![]() |
55be75c974 | ||
![]() |
47a6ce4342 | ||
![]() |
3ecb841c1a | ||
![]() |
1d2450245e | ||
![]() |
f6c4c9260f | ||
![]() |
f354d68350 | ||
![]() |
bea76aa682 | ||
![]() |
6d4b27aacb | ||
![]() |
e008b7dae7 | ||
![]() |
96a3991c56 | ||
![]() |
8d1d691bc3 | ||
![]() |
e07608209b | ||
![]() |
50cdb74d54 | ||
![]() |
edc091f4d4 | ||
![]() |
e0448a7b7b | ||
![]() |
0f02f5ff34 | ||
![]() |
b2111adef5 | ||
![]() |
442da6c4a2 | ||
![]() |
f715863540 | ||
![]() |
ed7dbb100d | ||
![]() |
52fdea0419 | ||
![]() |
b7c72cb38a | ||
![]() |
5cc20b5e44 | ||
![]() |
ce9a9db33a | ||
![]() |
31e19a0434 | ||
![]() |
16968eb38c | ||
![]() |
5c46b98eee | ||
![]() |
ba46747cb0 | ||
![]() |
140645b760 | ||
![]() |
0dcca35ec2 | ||
![]() |
c7eaee037e | ||
![]() |
fa201ad9ad | ||
![]() |
832e3f5d49 | ||
![]() |
6a1a38b395 | ||
![]() |
6261fce91f | ||
![]() |
e8f655439d | ||
![]() |
c11093fa71 | ||
![]() |
af7282511a | ||
![]() |
58b6cf0174 | ||
![]() |
7abcb61afb | ||
![]() |
ff5240c0bc | ||
![]() |
4e3d935acf | ||
![]() |
3fad11e104 | ||
![]() |
aab7631a9f | ||
![]() |
38ee1724a8 | ||
![]() |
0c7e2e2364 | ||
![]() |
f693084065 | ||
![]() |
a5ecc7a06d | ||
![]() |
565f1543c6 | ||
![]() |
0d8016d926 | ||
![]() |
a599e33ec2 | ||
![]() |
36c84b3fec | ||
![]() |
9cca389031 | ||
![]() |
e965507470 | ||
![]() |
65fd3a3193 | ||
![]() |
3bbd8fe4c9 | ||
![]() |
beb308c5b3 | ||
![]() |
526d2a61f8 | ||
![]() |
8ab00442ea | ||
![]() |
cba803abaf | ||
![]() |
54a09ead95 | ||
![]() |
c2ea23f01f | ||
![]() |
ff6188bd80 | ||
![]() |
dc1b2a6873 | ||
![]() |
d732a146c2 | ||
![]() |
b9bc518a0a | ||
![]() |
edf32911be | ||
![]() |
b8470a471b | ||
![]() |
45880395ea | ||
![]() |
6f3c9205cd | ||
![]() |
96c90b24d1 | ||
![]() |
aa4bfa0727 | ||
![]() |
8873ffca12 | ||
![]() |
0bda748ad9 | ||
![]() |
867686fe34 | ||
![]() |
60f92dcdbc | ||
![]() |
4fe2f31301 | ||
![]() |
6871ad09e6 | ||
![]() |
479188bc40 | ||
![]() |
c3c7ccd78a | ||
![]() |
000b432bb2 | ||
![]() |
dacd2cbc30 | ||
![]() |
65a08efa00 | ||
![]() |
60266289e0 | ||
![]() |
3145758411 | ||
![]() |
d7948a845d | ||
![]() |
aff69e583e | ||
![]() |
e7f7b6ad68 | ||
![]() |
b5e58f4076 | ||
![]() |
fd0f51926e | ||
![]() |
733d6fe6eb | ||
![]() |
b2509c82b8 | ||
![]() |
bffbf87cb3 | ||
![]() |
63890cc2fd | ||
![]() |
9ade49b39c | ||
![]() |
6d49cd6859 | ||
![]() |
5eb116059b | ||
![]() |
bcdd1c56bf | ||
![]() |
cbcd2cce9b | ||
![]() |
94c3d7fb60 | ||
![]() |
a2db4a464a | ||
![]() |
fe7da97c5c | ||
![]() |
c294a0a9ac | ||
![]() |
30fe363b57 | ||
![]() |
4ec57836d8 | ||
![]() |
5b7ba838f1 | ||
![]() |
ac99eb59d2 | ||
![]() |
1be09df9d4 | ||
![]() |
38b3a2080b | ||
![]() |
0fec0ef624 | ||
![]() |
f0d6789722 | ||
![]() |
7ef61d58fd | ||
![]() |
96ae4a5967 | ||
![]() |
bca645f63d | ||
![]() |
a8105f084e | ||
![]() |
e86f09aaed | ||
![]() |
692a7471c1 | ||
![]() |
480645d22f | ||
![]() |
784a853ec7 | ||
![]() |
088fc392ab | ||
![]() |
0d7644c782 | ||
![]() |
f15d24b4e8 | ||
![]() |
510549f365 | ||
![]() |
99313fe162 | ||
![]() |
f9df193b7b | ||
![]() |
113a400952 | ||
![]() |
b6983e4b21 | ||
![]() |
fc400ea57b | ||
![]() |
068a74adeb | ||
![]() |
1a8743ec11 | ||
![]() |
9925b9b455 | ||
![]() |
4c43bae92d | ||
![]() |
659db9f04b | ||
![]() |
b88d1dfaa9 | ||
![]() |
7c79bbd6b0 | ||
![]() |
ce6bfcb7f5 | ||
![]() |
6ce543e118 | ||
![]() |
cd9bf03fb7 | ||
![]() |
1d88ac43cf | ||
![]() |
6102285577 | ||
![]() |
b83603488c | ||
![]() |
cf22e30237 | ||
![]() |
f01971b67c | ||
![]() |
c62be1bb45 | ||
![]() |
cf1880343b | ||
![]() |
0c57433567 | ||
![]() |
5ef0527ebc | ||
![]() |
53ef5c51cc | ||
![]() |
58c7934dd8 | ||
![]() |
0a626917f8 | ||
![]() |
922bb1452f | ||
![]() |
1cda37659e | ||
![]() |
fe2e46fe60 | ||
![]() |
7765afa7da | ||
![]() |
55d7e9ec61 | ||
![]() |
6a4ad8af06 | ||
![]() |
018440354f | ||
![]() |
6d2904cff1 | ||
![]() |
55fac29b3e | ||
![]() |
5e966d60b0 | ||
![]() |
c08f927d60 | ||
![]() |
49a197eaa8 | ||
![]() |
3abe7cfc45 | ||
![]() |
8c31db6352 | ||
![]() |
91eb824c21 | ||
![]() |
00e66c48b8 | ||
![]() |
589f90762a | ||
![]() |
f256a57f27 | ||
![]() |
1102bf271d | ||
![]() |
b561d5ad9a | ||
![]() |
a5cb58ca96 | ||
![]() |
0af77a3c2c | ||
![]() |
a75d14f5d0 | ||
![]() |
bca39e8081 | ||
![]() |
3e3519e8ec | ||
![]() |
566150977a | ||
![]() |
0ff3ba30b7 | ||
![]() |
43885e6d0b | ||
![]() |
577f0ca562 | ||
![]() |
56d339b8f0 | ||
![]() |
bd1e7a7c13 | ||
![]() |
5f41b65af1 | ||
![]() |
3c90894e38 | ||
![]() |
0dbebe953b | ||
![]() |
16c12a42c7 | ||
![]() |
136f1c50e7 | ||
![]() |
043729f557 | ||
![]() |
75f1f9228d | ||
![]() |
38d9c6d26b | ||
![]() |
afd7cf51cf | ||
![]() |
c41594d220 | ||
![]() |
fedbd48c0f | ||
![]() |
271b779995 | ||
![]() |
52b33f6f47 | ||
![]() |
5aee43d05b | ||
![]() |
7b29a380fc | ||
![]() |
997c23befa | ||
![]() |
fcd983d915 | ||
![]() |
24d43849a0 | ||
![]() |
4ce26296d6 | ||
![]() |
4342759da7 | ||
![]() |
25f2d224f1 | ||
![]() |
8b8b828cd1 | ||
![]() |
65dabeaf15 | ||
![]() |
0480339272 | ||
![]() |
b09cdc0a18 | ||
![]() |
c3b86b687c | ||
![]() |
0abb4f8c6f | ||
![]() |
697ac18872 | ||
![]() |
fc229cf274 | ||
![]() |
b48136d994 | ||
![]() |
77ba7c987a | ||
![]() |
84f3baf013 | ||
![]() |
795baedbb1 | ||
![]() |
5469a7eb71 | ||
![]() |
23fc7c2c96 | ||
![]() |
dff404a8c9 | ||
![]() |
146364aa67 | ||
![]() |
258dbf30e0 | ||
![]() |
44b93c039a | ||
![]() |
4d5313699e | ||
![]() |
cd198290d7 | ||
![]() |
60ed7d3273 | ||
![]() |
9bcfba6620 | ||
![]() |
7ea3c64268 | ||
![]() |
2b6a34e9e0 | ||
![]() |
458b90c78d | ||
![]() |
dd284c0986 | ||
![]() |
21539dfb6a | ||
![]() |
91785b8284 | ||
![]() |
f202770b70 | ||
![]() |
8186a54962 | ||
![]() |
866909b803 | ||
![]() |
408910e6e8 | ||
![]() |
24c8e575f4 | ||
![]() |
8d0ca2c876 | ||
![]() |
fc96ebefd4 | ||
![]() |
394330175f | ||
![]() |
f946c3da06 | ||
![]() |
156fbd1958 | ||
![]() |
7dd0d126e2 | ||
![]() |
205360c109 | ||
![]() |
984a0e6d06 | ||
![]() |
eb63568ceb | ||
![]() |
cc6f896b69 | ||
![]() |
83e47a7216 | ||
![]() |
1d64549cce | ||
![]() |
d0c36c0de3 | ||
![]() |
341db13279 | ||
![]() |
1c8e13b9c1 | ||
![]() |
49c5f3bb9c | ||
![]() |
4ae361bd1f | ||
![]() |
6502496a2c | ||
![]() |
8678ceeb3c | ||
![]() |
9cb62f4d2e | ||
![]() |
6c0ef54e18 | ||
![]() |
fd731c5ccd | ||
![]() |
cbe9490dc0 | ||
![]() |
82054bfabc | ||
![]() |
963dd75c39 | ||
![]() |
1c24617f98 | ||
![]() |
1559c2ca21 | ||
![]() |
6141722b1f | ||
![]() |
222d8eed4e | ||
![]() |
718d52a72c | ||
![]() |
fe1a06271a | ||
![]() |
bd2370555b | ||
![]() |
86c9ee4e90 | ||
![]() |
b26bcf1343 | ||
![]() |
5d5c6275f9 | ||
![]() |
9c1a47d1fc | ||
![]() |
13852b7f4e | ||
![]() |
4fd7a88a15 | ||
![]() |
5c2a6b5eb1 | ||
![]() |
9cbebbb8a0 | ||
![]() |
e26d987c4e | ||
![]() |
53669efaf8 | ||
![]() |
b68f45ef59 | ||
![]() |
8f44de651b | ||
![]() |
2ede244da0 | ||
![]() |
77a181978e | ||
![]() |
170bbce0d3 | ||
![]() |
fc99d9be41 | ||
![]() |
9fb9bed806 | ||
![]() |
01b2f80a95 | ||
![]() |
da7ff777d1 | ||
![]() |
8d48f8d8b0 | ||
![]() |
b4618f9ba1 | ||
![]() |
2c5d83fab3 |
30
.build/common.ts
Normal file
30
.build/common.ts
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
/**
|
||||||
|
* Shared common options for both ESBuild and Vite
|
||||||
|
*/
|
||||||
|
export const packageOptions = {
|
||||||
|
parser: {
|
||||||
|
name: 'mermaid-parser',
|
||||||
|
packageName: 'parser',
|
||||||
|
file: 'index.ts',
|
||||||
|
},
|
||||||
|
mermaid: {
|
||||||
|
name: 'mermaid',
|
||||||
|
packageName: 'mermaid',
|
||||||
|
file: 'mermaid.ts',
|
||||||
|
},
|
||||||
|
'mermaid-example-diagram': {
|
||||||
|
name: 'mermaid-example-diagram',
|
||||||
|
packageName: 'mermaid-example-diagram',
|
||||||
|
file: 'detector.ts',
|
||||||
|
},
|
||||||
|
'mermaid-zenuml': {
|
||||||
|
name: 'mermaid-zenuml',
|
||||||
|
packageName: 'mermaid-zenuml',
|
||||||
|
file: 'detector.ts',
|
||||||
|
},
|
||||||
|
'mermaid-layout-elk': {
|
||||||
|
name: 'mermaid-layout-elk',
|
||||||
|
packageName: 'mermaid-layout-elk',
|
||||||
|
file: 'layouts.ts',
|
||||||
|
},
|
||||||
|
} as const;
|
5
.build/generateLangium.ts
Normal file
5
.build/generateLangium.ts
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
import { generate } from 'langium-cli';
|
||||||
|
|
||||||
|
export async function generateLangium() {
|
||||||
|
await generate({ file: `./packages/parser/langium-config.json` });
|
||||||
|
}
|
@@ -1,6 +1,7 @@
|
|||||||
import jison from 'jison';
|
import jison from 'jison';
|
||||||
|
|
||||||
export const transformJison = (src: string): string => {
|
export const transformJison = (src: string): string => {
|
||||||
|
// @ts-ignore - Jison is not typed properly
|
||||||
const parser = new jison.Generator(src, {
|
const parser = new jison.Generator(src, {
|
||||||
moduleType: 'js',
|
moduleType: 'js',
|
||||||
'token-stack': true,
|
'token-stack': true,
|
124
.build/jsonSchema.ts
Normal file
124
.build/jsonSchema.ts
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
import { load, JSON_SCHEMA } from 'js-yaml';
|
||||||
|
import assert from 'node:assert';
|
||||||
|
import Ajv2019, { type JSONSchemaType } from 'ajv/dist/2019.js';
|
||||||
|
import type { MermaidConfig, BaseDiagramConfig } from '../packages/mermaid/src/config.type.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* All of the keys in the mermaid config that have a mermaid diagram config.
|
||||||
|
*/
|
||||||
|
const MERMAID_CONFIG_DIAGRAM_KEYS = [
|
||||||
|
'flowchart',
|
||||||
|
'sequence',
|
||||||
|
'gantt',
|
||||||
|
'journey',
|
||||||
|
'class',
|
||||||
|
'state',
|
||||||
|
'er',
|
||||||
|
'pie',
|
||||||
|
'quadrantChart',
|
||||||
|
'xyChart',
|
||||||
|
'requirement',
|
||||||
|
'mindmap',
|
||||||
|
'timeline',
|
||||||
|
'gitGraph',
|
||||||
|
'c4',
|
||||||
|
'sankey',
|
||||||
|
'block',
|
||||||
|
'packet',
|
||||||
|
] as const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate default values from the JSON Schema.
|
||||||
|
*
|
||||||
|
* AJV does not support nested default values yet (or default values with $ref),
|
||||||
|
* so we need to manually find them (this may be fixed in ajv v9).
|
||||||
|
*
|
||||||
|
* @param mermaidConfigSchema - The Mermaid JSON Schema to use.
|
||||||
|
* @returns The default mermaid config object.
|
||||||
|
*/
|
||||||
|
function generateDefaults(mermaidConfigSchema: JSONSchemaType<MermaidConfig>) {
|
||||||
|
const ajv = new Ajv2019({
|
||||||
|
useDefaults: true,
|
||||||
|
allowUnionTypes: true,
|
||||||
|
strict: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
ajv.addKeyword({
|
||||||
|
keyword: 'meta:enum', // used by jsonschema2md
|
||||||
|
errors: false,
|
||||||
|
});
|
||||||
|
ajv.addKeyword({
|
||||||
|
keyword: 'tsType', // used by json-schema-to-typescript
|
||||||
|
errors: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
// ajv currently doesn't support nested default values, see https://github.com/ajv-validator/ajv/issues/1718
|
||||||
|
// (may be fixed in v9) so we need to manually use sub-schemas
|
||||||
|
const mermaidDefaultConfig = {};
|
||||||
|
|
||||||
|
assert.ok(mermaidConfigSchema.$defs);
|
||||||
|
const baseDiagramConfig = mermaidConfigSchema.$defs.BaseDiagramConfig;
|
||||||
|
|
||||||
|
for (const key of MERMAID_CONFIG_DIAGRAM_KEYS) {
|
||||||
|
const subSchemaRef = mermaidConfigSchema.properties[key].$ref;
|
||||||
|
const [root, defs, defName] = subSchemaRef.split('/');
|
||||||
|
assert.strictEqual(root, '#');
|
||||||
|
assert.strictEqual(defs, '$defs');
|
||||||
|
const subSchema = {
|
||||||
|
$schema: mermaidConfigSchema.$schema,
|
||||||
|
$defs: mermaidConfigSchema.$defs,
|
||||||
|
...mermaidConfigSchema.$defs[defName],
|
||||||
|
} as JSONSchemaType<BaseDiagramConfig>;
|
||||||
|
|
||||||
|
const validate = ajv.compile(subSchema);
|
||||||
|
|
||||||
|
mermaidDefaultConfig[key] = {};
|
||||||
|
|
||||||
|
for (const required of subSchema.required ?? []) {
|
||||||
|
if (subSchema.properties[required] === undefined && baseDiagramConfig.properties[required]) {
|
||||||
|
mermaidDefaultConfig[key][required] = baseDiagramConfig.properties[required].default;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!validate(mermaidDefaultConfig[key])) {
|
||||||
|
throw new Error(
|
||||||
|
`schema for subconfig ${key} does not have valid defaults! Errors were ${JSON.stringify(
|
||||||
|
validate.errors,
|
||||||
|
undefined,
|
||||||
|
2
|
||||||
|
)}`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const validate = ajv.compile(mermaidConfigSchema);
|
||||||
|
|
||||||
|
if (!validate(mermaidDefaultConfig)) {
|
||||||
|
throw new Error(
|
||||||
|
`Mermaid config JSON Schema does not have valid defaults! Errors were ${JSON.stringify(
|
||||||
|
validate.errors,
|
||||||
|
undefined,
|
||||||
|
2
|
||||||
|
)}`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return mermaidDefaultConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const loadSchema = (src: string, filename: string): JSONSchemaType<MermaidConfig> => {
|
||||||
|
const jsonSchema = load(src, {
|
||||||
|
filename,
|
||||||
|
// only allow JSON types in our YAML doc (will probably be default in YAML 1.3)
|
||||||
|
// e.g. `true` will be parsed a boolean `true`, `True` will be parsed as string `"True"`.
|
||||||
|
schema: JSON_SCHEMA,
|
||||||
|
}) as JSONSchemaType<MermaidConfig>;
|
||||||
|
return jsonSchema;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getDefaults = (schema: JSONSchemaType<MermaidConfig>) => {
|
||||||
|
return `export default ${JSON.stringify(generateDefaults(schema), undefined, 2)};`;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getSchema = (schema: JSONSchemaType<MermaidConfig>) => {
|
||||||
|
return `export default ${JSON.stringify(schema, undefined, 2)};`;
|
||||||
|
};
|
25
.build/types.ts
Normal file
25
.build/types.ts
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
/* eslint-disable no-console */
|
||||||
|
import { packageOptions } from './common.js';
|
||||||
|
import { execSync } from 'child_process';
|
||||||
|
|
||||||
|
const buildType = (packageName: string) => {
|
||||||
|
console.log(`Building types for ${packageName}`);
|
||||||
|
try {
|
||||||
|
const out = execSync(`tsc -p ./packages/${packageName}/tsconfig.json --emitDeclarationOnly`);
|
||||||
|
if (out.length > 0) {
|
||||||
|
console.log(out.toString());
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
if (e.stdout.length > 0) {
|
||||||
|
console.error(e.stdout.toString());
|
||||||
|
}
|
||||||
|
if (e.stderr.length > 0) {
|
||||||
|
console.error(e.stderr.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
for (const { packageName } of Object.values(packageOptions)) {
|
||||||
|
buildType(packageName);
|
||||||
|
}
|
@@ -1,3 +0,0 @@
|
|||||||
{
|
|
||||||
"extends": ["@commitlint/config-conventional"]
|
|
||||||
}
|
|
@@ -13,6 +13,7 @@ bqstring
|
|||||||
BQUOTE
|
BQUOTE
|
||||||
bramp
|
bramp
|
||||||
BRKT
|
BRKT
|
||||||
|
brotli
|
||||||
callbackargs
|
callbackargs
|
||||||
callbackname
|
callbackname
|
||||||
classdef
|
classdef
|
||||||
@@ -27,6 +28,7 @@ controly
|
|||||||
CSSCLASS
|
CSSCLASS
|
||||||
CYLINDEREND
|
CYLINDEREND
|
||||||
CYLINDERSTART
|
CYLINDERSTART
|
||||||
|
DAGA
|
||||||
datakey
|
datakey
|
||||||
DEND
|
DEND
|
||||||
descr
|
descr
|
||||||
@@ -53,6 +55,7 @@ GENERICTYPE
|
|||||||
getBoundarys
|
getBoundarys
|
||||||
grammr
|
grammr
|
||||||
graphtype
|
graphtype
|
||||||
|
iife
|
||||||
interp
|
interp
|
||||||
introdcued
|
introdcued
|
||||||
INVTRAPEND
|
INVTRAPEND
|
||||||
@@ -74,11 +77,13 @@ loglevel
|
|||||||
LOGMSG
|
LOGMSG
|
||||||
lookaheads
|
lookaheads
|
||||||
mdast
|
mdast
|
||||||
|
metafile
|
||||||
minlen
|
minlen
|
||||||
Mstartx
|
Mstartx
|
||||||
MULT
|
MULT
|
||||||
NODIR
|
NODIR
|
||||||
NSTR
|
NSTR
|
||||||
|
outdir
|
||||||
Qcontrolx
|
Qcontrolx
|
||||||
reinit
|
reinit
|
||||||
rels
|
rels
|
||||||
@@ -86,6 +91,7 @@ reqs
|
|||||||
rewritelinks
|
rewritelinks
|
||||||
rgba
|
rgba
|
||||||
RIGHTOF
|
RIGHTOF
|
||||||
|
roughjs
|
||||||
sankey
|
sankey
|
||||||
sequencenumber
|
sequencenumber
|
||||||
shrc
|
shrc
|
||||||
@@ -105,9 +111,11 @@ strikethrough
|
|||||||
stringifying
|
stringifying
|
||||||
struct
|
struct
|
||||||
STYLECLASS
|
STYLECLASS
|
||||||
|
STYLEDEF
|
||||||
STYLEOPTS
|
STYLEOPTS
|
||||||
subcomponent
|
subcomponent
|
||||||
subcomponents
|
subcomponents
|
||||||
|
subconfig
|
||||||
SUBROUTINEEND
|
SUBROUTINEEND
|
||||||
SUBROUTINESTART
|
SUBROUTINESTART
|
||||||
Subschemas
|
Subschemas
|
||||||
@@ -122,6 +130,7 @@ titlevalue
|
|||||||
topbar
|
topbar
|
||||||
TRAPEND
|
TRAPEND
|
||||||
TRAPSTART
|
TRAPSTART
|
||||||
|
treemap
|
||||||
ts-nocheck
|
ts-nocheck
|
||||||
tsdoc
|
tsdoc
|
||||||
typeof
|
typeof
|
||||||
|
@@ -4,5 +4,6 @@ cpettitt
|
|||||||
Dong Cai
|
Dong Cai
|
||||||
Nikolay Rozhkov
|
Nikolay Rozhkov
|
||||||
Peng Xiao
|
Peng Xiao
|
||||||
|
Per Brolin
|
||||||
subhash-halder
|
subhash-halder
|
||||||
Vinod Sidharth
|
Vinod Sidharth
|
||||||
|
@@ -36,6 +36,7 @@ jsfiddle
|
|||||||
jsonschema
|
jsonschema
|
||||||
katex
|
katex
|
||||||
khroma
|
khroma
|
||||||
|
langium
|
||||||
mathml
|
mathml
|
||||||
matplotlib
|
matplotlib
|
||||||
mdbook
|
mdbook
|
||||||
@@ -53,13 +54,16 @@ presetAttributify
|
|||||||
pyplot
|
pyplot
|
||||||
redmine
|
redmine
|
||||||
rehype
|
rehype
|
||||||
|
roughjs
|
||||||
rscratch
|
rscratch
|
||||||
|
shiki
|
||||||
sparkline
|
sparkline
|
||||||
sphinxcontrib
|
sphinxcontrib
|
||||||
ssim
|
ssim
|
||||||
stylis
|
stylis
|
||||||
Swimm
|
Swimm
|
||||||
tsbuildinfo
|
tsbuildinfo
|
||||||
|
tseslint
|
||||||
Tuleap
|
Tuleap
|
||||||
Typora
|
Typora
|
||||||
unocss
|
unocss
|
||||||
|
@@ -9,6 +9,7 @@ elems
|
|||||||
gantt
|
gantt
|
||||||
gitgraph
|
gitgraph
|
||||||
gzipped
|
gzipped
|
||||||
|
handdrawn
|
||||||
knsv
|
knsv
|
||||||
Knut
|
Knut
|
||||||
marginx
|
marginx
|
||||||
@@ -17,6 +18,7 @@ Markdownish
|
|||||||
mermaidjs
|
mermaidjs
|
||||||
mindmap
|
mindmap
|
||||||
mindmaps
|
mindmaps
|
||||||
|
mrtree
|
||||||
multigraph
|
multigraph
|
||||||
nodesep
|
nodesep
|
||||||
NOTEGROUP
|
NOTEGROUP
|
||||||
|
@@ -1 +1,6 @@
|
|||||||
|
BRANDES
|
||||||
|
circo
|
||||||
|
handdrawn
|
||||||
|
KOEPF
|
||||||
|
neato
|
||||||
newbranch
|
newbranch
|
||||||
|
67
.esbuild/build.ts
Normal file
67
.esbuild/build.ts
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
import { build } from 'esbuild';
|
||||||
|
import { mkdir, writeFile } from 'node:fs/promises';
|
||||||
|
import { packageOptions } from '../.build/common.js';
|
||||||
|
import { generateLangium } from '../.build/generateLangium.js';
|
||||||
|
import type { MermaidBuildOptions } from './util.js';
|
||||||
|
import { defaultOptions, getBuildConfig } from './util.js';
|
||||||
|
|
||||||
|
const shouldVisualize = process.argv.includes('--visualize');
|
||||||
|
|
||||||
|
const buildPackage = async (entryName: keyof typeof packageOptions) => {
|
||||||
|
const commonOptions: MermaidBuildOptions = { ...defaultOptions, entryName } as const;
|
||||||
|
const buildConfigs: MermaidBuildOptions[] = [
|
||||||
|
// package.mjs
|
||||||
|
{ ...commonOptions },
|
||||||
|
// package.min.mjs
|
||||||
|
{
|
||||||
|
...commonOptions,
|
||||||
|
minify: true,
|
||||||
|
metafile: shouldVisualize,
|
||||||
|
},
|
||||||
|
// package.core.mjs
|
||||||
|
{ ...commonOptions, core: true },
|
||||||
|
];
|
||||||
|
|
||||||
|
if (entryName === 'mermaid') {
|
||||||
|
const iifeOptions: MermaidBuildOptions = { ...commonOptions, format: 'iife' };
|
||||||
|
buildConfigs.push(
|
||||||
|
// mermaid.js
|
||||||
|
{ ...iifeOptions },
|
||||||
|
// mermaid.min.js
|
||||||
|
{ ...iifeOptions, minify: true, metafile: shouldVisualize }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const results = await Promise.all(buildConfigs.map((option) => build(getBuildConfig(option))));
|
||||||
|
|
||||||
|
if (shouldVisualize) {
|
||||||
|
for (const { metafile } of results) {
|
||||||
|
if (!metafile?.outputs) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const fileName = Object.keys(metafile.outputs)
|
||||||
|
.find((file) => !file.includes('chunks') && file.endsWith('js'))
|
||||||
|
.replace('dist/', '');
|
||||||
|
// Upload metafile into https://esbuild.github.io/analyze/
|
||||||
|
await writeFile(`stats/${fileName}.meta.json`, JSON.stringify(metafile));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const handler = (e) => {
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.error(e);
|
||||||
|
process.exit(1);
|
||||||
|
};
|
||||||
|
|
||||||
|
const main = async () => {
|
||||||
|
await generateLangium();
|
||||||
|
await mkdir('stats', { recursive: true });
|
||||||
|
const packageNames = Object.keys(packageOptions) as (keyof typeof packageOptions)[];
|
||||||
|
// it should build `parser` before `mermaid` because it's a dependency
|
||||||
|
for (const pkg of packageNames) {
|
||||||
|
await buildPackage(pkg).catch(handler);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
void main();
|
15
.esbuild/jisonPlugin.ts
Normal file
15
.esbuild/jisonPlugin.ts
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
import { readFile } from 'node:fs/promises';
|
||||||
|
import { transformJison } from '../.build/jisonTransformer.js';
|
||||||
|
import type { Plugin } from 'esbuild';
|
||||||
|
|
||||||
|
export const jisonPlugin: Plugin = {
|
||||||
|
name: 'jison',
|
||||||
|
setup(build) {
|
||||||
|
build.onLoad({ filter: /\.jison$/ }, async (args) => {
|
||||||
|
// Load the file from the file system
|
||||||
|
const source = await readFile(args.path, 'utf8');
|
||||||
|
const contents = transformJison(source);
|
||||||
|
return { contents, warnings: [] };
|
||||||
|
});
|
||||||
|
},
|
||||||
|
};
|
35
.esbuild/jsonSchemaPlugin.ts
Normal file
35
.esbuild/jsonSchemaPlugin.ts
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
import type { JSONSchemaType } from 'ajv/dist/2019.js';
|
||||||
|
import type { MermaidConfig } from '../packages/mermaid/src/config.type.js';
|
||||||
|
import { readFile } from 'node:fs/promises';
|
||||||
|
import { getDefaults, getSchema, loadSchema } from '../.build/jsonSchema.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ESBuild plugin that handles JSON Schemas saved as a `.schema.yaml` file.
|
||||||
|
*
|
||||||
|
* Use `my-example.schema.yaml?only-defaults=true` to only load the default values.
|
||||||
|
*/
|
||||||
|
|
||||||
|
export const jsonSchemaPlugin = {
|
||||||
|
name: 'json-schema-plugin',
|
||||||
|
setup(build) {
|
||||||
|
let schema: JSONSchemaType<MermaidConfig> | undefined = undefined;
|
||||||
|
let content = '';
|
||||||
|
|
||||||
|
build.onLoad({ filter: /config\.schema\.yaml$/ }, async (args) => {
|
||||||
|
// Load the file from the file system
|
||||||
|
const source = await readFile(args.path, 'utf8');
|
||||||
|
const resolvedSchema: JSONSchemaType<MermaidConfig> =
|
||||||
|
content === source && schema ? schema : loadSchema(source, args.path);
|
||||||
|
if (content !== source) {
|
||||||
|
content = source;
|
||||||
|
schema = resolvedSchema;
|
||||||
|
}
|
||||||
|
const contents = args.suffix.includes('only-defaults')
|
||||||
|
? getDefaults(resolvedSchema)
|
||||||
|
: getSchema(resolvedSchema);
|
||||||
|
return { contents, warnings: [] };
|
||||||
|
});
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default jsonSchemaPlugin;
|
117
.esbuild/server.ts
Normal file
117
.esbuild/server.ts
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
/* eslint-disable no-console */
|
||||||
|
import chokidar from 'chokidar';
|
||||||
|
import cors from 'cors';
|
||||||
|
import { context } from 'esbuild';
|
||||||
|
import type { Request, Response } from 'express';
|
||||||
|
import express from 'express';
|
||||||
|
import { packageOptions } from '../.build/common.js';
|
||||||
|
import { generateLangium } from '../.build/generateLangium.js';
|
||||||
|
import { defaultOptions, getBuildConfig } from './util.js';
|
||||||
|
|
||||||
|
const configs = Object.values(packageOptions).map(({ packageName }) =>
|
||||||
|
getBuildConfig({ ...defaultOptions, minify: false, core: false, entryName: packageName })
|
||||||
|
);
|
||||||
|
const mermaidIIFEConfig = getBuildConfig({
|
||||||
|
...defaultOptions,
|
||||||
|
minify: false,
|
||||||
|
core: false,
|
||||||
|
entryName: 'mermaid',
|
||||||
|
format: 'iife',
|
||||||
|
});
|
||||||
|
configs.push(mermaidIIFEConfig);
|
||||||
|
|
||||||
|
const contexts = await Promise.all(
|
||||||
|
configs.map(async (config) => ({ config, context: await context(config) }))
|
||||||
|
);
|
||||||
|
|
||||||
|
let rebuildCounter = 1;
|
||||||
|
const rebuildAll = async () => {
|
||||||
|
const buildNumber = rebuildCounter++;
|
||||||
|
const timeLabel = `Rebuild ${buildNumber} Time (total)`;
|
||||||
|
console.time(timeLabel);
|
||||||
|
await Promise.all(
|
||||||
|
contexts.map(async ({ config, context }) => {
|
||||||
|
const buildVariant = `Rebuild ${buildNumber} Time (${Object.keys(config.entryPoints!)[0]} ${config.format})`;
|
||||||
|
console.time(buildVariant);
|
||||||
|
await context.rebuild();
|
||||||
|
console.timeEnd(buildVariant);
|
||||||
|
})
|
||||||
|
).catch((e) => console.error(e));
|
||||||
|
console.timeEnd(timeLabel);
|
||||||
|
};
|
||||||
|
|
||||||
|
let clients: { id: number; response: Response }[] = [];
|
||||||
|
function eventsHandler(request: Request, response: Response) {
|
||||||
|
const headers = {
|
||||||
|
'Content-Type': 'text/event-stream',
|
||||||
|
Connection: 'keep-alive',
|
||||||
|
'Cache-Control': 'no-cache',
|
||||||
|
};
|
||||||
|
response.writeHead(200, headers);
|
||||||
|
const clientId = Date.now();
|
||||||
|
clients.push({
|
||||||
|
id: clientId,
|
||||||
|
response,
|
||||||
|
});
|
||||||
|
request.on('close', () => {
|
||||||
|
clients = clients.filter((client) => client.id !== clientId);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
let timeoutID: NodeJS.Timeout | undefined = undefined;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Debounce file change events to avoid rebuilding multiple times.
|
||||||
|
*/
|
||||||
|
function handleFileChange() {
|
||||||
|
if (timeoutID !== undefined) {
|
||||||
|
clearTimeout(timeoutID);
|
||||||
|
}
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
||||||
|
timeoutID = setTimeout(async () => {
|
||||||
|
await rebuildAll();
|
||||||
|
sendEventsToAll();
|
||||||
|
timeoutID = undefined;
|
||||||
|
}, 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
function sendEventsToAll() {
|
||||||
|
clients.forEach(({ response }) => response.write(`data: ${Date.now()}\n\n`));
|
||||||
|
}
|
||||||
|
|
||||||
|
async function createServer() {
|
||||||
|
await generateLangium();
|
||||||
|
handleFileChange();
|
||||||
|
const app = express();
|
||||||
|
chokidar
|
||||||
|
.watch('**/src/**/*.{js,ts,langium,yaml,json}', {
|
||||||
|
ignoreInitial: true,
|
||||||
|
ignored: [/node_modules/, /dist/, /docs/, /coverage/],
|
||||||
|
})
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
||||||
|
.on('all', async (event, path) => {
|
||||||
|
// Ignore other events.
|
||||||
|
if (!['add', 'change'].includes(event)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
console.log(`${path} changed. Rebuilding...`);
|
||||||
|
if (path.endsWith('.langium')) {
|
||||||
|
await generateLangium();
|
||||||
|
}
|
||||||
|
handleFileChange();
|
||||||
|
});
|
||||||
|
|
||||||
|
app.use(cors());
|
||||||
|
app.get('/events', eventsHandler);
|
||||||
|
for (const { packageName } of Object.values(packageOptions)) {
|
||||||
|
app.use(express.static(`./packages/${packageName}/dist`));
|
||||||
|
}
|
||||||
|
app.use(express.static('demos'));
|
||||||
|
app.use(express.static('cypress/platform'));
|
||||||
|
|
||||||
|
app.listen(9000, () => {
|
||||||
|
console.log(`Listening on http://localhost:9000`);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void createServer();
|
101
.esbuild/util.ts
Normal file
101
.esbuild/util.ts
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
import { resolve } from 'path';
|
||||||
|
import { fileURLToPath } from 'url';
|
||||||
|
import type { BuildOptions } from 'esbuild';
|
||||||
|
import { readFileSync } from 'fs';
|
||||||
|
import jsonSchemaPlugin from './jsonSchemaPlugin.js';
|
||||||
|
import { packageOptions } from '../.build/common.js';
|
||||||
|
import { jisonPlugin } from './jisonPlugin.js';
|
||||||
|
|
||||||
|
const __dirname = fileURLToPath(new URL('.', import.meta.url));
|
||||||
|
|
||||||
|
export interface MermaidBuildOptions extends BuildOptions {
|
||||||
|
minify: boolean;
|
||||||
|
core: boolean;
|
||||||
|
metafile: boolean;
|
||||||
|
format: 'esm' | 'iife';
|
||||||
|
entryName: keyof typeof packageOptions;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const defaultOptions: Omit<MermaidBuildOptions, 'entryName'> = {
|
||||||
|
minify: false,
|
||||||
|
metafile: false,
|
||||||
|
core: false,
|
||||||
|
format: 'esm',
|
||||||
|
} as const;
|
||||||
|
|
||||||
|
const buildOptions = (override: BuildOptions): BuildOptions => {
|
||||||
|
return {
|
||||||
|
bundle: true,
|
||||||
|
minify: true,
|
||||||
|
keepNames: true,
|
||||||
|
platform: 'browser',
|
||||||
|
tsconfig: 'tsconfig.json',
|
||||||
|
resolveExtensions: ['.ts', '.js', '.json', '.jison', '.yaml'],
|
||||||
|
external: ['require', 'fs', 'path'],
|
||||||
|
outdir: 'dist',
|
||||||
|
plugins: [jisonPlugin, jsonSchemaPlugin],
|
||||||
|
sourcemap: 'external',
|
||||||
|
...override,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
const getFileName = (fileName: string, { core, format, minify }: MermaidBuildOptions) => {
|
||||||
|
if (core) {
|
||||||
|
fileName += '.core';
|
||||||
|
} else if (format === 'esm') {
|
||||||
|
fileName += '.esm';
|
||||||
|
}
|
||||||
|
if (minify) {
|
||||||
|
fileName += '.min';
|
||||||
|
}
|
||||||
|
return fileName;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getBuildConfig = (options: MermaidBuildOptions): BuildOptions => {
|
||||||
|
const { core, entryName, metafile, format, minify } = options;
|
||||||
|
const external: string[] = ['require', 'fs', 'path'];
|
||||||
|
const { name, file, packageName } = packageOptions[entryName];
|
||||||
|
const outFileName = getFileName(name, options);
|
||||||
|
const output: BuildOptions = buildOptions({
|
||||||
|
absWorkingDir: resolve(__dirname, `../packages/${packageName}`),
|
||||||
|
entryPoints: {
|
||||||
|
[outFileName]: `src/${file}`,
|
||||||
|
},
|
||||||
|
metafile,
|
||||||
|
minify,
|
||||||
|
logLevel: 'info',
|
||||||
|
chunkNames: `chunks/${outFileName}/[name]-[hash]`,
|
||||||
|
define: {
|
||||||
|
'import.meta.vitest': 'undefined',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (core) {
|
||||||
|
const { dependencies } = JSON.parse(
|
||||||
|
readFileSync(resolve(__dirname, `../packages/${packageName}/package.json`), 'utf-8')
|
||||||
|
);
|
||||||
|
// Core build is used to generate file without bundled dependencies.
|
||||||
|
// This is used by downstream projects to bundle dependencies themselves.
|
||||||
|
// Ignore dependencies and any dependencies of dependencies
|
||||||
|
external.push(...Object.keys(dependencies));
|
||||||
|
output.external = external;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (format === 'iife') {
|
||||||
|
output.format = 'iife';
|
||||||
|
output.splitting = false;
|
||||||
|
output.globalName = '__esbuild_esm_mermaid';
|
||||||
|
// Workaround for removing the .default access in esbuild IIFE.
|
||||||
|
// https://github.com/mermaid-js/mermaid/pull/4109#discussion_r1292317396
|
||||||
|
output.footer = {
|
||||||
|
js: 'globalThis.mermaid = globalThis.__esbuild_esm_mermaid.default;',
|
||||||
|
};
|
||||||
|
output.outExtension = { '.js': '.js' };
|
||||||
|
} else {
|
||||||
|
output.format = 'esm';
|
||||||
|
output.splitting = true;
|
||||||
|
output.outExtension = { '.js': '.mjs' };
|
||||||
|
}
|
||||||
|
|
||||||
|
return output;
|
||||||
|
};
|
@@ -1,8 +0,0 @@
|
|||||||
dist/**
|
|
||||||
.github/**
|
|
||||||
docs/Setup.md
|
|
||||||
cypress.config.js
|
|
||||||
cypress/plugins/index.js
|
|
||||||
coverage
|
|
||||||
*.json
|
|
||||||
node_modules
|
|
189
.eslintrc.cjs
189
.eslintrc.cjs
@@ -1,189 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
env: {
|
|
||||||
browser: true,
|
|
||||||
es6: true,
|
|
||||||
'jest/globals': true,
|
|
||||||
node: true,
|
|
||||||
},
|
|
||||||
root: true,
|
|
||||||
parser: '@typescript-eslint/parser',
|
|
||||||
parserOptions: {
|
|
||||||
ecmaFeatures: {
|
|
||||||
experimentalObjectRestSpread: true,
|
|
||||||
jsx: true,
|
|
||||||
},
|
|
||||||
tsconfigRootDir: __dirname,
|
|
||||||
sourceType: 'module',
|
|
||||||
ecmaVersion: 2020,
|
|
||||||
allowAutomaticSingleRunInference: true,
|
|
||||||
project: ['./tsconfig.eslint.json', './packages/*/tsconfig.json'],
|
|
||||||
parser: '@typescript-eslint/parser',
|
|
||||||
},
|
|
||||||
extends: [
|
|
||||||
'eslint:recommended',
|
|
||||||
'plugin:@typescript-eslint/recommended',
|
|
||||||
'plugin:json/recommended',
|
|
||||||
'plugin:markdown/recommended',
|
|
||||||
'plugin:@cspell/recommended',
|
|
||||||
'prettier',
|
|
||||||
],
|
|
||||||
plugins: [
|
|
||||||
'@typescript-eslint',
|
|
||||||
'no-only-tests',
|
|
||||||
'html',
|
|
||||||
'jest',
|
|
||||||
'jsdoc',
|
|
||||||
'json',
|
|
||||||
'@cspell',
|
|
||||||
'lodash',
|
|
||||||
'unicorn',
|
|
||||||
],
|
|
||||||
ignorePatterns: [
|
|
||||||
// this file is automatically generated by `pnpm run --filter mermaid types:build-config`
|
|
||||||
'packages/mermaid/src/config.type.ts',
|
|
||||||
],
|
|
||||||
rules: {
|
|
||||||
curly: 'error',
|
|
||||||
'no-console': 'error',
|
|
||||||
'no-prototype-builtins': 'off',
|
|
||||||
'no-unused-vars': 'off',
|
|
||||||
'cypress/no-async-tests': 'off',
|
|
||||||
'@typescript-eslint/consistent-type-imports': 'error',
|
|
||||||
'@typescript-eslint/no-explicit-any': 'warn',
|
|
||||||
'@typescript-eslint/no-floating-promises': 'error',
|
|
||||||
'@typescript-eslint/no-misused-promises': 'error',
|
|
||||||
'@typescript-eslint/no-unused-vars': 'warn',
|
|
||||||
'@typescript-eslint/ban-ts-comment': [
|
|
||||||
'error',
|
|
||||||
{
|
|
||||||
'ts-expect-error': 'allow-with-description',
|
|
||||||
'ts-ignore': 'allow-with-description',
|
|
||||||
'ts-nocheck': 'allow-with-description',
|
|
||||||
'ts-check': 'allow-with-description',
|
|
||||||
minimumDescriptionLength: 10,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
'@typescript-eslint/naming-convention': [
|
|
||||||
'error',
|
|
||||||
{
|
|
||||||
selector: 'typeLike',
|
|
||||||
format: ['PascalCase'],
|
|
||||||
custom: {
|
|
||||||
regex: '^I[A-Z]',
|
|
||||||
match: false,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
'json/*': ['error', 'allowComments'],
|
|
||||||
'@cspell/spellchecker': [
|
|
||||||
'error',
|
|
||||||
{
|
|
||||||
checkIdentifiers: true,
|
|
||||||
checkStrings: true,
|
|
||||||
checkStringTemplates: true,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
'no-empty': [
|
|
||||||
'error',
|
|
||||||
{
|
|
||||||
allowEmptyCatch: true,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
'no-only-tests/no-only-tests': 'error',
|
|
||||||
'lodash/import-scope': ['error', 'method'],
|
|
||||||
'unicorn/better-regex': 'error',
|
|
||||||
'unicorn/no-abusive-eslint-disable': 'error',
|
|
||||||
'unicorn/no-array-push-push': 'error',
|
|
||||||
'unicorn/no-for-loop': 'error',
|
|
||||||
'unicorn/no-instanceof-array': 'error',
|
|
||||||
'unicorn/no-typeof-undefined': 'error',
|
|
||||||
'unicorn/no-unnecessary-await': 'error',
|
|
||||||
'unicorn/no-unsafe-regex': 'warn',
|
|
||||||
'unicorn/no-useless-promise-resolve-reject': 'error',
|
|
||||||
'unicorn/prefer-array-find': 'error',
|
|
||||||
'unicorn/prefer-array-flat-map': 'error',
|
|
||||||
'unicorn/prefer-array-index-of': 'error',
|
|
||||||
'unicorn/prefer-array-some': 'error',
|
|
||||||
'unicorn/prefer-default-parameters': 'error',
|
|
||||||
'unicorn/prefer-includes': 'error',
|
|
||||||
'unicorn/prefer-negative-index': 'error',
|
|
||||||
'unicorn/prefer-object-from-entries': 'error',
|
|
||||||
'unicorn/prefer-string-starts-ends-with': 'error',
|
|
||||||
'unicorn/prefer-string-trim-start-end': 'error',
|
|
||||||
'unicorn/string-content': 'error',
|
|
||||||
'unicorn/prefer-spread': 'error',
|
|
||||||
'unicorn/no-lonely-if': 'error',
|
|
||||||
},
|
|
||||||
overrides: [
|
|
||||||
{
|
|
||||||
files: ['cypress/**', 'demos/**'],
|
|
||||||
rules: {
|
|
||||||
'no-console': 'off',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
files: ['*.{js,jsx,mjs,cjs}'],
|
|
||||||
extends: ['plugin:jsdoc/recommended'],
|
|
||||||
rules: {
|
|
||||||
'jsdoc/check-indentation': 'off',
|
|
||||||
'jsdoc/check-alignment': 'off',
|
|
||||||
'jsdoc/check-line-alignment': 'off',
|
|
||||||
'jsdoc/multiline-blocks': 'off',
|
|
||||||
'jsdoc/newline-after-description': 'off',
|
|
||||||
'jsdoc/tag-lines': 'off',
|
|
||||||
'jsdoc/require-param-description': 'off',
|
|
||||||
'jsdoc/require-param-type': 'off',
|
|
||||||
'jsdoc/require-returns': 'off',
|
|
||||||
'jsdoc/require-returns-description': 'off',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
files: ['*.{ts,tsx}'],
|
|
||||||
plugins: ['tsdoc'],
|
|
||||||
rules: {
|
|
||||||
'no-restricted-syntax': [
|
|
||||||
'error',
|
|
||||||
{
|
|
||||||
selector: 'TSEnumDeclaration',
|
|
||||||
message:
|
|
||||||
'Prefer using TypeScript union types over TypeScript enum, since TypeScript enums have a bunch of issues, see https://dev.to/dvddpl/whats-the-problem-with-typescript-enums-2okj',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
'tsdoc/syntax': 'error',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
files: ['*.spec.{ts,js}', 'cypress/**', 'demos/**', '**/docs/**'],
|
|
||||||
rules: {
|
|
||||||
'jsdoc/require-jsdoc': 'off',
|
|
||||||
'@typescript-eslint/no-unused-vars': 'off',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
files: ['*.spec.{ts,js}', 'tests/**', 'cypress/**/*.js'],
|
|
||||||
rules: {
|
|
||||||
'@cspell/spellchecker': [
|
|
||||||
'error',
|
|
||||||
{
|
|
||||||
checkIdentifiers: false,
|
|
||||||
checkStrings: false,
|
|
||||||
checkStringTemplates: false,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
files: ['*.html', '*.md', '**/*.md/*'],
|
|
||||||
rules: {
|
|
||||||
'no-var': 'error',
|
|
||||||
'no-undef': 'off',
|
|
||||||
'@typescript-eslint/no-unused-vars': 'off',
|
|
||||||
'@typescript-eslint/no-floating-promises': 'off',
|
|
||||||
'@typescript-eslint/no-misused-promises': 'off',
|
|
||||||
},
|
|
||||||
parserOptions: {
|
|
||||||
project: null,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
|
1
.github/codecov.yaml
vendored
1
.github/codecov.yaml
vendored
@@ -15,3 +15,4 @@ coverage:
|
|||||||
# Turing off for now as code coverage isn't stable and causes unnecessary build failures.
|
# Turing off for now as code coverage isn't stable and causes unnecessary build failures.
|
||||||
# default:
|
# default:
|
||||||
# threshold: 2%
|
# threshold: 2%
|
||||||
|
patch: off
|
||||||
|
5
.github/lychee.toml
vendored
5
.github/lychee.toml
vendored
@@ -41,7 +41,10 @@ exclude = [
|
|||||||
"https://bundlephobia.com",
|
"https://bundlephobia.com",
|
||||||
|
|
||||||
# Chrome webstore migration issue. Temporary
|
# Chrome webstore migration issue. Temporary
|
||||||
"https://chromewebstore.google.com"
|
"https://chromewebstore.google.com",
|
||||||
|
|
||||||
|
# Drupal 403
|
||||||
|
"https://(www.)?drupal.org"
|
||||||
]
|
]
|
||||||
|
|
||||||
# Exclude all private IPs from checking.
|
# Exclude all private IPs from checking.
|
||||||
|
4
.github/workflows/build.yml
vendored
4
.github/workflows/build.yml
vendored
@@ -37,13 +37,13 @@ jobs:
|
|||||||
run: pnpm run build
|
run: pnpm run build
|
||||||
|
|
||||||
- name: Upload Mermaid Build as Artifact
|
- name: Upload Mermaid Build as Artifact
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: mermaid-build
|
name: mermaid-build
|
||||||
path: packages/mermaid/dist
|
path: packages/mermaid/dist
|
||||||
|
|
||||||
- name: Upload Mermaid Mindmap Build as Artifact
|
- name: Upload Mermaid Mindmap Build as Artifact
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: mermaid-mindmap-build
|
name: mermaid-mindmap-build
|
||||||
path: packages/mermaid-mindmap/dist
|
path: packages/mermaid-mindmap/dist
|
||||||
|
6
.github/workflows/codeql.yml
vendored
6
.github/workflows/codeql.yml
vendored
@@ -33,7 +33,7 @@ jobs:
|
|||||||
|
|
||||||
# Initializes the CodeQL tools for scanning.
|
# Initializes the CodeQL tools for scanning.
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
uses: github/codeql-action/init@v2
|
uses: github/codeql-action/init@v3
|
||||||
with:
|
with:
|
||||||
config-file: ./.github/codeql/codeql-config.yml
|
config-file: ./.github/codeql/codeql-config.yml
|
||||||
languages: ${{ matrix.language }}
|
languages: ${{ matrix.language }}
|
||||||
@@ -45,7 +45,7 @@ jobs:
|
|||||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||||
# If this step fails, then you should remove it and run the build manually (see below)
|
# If this step fails, then you should remove it and run the build manually (see below)
|
||||||
- name: Autobuild
|
- name: Autobuild
|
||||||
uses: github/codeql-action/autobuild@v2
|
uses: github/codeql-action/autobuild@v3
|
||||||
|
|
||||||
# ℹ️ Command-line programs to run using the OS shell.
|
# ℹ️ Command-line programs to run using the OS shell.
|
||||||
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
|
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
|
||||||
@@ -59,4 +59,4 @@ jobs:
|
|||||||
# make release
|
# make release
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@v2
|
uses: github/codeql-action/analyze@v3
|
||||||
|
2
.github/workflows/dependency-review.yml
vendored
2
.github/workflows/dependency-review.yml
vendored
@@ -17,4 +17,4 @@ jobs:
|
|||||||
- name: 'Checkout Repository'
|
- name: 'Checkout Repository'
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
- name: 'Dependency Review'
|
- name: 'Dependency Review'
|
||||||
uses: actions/dependency-review-action@v3
|
uses: actions/dependency-review-action@v4
|
||||||
|
116
.github/workflows/e2e.yml
vendored
116
.github/workflows/e2e.yml
vendored
@@ -1,9 +1,3 @@
|
|||||||
# We use github cache to save snapshots between runs.
|
|
||||||
# For PRs and MergeQueues, the target commit is used, and for push events, github.event.previous is used.
|
|
||||||
# If a snapshot for a given Hash is not found, we checkout that commit, run the tests and cache the snapshots.
|
|
||||||
# These are then downloaded before running the E2E, providing the reference snapshots.
|
|
||||||
# If there are any errors, the diff image is uploaded to artifacts, and the user is notified.
|
|
||||||
|
|
||||||
name: E2E
|
name: E2E
|
||||||
|
|
||||||
on:
|
on:
|
||||||
@@ -17,9 +11,19 @@ permissions:
|
|||||||
contents: read
|
contents: read
|
||||||
|
|
||||||
env:
|
env:
|
||||||
# For PRs and MergeQueues, the target commit is used, and for push events, github.event.previous is used.
|
# For PRs and MergeQueues, the target commit is used, and for push events to non-develop branches, github.event.previous is used if available. Otherwise, 'develop' is used.
|
||||||
targetHash: ${{ github.event.pull_request.base.sha || github.event.merge_group.base_sha || (github.event.before == '0000000000000000000000000000000000000000' && 'develop' || github.event.before) }}
|
targetHash: >-
|
||||||
|
${{
|
||||||
|
github.event.pull_request.base.sha ||
|
||||||
|
github.event.merge_group.base_sha ||
|
||||||
|
(
|
||||||
|
(
|
||||||
|
(github.event_name == 'push' && github.ref == 'refs/heads/develop') ||
|
||||||
|
github.event.before == '0000000000000000000000000000000000000000'
|
||||||
|
) && 'develop'
|
||||||
|
) ||
|
||||||
|
github.event.before
|
||||||
|
}}
|
||||||
jobs:
|
jobs:
|
||||||
cache:
|
cache:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -48,14 +52,19 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
ref: ${{ env.targetHash }}
|
ref: ${{ env.targetHash }}
|
||||||
|
|
||||||
- name: Cypress run
|
- name: Install dependencies
|
||||||
uses: cypress-io/github-action@v4
|
|
||||||
id: cypress-snapshot-gen
|
|
||||||
if: ${{ steps.cache-snapshot.outputs.cache-hit != 'true' }}
|
if: ${{ steps.cache-snapshot.outputs.cache-hit != 'true' }}
|
||||||
|
uses: cypress-io/github-action@v6
|
||||||
with:
|
with:
|
||||||
start: pnpm run dev
|
# just perform install
|
||||||
wait-on: 'http://localhost:9000'
|
runTests: false
|
||||||
browser: chrome
|
|
||||||
|
- name: Calculate bundle size
|
||||||
|
if: ${{ steps.cache-snapshot.outputs.cache-hit != 'true'}}
|
||||||
|
run: |
|
||||||
|
pnpm run build:viz
|
||||||
|
mkdir -p cypress/snapshots/stats/base
|
||||||
|
mv stats cypress/snapshots/stats/base
|
||||||
|
|
||||||
e2e:
|
e2e:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -81,20 +90,35 @@ jobs:
|
|||||||
# These cached snapshots are downloaded, providing the reference snapshots.
|
# These cached snapshots are downloaded, providing the reference snapshots.
|
||||||
- name: Cache snapshots
|
- name: Cache snapshots
|
||||||
id: cache-snapshot
|
id: cache-snapshot
|
||||||
uses: actions/cache/restore@v3
|
uses: actions/cache/restore@v4
|
||||||
with:
|
with:
|
||||||
path: ./cypress/snapshots
|
path: ./cypress/snapshots
|
||||||
key: ${{ runner.os }}-snapshots-${{ env.targetHash }}
|
key: ${{ runner.os }}-snapshots-${{ env.targetHash }}
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
uses: cypress-io/github-action@v6
|
||||||
|
with:
|
||||||
|
runTests: false
|
||||||
|
|
||||||
|
- name: Output size diff
|
||||||
|
if: ${{ matrix.containers == 1 }}
|
||||||
|
run: |
|
||||||
|
pnpm run build:viz
|
||||||
|
mv stats cypress/snapshots/stats/head
|
||||||
|
echo '## Bundle size difference' >> "$GITHUB_STEP_SUMMARY"
|
||||||
|
echo '' >> "$GITHUB_STEP_SUMMARY"
|
||||||
|
npx tsx scripts/size.ts >> "$GITHUB_STEP_SUMMARY"
|
||||||
|
|
||||||
# Install NPM dependencies, cache them correctly
|
# Install NPM dependencies, cache them correctly
|
||||||
# and run all Cypress tests
|
# and run all Cypress tests
|
||||||
- name: Cypress run
|
- name: Cypress run
|
||||||
uses: cypress-io/github-action@v4
|
uses: cypress-io/github-action@v6
|
||||||
id: cypress
|
id: cypress
|
||||||
# If CYPRESS_RECORD_KEY is set, run in parallel on all containers
|
# If CYPRESS_RECORD_KEY is set, run in parallel on all containers
|
||||||
# Otherwise (e.g. if running from fork), we run on a single container only
|
# Otherwise (e.g. if running from fork), we run on a single container only
|
||||||
if: ${{ ( env.CYPRESS_RECORD_KEY != '' ) || ( matrix.containers == 1 ) }}
|
if: ${{ ( env.CYPRESS_RECORD_KEY != '' ) || ( matrix.containers == 1 ) }}
|
||||||
with:
|
with:
|
||||||
|
install: false
|
||||||
start: pnpm run dev:coverage
|
start: pnpm run dev:coverage
|
||||||
wait-on: 'http://localhost:9000'
|
wait-on: 'http://localhost:9000'
|
||||||
browser: chrome
|
browser: chrome
|
||||||
@@ -106,9 +130,13 @@ jobs:
|
|||||||
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
|
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
|
||||||
VITEST_COVERAGE: true
|
VITEST_COVERAGE: true
|
||||||
CYPRESS_COMMIT: ${{ github.sha }}
|
CYPRESS_COMMIT: ${{ github.sha }}
|
||||||
|
ARGOS_TOKEN: ${{ secrets.ARGOS_TOKEN }}
|
||||||
|
ARGOS_PARALLEL: ${{ secrets.CYPRESS_RECORD_KEY != '' }}
|
||||||
|
ARGOS_PARALLEL_TOTAL: 4
|
||||||
|
ARGOS_PARALLEL_INDEX: ${{ matrix.containers }}
|
||||||
|
|
||||||
- name: Upload Coverage to Codecov
|
- name: Upload Coverage to Codecov
|
||||||
uses: codecov/codecov-action@v3
|
uses: codecov/codecov-action@v4
|
||||||
# Run step only pushes to develop and pull_requests
|
# Run step only pushes to develop and pull_requests
|
||||||
if: ${{ steps.cypress.conclusion == 'success' && (github.event_name == 'pull_request' || github.ref == 'refs/heads/develop')}}
|
if: ${{ steps.cypress.conclusion == 'success' && (github.event_name == 'pull_request' || github.ref == 'refs/heads/develop')}}
|
||||||
with:
|
with:
|
||||||
@@ -118,55 +146,3 @@ jobs:
|
|||||||
fail_ci_if_error: false
|
fail_ci_if_error: false
|
||||||
verbose: true
|
verbose: true
|
||||||
token: 6845cc80-77ee-4e17-85a1-026cd95e0766
|
token: 6845cc80-77ee-4e17-85a1-026cd95e0766
|
||||||
|
|
||||||
# We upload the artifacts into numbered archives to prevent overwriting
|
|
||||||
- name: Upload Artifacts
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
if: ${{ always() }}
|
|
||||||
with:
|
|
||||||
name: snapshots-${{ matrix.containers }}
|
|
||||||
retention-days: 1
|
|
||||||
path: ./cypress/snapshots
|
|
||||||
|
|
||||||
combineArtifacts:
|
|
||||||
needs: e2e
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: ${{ always() }}
|
|
||||||
steps:
|
|
||||||
# Download all snapshot artifacts and merge them into a single folder
|
|
||||||
- name: Download All Artifacts
|
|
||||||
uses: actions/download-artifact@v4
|
|
||||||
with:
|
|
||||||
path: snapshots
|
|
||||||
pattern: snapshots-*
|
|
||||||
merge-multiple: true
|
|
||||||
|
|
||||||
# For successful push events, we save the snapshots cache
|
|
||||||
- name: Save snapshots cache
|
|
||||||
id: cache-upload
|
|
||||||
if: ${{ github.event_name == 'push' && needs.e2e.result != 'failure' }}
|
|
||||||
uses: actions/cache/save@v3
|
|
||||||
with:
|
|
||||||
path: ./snapshots
|
|
||||||
key: ${{ runner.os }}-snapshots-${{ github.event.after }}
|
|
||||||
|
|
||||||
- name: Flatten images to a folder
|
|
||||||
if: ${{ needs.e2e.result == 'failure' }}
|
|
||||||
run: |
|
|
||||||
mkdir errors
|
|
||||||
cd snapshots
|
|
||||||
find . -mindepth 2 -type d -name "*__diff_output__*" -exec sh -c 'mv "$0"/*.png ../errors/' {} \;
|
|
||||||
|
|
||||||
- name: Upload Error snapshots
|
|
||||||
if: ${{ needs.e2e.result == 'failure' }}
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
id: upload-artifacts
|
|
||||||
with:
|
|
||||||
name: error-snapshots
|
|
||||||
retention-days: 10
|
|
||||||
path: errors/
|
|
||||||
|
|
||||||
- name: Notify Users
|
|
||||||
if: ${{ needs.e2e.result == 'failure' }}
|
|
||||||
run: |
|
|
||||||
echo "::error title=Visual tests failed::You can view images that failed by downloading the error-snapshots artifact: ${{ steps.upload-artifacts.outputs.artifact-url }}"
|
|
||||||
|
2
.github/workflows/link-checker.yml
vendored
2
.github/workflows/link-checker.yml
vendored
@@ -29,7 +29,7 @@ jobs:
|
|||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Restore lychee cache
|
- name: Restore lychee cache
|
||||||
uses: actions/cache@v3
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: .lycheecache
|
path: .lycheecache
|
||||||
key: cache-lychee-${{ github.sha }}
|
key: cache-lychee-${{ github.sha }}
|
||||||
|
2
.github/workflows/pr-labeler.yml
vendored
2
.github/workflows/pr-labeler.yml
vendored
@@ -22,7 +22,7 @@ jobs:
|
|||||||
pull-requests: write # write permission is required to label PRs
|
pull-requests: write # write permission is required to label PRs
|
||||||
steps:
|
steps:
|
||||||
- name: Label PR
|
- name: Label PR
|
||||||
uses: release-drafter/release-drafter@v5
|
uses: release-drafter/release-drafter@v6
|
||||||
with:
|
with:
|
||||||
config-name: pr-labeler.yml
|
config-name: pr-labeler.yml
|
||||||
disable-autolabeler: false
|
disable-autolabeler: false
|
||||||
|
6
.github/workflows/publish-docs.yml
vendored
6
.github/workflows/publish-docs.yml
vendored
@@ -37,13 +37,13 @@ jobs:
|
|||||||
run: pnpm install --frozen-lockfile
|
run: pnpm install --frozen-lockfile
|
||||||
|
|
||||||
- name: Setup Pages
|
- name: Setup Pages
|
||||||
uses: actions/configure-pages@v3
|
uses: actions/configure-pages@v4
|
||||||
|
|
||||||
- name: Run Build
|
- name: Run Build
|
||||||
run: pnpm --filter mermaid run docs:build:vitepress
|
run: pnpm --filter mermaid run docs:build:vitepress
|
||||||
|
|
||||||
- name: Upload artifact
|
- name: Upload artifact
|
||||||
uses: actions/upload-pages-artifact@v1
|
uses: actions/upload-pages-artifact@v3
|
||||||
with:
|
with:
|
||||||
path: packages/mermaid/src/vitepress/.vitepress/dist
|
path: packages/mermaid/src/vitepress/.vitepress/dist
|
||||||
|
|
||||||
@@ -56,4 +56,4 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Deploy to GitHub Pages
|
- name: Deploy to GitHub Pages
|
||||||
id: deployment
|
id: deployment
|
||||||
uses: actions/deploy-pages@v2
|
uses: actions/deploy-pages@v4
|
||||||
|
2
.github/workflows/release-draft.yml
vendored
2
.github/workflows/release-draft.yml
vendored
@@ -16,7 +16,7 @@ jobs:
|
|||||||
pull-requests: read # required to read PR titles/labels
|
pull-requests: read # required to read PR titles/labels
|
||||||
steps:
|
steps:
|
||||||
- name: Draft Release
|
- name: Draft Release
|
||||||
uses: release-drafter/release-drafter@v5
|
uses: release-drafter/release-drafter@v6
|
||||||
with:
|
with:
|
||||||
disable-autolabeler: true
|
disable-autolabeler: true
|
||||||
env:
|
env:
|
||||||
|
2
.github/workflows/test.yml
vendored
2
.github/workflows/test.yml
vendored
@@ -39,7 +39,7 @@ jobs:
|
|||||||
pnpm exec vitest run ./packages/mermaid/src/diagrams/gantt/ganttDb.spec.ts --coverage
|
pnpm exec vitest run ./packages/mermaid/src/diagrams/gantt/ganttDb.spec.ts --coverage
|
||||||
|
|
||||||
- name: Upload Coverage to Codecov
|
- name: Upload Coverage to Codecov
|
||||||
uses: codecov/codecov-action@v3
|
uses: codecov/codecov-action@v4
|
||||||
# Run step only pushes to develop and pull_requests
|
# Run step only pushes to develop and pull_requests
|
||||||
if: ${{ github.event_name == 'pull_request' || github.ref == 'refs/heads/develop' }}
|
if: ${{ github.event_name == 'pull_request' || github.ref == 'refs/heads/develop' }}
|
||||||
with:
|
with:
|
||||||
|
2
.github/workflows/update-browserlist.yml
vendored
2
.github/workflows/update-browserlist.yml
vendored
@@ -19,7 +19,7 @@ jobs:
|
|||||||
message: 'chore: update browsers list'
|
message: 'chore: update browsers list'
|
||||||
push: false
|
push: false
|
||||||
- name: Create Pull Request
|
- name: Create Pull Request
|
||||||
uses: peter-evans/create-pull-request@v5
|
uses: peter-evans/create-pull-request@v6
|
||||||
with:
|
with:
|
||||||
branch: update-browserslist
|
branch: update-browserslist
|
||||||
title: Update Browserslist
|
title: Update Browserslist
|
||||||
|
7
.gitignore
vendored
7
.gitignore
vendored
@@ -35,7 +35,7 @@ cypress/snapshots/
|
|||||||
.tsbuildinfo
|
.tsbuildinfo
|
||||||
tsconfig.tsbuildinfo
|
tsconfig.tsbuildinfo
|
||||||
|
|
||||||
knsv*.html
|
#knsv*.html
|
||||||
local*.html
|
local*.html
|
||||||
stats/
|
stats/
|
||||||
|
|
||||||
@@ -46,4 +46,9 @@ stats/
|
|||||||
|
|
||||||
demos/dev/**
|
demos/dev/**
|
||||||
!/demos/dev/example.html
|
!/demos/dev/example.html
|
||||||
|
!/demos/dev/reload.js
|
||||||
tsx-0/**
|
tsx-0/**
|
||||||
|
vite.config.ts.timestamp-*
|
||||||
|
|
||||||
|
# autogenereated by langium-cli
|
||||||
|
generated/
|
||||||
|
@@ -1,4 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
# . "$(dirname "$0")/_/husky.sh"
|
|
||||||
|
|
||||||
# npx --no-install commitlint --edit $1
|
|
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
. "$(dirname "$0")/_/husky.sh"
|
. "$(dirname "$0")/_/husky.sh"
|
||||||
|
|
||||||
pnpm run pre-commit
|
NODE_OPTIONS="--max_old_space_size=8192" pnpm run pre-commit
|
||||||
|
@@ -1 +1 @@
|
|||||||
v20.11.1
|
20.12.2
|
||||||
|
@@ -11,6 +11,10 @@ stats
|
|||||||
.nyc_output
|
.nyc_output
|
||||||
# Autogenerated by `pnpm run --filter mermaid types:build-config`
|
# Autogenerated by `pnpm run --filter mermaid types:build-config`
|
||||||
packages/mermaid/src/config.type.ts
|
packages/mermaid/src/config.type.ts
|
||||||
|
# autogenereated by langium-cli
|
||||||
|
generated/
|
||||||
# Ignore the files creates in /demos/dev except for example.html
|
# Ignore the files creates in /demos/dev except for example.html
|
||||||
demos/dev/**
|
demos/dev/**
|
||||||
!/demos/dev/example.html
|
!/demos/dev/example.html
|
||||||
|
# TODO: Lots of errors to fix
|
||||||
|
cypress/platform/state-refactor.html
|
||||||
|
@@ -3,5 +3,6 @@
|
|||||||
"printWidth": 100,
|
"printWidth": 100,
|
||||||
"singleQuote": true,
|
"singleQuote": true,
|
||||||
"useTabs": false,
|
"useTabs": false,
|
||||||
"tabWidth": 2
|
"tabWidth": 2,
|
||||||
|
"trailingComma": "es5"
|
||||||
}
|
}
|
||||||
|
@@ -1,13 +1,15 @@
|
|||||||
import { build, InlineConfig, type PluginOption } from 'vite';
|
import type { InlineConfig } from 'vite';
|
||||||
|
import { build, type PluginOption } from 'vite';
|
||||||
import { resolve } from 'path';
|
import { resolve } from 'path';
|
||||||
import { fileURLToPath } from 'url';
|
import { fileURLToPath } from 'url';
|
||||||
import jisonPlugin from './jisonPlugin.js';
|
import jisonPlugin from './jisonPlugin.js';
|
||||||
import jsonSchemaPlugin from './jsonSchemaPlugin.js';
|
import jsonSchemaPlugin from './jsonSchemaPlugin.js';
|
||||||
import { readFileSync } from 'fs';
|
|
||||||
import typescript from '@rollup/plugin-typescript';
|
import typescript from '@rollup/plugin-typescript';
|
||||||
import { visualizer } from 'rollup-plugin-visualizer';
|
import { visualizer } from 'rollup-plugin-visualizer';
|
||||||
import type { TemplateType } from 'rollup-plugin-visualizer/dist/plugin/template-types.js';
|
import type { TemplateType } from 'rollup-plugin-visualizer/dist/plugin/template-types.js';
|
||||||
import istanbul from 'vite-plugin-istanbul';
|
import istanbul from 'vite-plugin-istanbul';
|
||||||
|
import { packageOptions } from '../.build/common.js';
|
||||||
|
import { generateLangium } from '../.build/generateLangium.js';
|
||||||
|
|
||||||
const visualize = process.argv.includes('--visualize');
|
const visualize = process.argv.includes('--visualize');
|
||||||
const watch = process.argv.includes('--watch');
|
const watch = process.argv.includes('--watch');
|
||||||
@@ -36,24 +38,6 @@ const visualizerOptions = (packageName: string, core = false): PluginOption[] =>
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
const packageOptions = {
|
|
||||||
mermaid: {
|
|
||||||
name: 'mermaid',
|
|
||||||
packageName: 'mermaid',
|
|
||||||
file: 'mermaid.ts',
|
|
||||||
},
|
|
||||||
'mermaid-example-diagram': {
|
|
||||||
name: 'mermaid-example-diagram',
|
|
||||||
packageName: 'mermaid-example-diagram',
|
|
||||||
file: 'detector.ts',
|
|
||||||
},
|
|
||||||
'mermaid-zenuml': {
|
|
||||||
name: 'mermaid-zenuml',
|
|
||||||
packageName: 'mermaid-zenuml',
|
|
||||||
file: 'detector.ts',
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
interface BuildOptions {
|
interface BuildOptions {
|
||||||
minify: boolean | 'esbuild';
|
minify: boolean | 'esbuild';
|
||||||
core?: boolean;
|
core?: boolean;
|
||||||
@@ -63,43 +47,18 @@ interface BuildOptions {
|
|||||||
|
|
||||||
export const getBuildConfig = ({ minify, core, watch, entryName }: BuildOptions): InlineConfig => {
|
export const getBuildConfig = ({ minify, core, watch, entryName }: BuildOptions): InlineConfig => {
|
||||||
const external: (string | RegExp)[] = ['require', 'fs', 'path'];
|
const external: (string | RegExp)[] = ['require', 'fs', 'path'];
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
console.log(entryName, packageOptions[entryName]);
|
console.log(entryName, packageOptions[entryName]);
|
||||||
const { name, file, packageName } = packageOptions[entryName];
|
const { name, file, packageName } = packageOptions[entryName];
|
||||||
let output: OutputOptions = [
|
const output: OutputOptions = [
|
||||||
{
|
{
|
||||||
name,
|
name,
|
||||||
format: 'esm',
|
format: 'esm',
|
||||||
sourcemap,
|
sourcemap,
|
||||||
entryFileNames: `${name}.esm${minify ? '.min' : ''}.mjs`,
|
entryFileNames: `${name}.esm${minify ? '.min' : ''}.mjs`,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
name,
|
|
||||||
format: 'umd',
|
|
||||||
sourcemap,
|
|
||||||
entryFileNames: `${name}${minify ? '.min' : ''}.js`,
|
|
||||||
},
|
|
||||||
];
|
];
|
||||||
|
|
||||||
if (core) {
|
|
||||||
const { dependencies } = JSON.parse(
|
|
||||||
readFileSync(resolve(__dirname, `../packages/${packageName}/package.json`), 'utf-8')
|
|
||||||
);
|
|
||||||
// Core build is used to generate file without bundled dependencies.
|
|
||||||
// This is used by downstream projects to bundle dependencies themselves.
|
|
||||||
// Ignore dependencies and any dependencies of dependencies
|
|
||||||
// Adapted from the RegEx used by `rollup-plugin-node`
|
|
||||||
external.push(new RegExp('^(?:' + Object.keys(dependencies).join('|') + ')(?:/.+)?$'));
|
|
||||||
// This needs to be an array. Otherwise vite will build esm & umd with same name and overwrite esm with umd.
|
|
||||||
output = [
|
|
||||||
{
|
|
||||||
name,
|
|
||||||
format: 'esm',
|
|
||||||
sourcemap,
|
|
||||||
entryFileNames: `${name}.core.mjs`,
|
|
||||||
},
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
const config: InlineConfig = {
|
const config: InlineConfig = {
|
||||||
configFile: false,
|
configFile: false,
|
||||||
build: {
|
build: {
|
||||||
@@ -126,10 +85,9 @@ export const getBuildConfig = ({ minify, core, watch, entryName }: BuildOptions)
|
|||||||
plugins: [
|
plugins: [
|
||||||
jisonPlugin(),
|
jisonPlugin(),
|
||||||
jsonSchemaPlugin(), // handles `.schema.yaml` files
|
jsonSchemaPlugin(), // handles `.schema.yaml` files
|
||||||
// @ts-expect-error According to the type definitions, rollup plugins are incompatible with vite
|
|
||||||
typescript({ compilerOptions: { declaration: false } }),
|
typescript({ compilerOptions: { declaration: false } }),
|
||||||
istanbul({
|
istanbul({
|
||||||
exclude: ['node_modules', 'test/', '__mocks__'],
|
exclude: ['node_modules', 'test/', '__mocks__', 'generated'],
|
||||||
extension: ['.js', '.ts'],
|
extension: ['.js', '.ts'],
|
||||||
requireEnv: true,
|
requireEnv: true,
|
||||||
forceBuildInstrument: coverage,
|
forceBuildInstrument: coverage,
|
||||||
@@ -149,24 +107,28 @@ export const getBuildConfig = ({ minify, core, watch, entryName }: BuildOptions)
|
|||||||
|
|
||||||
const buildPackage = async (entryName: keyof typeof packageOptions) => {
|
const buildPackage = async (entryName: keyof typeof packageOptions) => {
|
||||||
await build(getBuildConfig({ minify: false, entryName }));
|
await build(getBuildConfig({ minify: false, entryName }));
|
||||||
await build(getBuildConfig({ minify: 'esbuild', entryName }));
|
|
||||||
await build(getBuildConfig({ minify: false, core: true, entryName }));
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const main = async () => {
|
const main = async () => {
|
||||||
const packageNames = Object.keys(packageOptions) as (keyof typeof packageOptions)[];
|
const packageNames = Object.keys(packageOptions) as (keyof typeof packageOptions)[];
|
||||||
for (const pkg of packageNames.filter((pkg) => !mermaidOnly || pkg === 'mermaid')) {
|
for (const pkg of packageNames.filter(
|
||||||
|
(pkg) => !mermaidOnly || pkg === 'mermaid' || pkg === 'parser'
|
||||||
|
)) {
|
||||||
await buildPackage(pkg);
|
await buildPackage(pkg);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
await generateLangium();
|
||||||
|
|
||||||
if (watch) {
|
if (watch) {
|
||||||
build(getBuildConfig({ minify: false, watch, core: false, entryName: 'mermaid' }));
|
await build(getBuildConfig({ minify: false, watch, core: false, entryName: 'parser' }));
|
||||||
|
void build(getBuildConfig({ minify: false, watch, core: false, entryName: 'mermaid' }));
|
||||||
if (!mermaidOnly) {
|
if (!mermaidOnly) {
|
||||||
build(getBuildConfig({ minify: false, watch, entryName: 'mermaid-example-diagram' }));
|
void build(getBuildConfig({ minify: false, watch, entryName: 'mermaid-example-diagram' }));
|
||||||
build(getBuildConfig({ minify: false, watch, entryName: 'mermaid-zenuml' }));
|
void build(getBuildConfig({ minify: false, watch, entryName: 'mermaid-zenuml' }));
|
||||||
}
|
}
|
||||||
} else if (visualize) {
|
} else if (visualize) {
|
||||||
|
await build(getBuildConfig({ minify: false, watch, core: false, entryName: 'parser' }));
|
||||||
await build(getBuildConfig({ minify: false, core: true, entryName: 'mermaid' }));
|
await build(getBuildConfig({ minify: false, core: true, entryName: 'mermaid' }));
|
||||||
await build(getBuildConfig({ minify: false, core: false, entryName: 'mermaid' }));
|
await build(getBuildConfig({ minify: false, core: false, entryName: 'mermaid' }));
|
||||||
} else {
|
} else {
|
||||||
|
@@ -1,10 +1,10 @@
|
|||||||
import { transformJison } from './jisonTransformer.js';
|
import { transformJison } from '../.build/jisonTransformer.js';
|
||||||
|
|
||||||
const fileRegex = /\.(jison)$/;
|
const fileRegex = /\.(jison)$/;
|
||||||
|
|
||||||
export default function jison() {
|
export default function jison() {
|
||||||
return {
|
return {
|
||||||
name: 'jison',
|
name: 'jison',
|
||||||
|
|
||||||
transform(src: string, id: string) {
|
transform(src: string, id: string) {
|
||||||
if (fileRegex.test(id)) {
|
if (fileRegex.test(id)) {
|
||||||
return {
|
return {
|
||||||
|
@@ -1,110 +1,5 @@
|
|||||||
import { load, JSON_SCHEMA } from 'js-yaml';
|
import type { PluginOption } from 'vite';
|
||||||
import assert from 'node:assert';
|
import { getDefaults, getSchema, loadSchema } from '../.build/jsonSchema.js';
|
||||||
import Ajv2019, { type JSONSchemaType } from 'ajv/dist/2019.js';
|
|
||||||
import { PluginOption } from 'vite';
|
|
||||||
|
|
||||||
import type { MermaidConfig, BaseDiagramConfig } from '../packages/mermaid/src/config.type.js';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* All of the keys in the mermaid config that have a mermaid diagram config.
|
|
||||||
*/
|
|
||||||
const MERMAID_CONFIG_DIAGRAM_KEYS = [
|
|
||||||
'flowchart',
|
|
||||||
'sequence',
|
|
||||||
'gantt',
|
|
||||||
'journey',
|
|
||||||
'class',
|
|
||||||
'state',
|
|
||||||
'er',
|
|
||||||
'pie',
|
|
||||||
'quadrantChart',
|
|
||||||
'xyChart',
|
|
||||||
'requirement',
|
|
||||||
'mindmap',
|
|
||||||
'timeline',
|
|
||||||
'gitGraph',
|
|
||||||
'c4',
|
|
||||||
'sankey',
|
|
||||||
'block',
|
|
||||||
] as const;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generate default values from the JSON Schema.
|
|
||||||
*
|
|
||||||
* AJV does not support nested default values yet (or default values with $ref),
|
|
||||||
* so we need to manually find them (this may be fixed in ajv v9).
|
|
||||||
*
|
|
||||||
* @param mermaidConfigSchema - The Mermaid JSON Schema to use.
|
|
||||||
* @returns The default mermaid config object.
|
|
||||||
*/
|
|
||||||
function generateDefaults(mermaidConfigSchema: JSONSchemaType<MermaidConfig>) {
|
|
||||||
const ajv = new Ajv2019({
|
|
||||||
useDefaults: true,
|
|
||||||
allowUnionTypes: true,
|
|
||||||
strict: true,
|
|
||||||
});
|
|
||||||
|
|
||||||
ajv.addKeyword({
|
|
||||||
keyword: 'meta:enum', // used by jsonschema2md
|
|
||||||
errors: false,
|
|
||||||
});
|
|
||||||
ajv.addKeyword({
|
|
||||||
keyword: 'tsType', // used by json-schema-to-typescript
|
|
||||||
errors: false,
|
|
||||||
});
|
|
||||||
|
|
||||||
// ajv currently doesn't support nested default values, see https://github.com/ajv-validator/ajv/issues/1718
|
|
||||||
// (may be fixed in v9) so we need to manually use sub-schemas
|
|
||||||
const mermaidDefaultConfig = {};
|
|
||||||
|
|
||||||
assert.ok(mermaidConfigSchema.$defs);
|
|
||||||
const baseDiagramConfig = mermaidConfigSchema.$defs.BaseDiagramConfig;
|
|
||||||
|
|
||||||
for (const key of MERMAID_CONFIG_DIAGRAM_KEYS) {
|
|
||||||
const subSchemaRef = mermaidConfigSchema.properties[key].$ref;
|
|
||||||
const [root, defs, defName] = subSchemaRef.split('/');
|
|
||||||
assert.strictEqual(root, '#');
|
|
||||||
assert.strictEqual(defs, '$defs');
|
|
||||||
const subSchema = {
|
|
||||||
$schema: mermaidConfigSchema.$schema,
|
|
||||||
$defs: mermaidConfigSchema.$defs,
|
|
||||||
...mermaidConfigSchema.$defs[defName],
|
|
||||||
} as JSONSchemaType<BaseDiagramConfig>;
|
|
||||||
|
|
||||||
const validate = ajv.compile(subSchema);
|
|
||||||
|
|
||||||
mermaidDefaultConfig[key] = {};
|
|
||||||
|
|
||||||
for (const required of subSchema.required ?? []) {
|
|
||||||
if (subSchema.properties[required] === undefined && baseDiagramConfig.properties[required]) {
|
|
||||||
mermaidDefaultConfig[key][required] = baseDiagramConfig.properties[required].default;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!validate(mermaidDefaultConfig[key])) {
|
|
||||||
throw new Error(
|
|
||||||
`schema for subconfig ${key} does not have valid defaults! Errors were ${JSON.stringify(
|
|
||||||
validate.errors,
|
|
||||||
undefined,
|
|
||||||
2
|
|
||||||
)}`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const validate = ajv.compile(mermaidConfigSchema);
|
|
||||||
|
|
||||||
if (!validate(mermaidDefaultConfig)) {
|
|
||||||
throw new Error(
|
|
||||||
`Mermaid config JSON Schema does not have valid defaults! Errors were ${JSON.stringify(
|
|
||||||
validate.errors,
|
|
||||||
undefined,
|
|
||||||
2
|
|
||||||
)}`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return mermaidDefaultConfig;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Vite plugin that handles JSON Schemas saved as a `.schema.yaml` file.
|
* Vite plugin that handles JSON Schemas saved as a `.schema.yaml` file.
|
||||||
@@ -121,32 +16,13 @@ export default function jsonSchemaPlugin(): PluginOption {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (idAsUrl.searchParams.get('only-defaults')) {
|
const jsonSchema = loadSchema(src, idAsUrl.pathname);
|
||||||
const jsonSchema = load(src, {
|
|
||||||
filename: idAsUrl.pathname,
|
|
||||||
// only allow JSON types in our YAML doc (will probably be default in YAML 1.3)
|
|
||||||
// e.g. `true` will be parsed a boolean `true`, `True` will be parsed as string `"True"`.
|
|
||||||
schema: JSON_SCHEMA,
|
|
||||||
}) as JSONSchemaType<MermaidConfig>;
|
|
||||||
return {
|
return {
|
||||||
code: `export default ${JSON.stringify(generateDefaults(jsonSchema), undefined, 2)};`,
|
code: idAsUrl.searchParams.get('only-defaults')
|
||||||
|
? getDefaults(jsonSchema)
|
||||||
|
: getSchema(jsonSchema),
|
||||||
map: null, // no source map
|
map: null, // no source map
|
||||||
};
|
};
|
||||||
} else {
|
|
||||||
return {
|
|
||||||
code: `export default ${JSON.stringify(
|
|
||||||
load(src, {
|
|
||||||
filename: idAsUrl.pathname,
|
|
||||||
// only allow JSON types in our YAML doc (will probably be default in YAML 1.3)
|
|
||||||
// e.g. `true` will be parsed a boolean `true`, `True` will be parsed as string `"True"`.
|
|
||||||
schema: JSON_SCHEMA,
|
|
||||||
}),
|
|
||||||
undefined,
|
|
||||||
2
|
|
||||||
)};`,
|
|
||||||
map: null, // provide source map if available
|
|
||||||
};
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
import express from 'express';
|
import express from 'express';
|
||||||
import cors from 'cors';
|
import cors from 'cors';
|
||||||
import { createServer as createViteServer } from 'vite';
|
import { createServer as createViteServer } from 'vite';
|
||||||
|
import { packageOptions } from '../.build/common.js';
|
||||||
|
|
||||||
async function createServer() {
|
async function createServer() {
|
||||||
const app = express();
|
const app = express();
|
||||||
@@ -14,16 +15,17 @@ async function createServer() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
app.use(cors());
|
app.use(cors());
|
||||||
app.use(express.static('./packages/mermaid/dist'));
|
for (const { packageName } of Object.values(packageOptions)) {
|
||||||
app.use(express.static('./packages/mermaid-zenuml/dist'));
|
app.use(express.static(`./packages/${packageName}/dist`));
|
||||||
app.use(express.static('./packages/mermaid-example-diagram/dist'));
|
}
|
||||||
app.use(vite.middlewares);
|
app.use(vite.middlewares);
|
||||||
app.use(express.static('demos'));
|
app.use(express.static('demos'));
|
||||||
app.use(express.static('cypress/platform'));
|
app.use(express.static('cypress/platform'));
|
||||||
|
|
||||||
app.listen(9000, () => {
|
app.listen(9000, () => {
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
console.log(`Listening on http://localhost:9000`);
|
console.log(`Listening on http://localhost:9000`);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
createServer();
|
void createServer();
|
||||||
|
@@ -1,2 +1,2 @@
|
|||||||
FROM node:20.11.1-alpine3.19 AS base
|
FROM node:20.12.2-alpine3.19 AS base
|
||||||
RUN wget -qO- https://get.pnpm.io/install.sh | ENV="$HOME/.shrc" SHELL="$(which sh)" sh -
|
RUN wget -qO- https://get.pnpm.io/install.sh | ENV="$HOME/.shrc" SHELL="$(which sh)" sh -
|
||||||
|
7
FUNDING.json
Normal file
7
FUNDING.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"drips": {
|
||||||
|
"ethereum": {
|
||||||
|
"ownedBy": "0x0831DDFe60d009d9448CC976157b539089aB821E"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -35,6 +35,7 @@ Try Live Editor previews of future releases: <a href="https://develop.git.mermai
|
|||||||
[](https://www.npmjs.com/package/mermaid)
|
[](https://www.npmjs.com/package/mermaid)
|
||||||
[](https://discord.gg/AgrbSrBer3)
|
[](https://discord.gg/AgrbSrBer3)
|
||||||
[](https://twitter.com/mermaidjs_)
|
[](https://twitter.com/mermaidjs_)
|
||||||
|
[](https://argos-ci.com)
|
||||||
|
|
||||||
<img src="./img/header.png" alt="" />
|
<img src="./img/header.png" alt="" />
|
||||||
|
|
||||||
|
@@ -1,21 +0,0 @@
|
|||||||
/**
|
|
||||||
* Mocked C4Context diagram renderer
|
|
||||||
*/
|
|
||||||
|
|
||||||
import { vi } from 'vitest';
|
|
||||||
|
|
||||||
export const drawPersonOrSystemArray = vi.fn();
|
|
||||||
export const drawBoundary = vi.fn();
|
|
||||||
|
|
||||||
export const setConf = vi.fn();
|
|
||||||
|
|
||||||
export const draw = vi.fn().mockImplementation(() => {
|
|
||||||
return '';
|
|
||||||
});
|
|
||||||
|
|
||||||
export default {
|
|
||||||
drawPersonOrSystemArray,
|
|
||||||
drawBoundary,
|
|
||||||
setConf,
|
|
||||||
draw,
|
|
||||||
};
|
|
@@ -1,16 +0,0 @@
|
|||||||
/**
|
|
||||||
* Mocked class diagram v2 renderer
|
|
||||||
*/
|
|
||||||
|
|
||||||
import { vi } from 'vitest';
|
|
||||||
|
|
||||||
export const setConf = vi.fn();
|
|
||||||
|
|
||||||
export const draw = vi.fn().mockImplementation(() => {
|
|
||||||
return '';
|
|
||||||
});
|
|
||||||
|
|
||||||
export default {
|
|
||||||
setConf,
|
|
||||||
draw,
|
|
||||||
};
|
|
@@ -1,13 +0,0 @@
|
|||||||
/**
|
|
||||||
* Mocked class diagram renderer
|
|
||||||
*/
|
|
||||||
|
|
||||||
import { vi } from 'vitest';
|
|
||||||
|
|
||||||
export const draw = vi.fn().mockImplementation(() => {
|
|
||||||
return '';
|
|
||||||
});
|
|
||||||
|
|
||||||
export default {
|
|
||||||
draw,
|
|
||||||
};
|
|
@@ -1 +0,0 @@
|
|||||||
// DO NOT delete this file. It is used by vitest to mock the dagre-d3 module.
|
|
@@ -1,3 +0,0 @@
|
|||||||
module.exports = function (txt: string) {
|
|
||||||
return txt;
|
|
||||||
};
|
|
@@ -1,16 +0,0 @@
|
|||||||
/**
|
|
||||||
* Mocked er diagram renderer
|
|
||||||
*/
|
|
||||||
|
|
||||||
import { vi } from 'vitest';
|
|
||||||
|
|
||||||
export const setConf = vi.fn();
|
|
||||||
|
|
||||||
export const draw = vi.fn().mockImplementation(() => {
|
|
||||||
return '';
|
|
||||||
});
|
|
||||||
|
|
||||||
export default {
|
|
||||||
setConf,
|
|
||||||
draw,
|
|
||||||
};
|
|
@@ -1,24 +0,0 @@
|
|||||||
/**
|
|
||||||
* Mocked flow (flowchart) diagram v2 renderer
|
|
||||||
*/
|
|
||||||
|
|
||||||
import { vi } from 'vitest';
|
|
||||||
|
|
||||||
export const setConf = vi.fn();
|
|
||||||
export const addVertices = vi.fn();
|
|
||||||
export const addEdges = vi.fn();
|
|
||||||
export const getClasses = vi.fn().mockImplementation(() => {
|
|
||||||
return {};
|
|
||||||
});
|
|
||||||
|
|
||||||
export const draw = vi.fn().mockImplementation(() => {
|
|
||||||
return '';
|
|
||||||
});
|
|
||||||
|
|
||||||
export default {
|
|
||||||
setConf,
|
|
||||||
addVertices,
|
|
||||||
addEdges,
|
|
||||||
getClasses,
|
|
||||||
draw,
|
|
||||||
};
|
|
@@ -1,16 +0,0 @@
|
|||||||
/**
|
|
||||||
* Mocked gantt diagram renderer
|
|
||||||
*/
|
|
||||||
|
|
||||||
import { vi } from 'vitest';
|
|
||||||
|
|
||||||
export const setConf = vi.fn();
|
|
||||||
|
|
||||||
export const draw = vi.fn().mockImplementation(() => {
|
|
||||||
return '';
|
|
||||||
});
|
|
||||||
|
|
||||||
export default {
|
|
||||||
setConf,
|
|
||||||
draw,
|
|
||||||
};
|
|
@@ -1,13 +0,0 @@
|
|||||||
/**
|
|
||||||
* Mocked git (graph) diagram renderer
|
|
||||||
*/
|
|
||||||
|
|
||||||
import { vi } from 'vitest';
|
|
||||||
|
|
||||||
export const draw = vi.fn().mockImplementation(() => {
|
|
||||||
return '';
|
|
||||||
});
|
|
||||||
|
|
||||||
export default {
|
|
||||||
draw,
|
|
||||||
};
|
|
@@ -1,15 +0,0 @@
|
|||||||
/**
|
|
||||||
* Mocked pie (picChart) diagram renderer
|
|
||||||
*/
|
|
||||||
|
|
||||||
import { vi } from 'vitest';
|
|
||||||
export const setConf = vi.fn();
|
|
||||||
|
|
||||||
export const draw = vi.fn().mockImplementation(() => {
|
|
||||||
return '';
|
|
||||||
});
|
|
||||||
|
|
||||||
export default {
|
|
||||||
setConf,
|
|
||||||
draw,
|
|
||||||
};
|
|
@@ -1,8 +0,0 @@
|
|||||||
/**
|
|
||||||
* Mocked pie (picChart) diagram renderer
|
|
||||||
*/
|
|
||||||
import { vi } from 'vitest';
|
|
||||||
|
|
||||||
const draw = vi.fn().mockImplementation(() => '');
|
|
||||||
|
|
||||||
export const renderer = { draw };
|
|
@@ -1,13 +0,0 @@
|
|||||||
/**
|
|
||||||
* Mocked requirement diagram renderer
|
|
||||||
*/
|
|
||||||
|
|
||||||
import { vi } from 'vitest';
|
|
||||||
|
|
||||||
export const draw = vi.fn().mockImplementation(() => {
|
|
||||||
return '';
|
|
||||||
});
|
|
||||||
|
|
||||||
export default {
|
|
||||||
draw,
|
|
||||||
};
|
|
@@ -1,13 +0,0 @@
|
|||||||
/**
|
|
||||||
* Mocked Sankey diagram renderer
|
|
||||||
*/
|
|
||||||
|
|
||||||
import { vi } from 'vitest';
|
|
||||||
|
|
||||||
export const draw = vi.fn().mockImplementation(() => {
|
|
||||||
return '';
|
|
||||||
});
|
|
||||||
|
|
||||||
export default {
|
|
||||||
draw,
|
|
||||||
};
|
|
@@ -1,23 +0,0 @@
|
|||||||
/**
|
|
||||||
* Mocked sequence diagram renderer
|
|
||||||
*/
|
|
||||||
|
|
||||||
import { vi } from 'vitest';
|
|
||||||
|
|
||||||
export const bounds = vi.fn();
|
|
||||||
export const drawActors = vi.fn();
|
|
||||||
export const drawActorsPopup = vi.fn();
|
|
||||||
|
|
||||||
export const setConf = vi.fn();
|
|
||||||
|
|
||||||
export const draw = vi.fn().mockImplementation(() => {
|
|
||||||
return '';
|
|
||||||
});
|
|
||||||
|
|
||||||
export default {
|
|
||||||
bounds,
|
|
||||||
drawActors,
|
|
||||||
drawActorsPopup,
|
|
||||||
setConf,
|
|
||||||
draw,
|
|
||||||
};
|
|
@@ -1,22 +0,0 @@
|
|||||||
/**
|
|
||||||
* Mocked state diagram v2 renderer
|
|
||||||
*/
|
|
||||||
|
|
||||||
import { vi } from 'vitest';
|
|
||||||
|
|
||||||
export const setConf = vi.fn();
|
|
||||||
export const getClasses = vi.fn().mockImplementation(() => {
|
|
||||||
return {};
|
|
||||||
});
|
|
||||||
export const stateDomId = vi.fn().mockImplementation(() => {
|
|
||||||
return 'mocked-stateDiagram-stateDomId';
|
|
||||||
});
|
|
||||||
export const draw = vi.fn().mockImplementation(() => {
|
|
||||||
return '';
|
|
||||||
});
|
|
||||||
|
|
||||||
export default {
|
|
||||||
setConf,
|
|
||||||
getClasses,
|
|
||||||
draw,
|
|
||||||
};
|
|
@@ -2,6 +2,8 @@ import { defineConfig } from 'cypress';
|
|||||||
import { addMatchImageSnapshotPlugin } from 'cypress-image-snapshot/plugin';
|
import { addMatchImageSnapshotPlugin } from 'cypress-image-snapshot/plugin';
|
||||||
import coverage from '@cypress/code-coverage/task';
|
import coverage from '@cypress/code-coverage/task';
|
||||||
import eyesPlugin from '@applitools/eyes-cypress';
|
import eyesPlugin from '@applitools/eyes-cypress';
|
||||||
|
import { registerArgosTask } from '@argos-ci/cypress/task';
|
||||||
|
|
||||||
export default eyesPlugin(
|
export default eyesPlugin(
|
||||||
defineConfig({
|
defineConfig({
|
||||||
projectId: 'n2sma2',
|
projectId: 'n2sma2',
|
||||||
@@ -17,10 +19,17 @@ export default eyesPlugin(
|
|||||||
}
|
}
|
||||||
return launchOptions;
|
return launchOptions;
|
||||||
});
|
});
|
||||||
addMatchImageSnapshotPlugin(on, config);
|
|
||||||
// copy any needed variables from process.env to config.env
|
// copy any needed variables from process.env to config.env
|
||||||
config.env.useAppli = process.env.USE_APPLI ? true : false;
|
config.env.useAppli = process.env.USE_APPLI ? true : false;
|
||||||
|
config.env.useArgos = !!process.env.CI;
|
||||||
|
|
||||||
|
if (config.env.useArgos) {
|
||||||
|
registerArgosTask(on, config, {
|
||||||
|
token: 'fc3a35cf5200db928d65b2047861582d9444032b',
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
addMatchImageSnapshotPlugin(on, config);
|
||||||
|
}
|
||||||
// do not forget to return the changed config object!
|
// do not forget to return the changed config object!
|
||||||
return config;
|
return config;
|
||||||
},
|
},
|
||||||
|
@@ -35,7 +35,7 @@ export const mermaidUrl = (
|
|||||||
};
|
};
|
||||||
const objStr: string = JSON.stringify(codeObject);
|
const objStr: string = JSON.stringify(codeObject);
|
||||||
let url = `http://localhost:9000/e2e.html?graph=${utf8ToB64(objStr)}`;
|
let url = `http://localhost:9000/e2e.html?graph=${utf8ToB64(objStr)}`;
|
||||||
if (api) {
|
if (api && typeof graphStr === 'string') {
|
||||||
url = `http://localhost:9000/xss.html?graph=${graphStr}`;
|
url = `http://localhost:9000/xss.html?graph=${graphStr}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -54,14 +54,13 @@ export const imgSnapshotTest = (
|
|||||||
): void => {
|
): void => {
|
||||||
const options: CypressMermaidConfig = {
|
const options: CypressMermaidConfig = {
|
||||||
..._options,
|
..._options,
|
||||||
fontFamily: _options.fontFamily || 'courier',
|
fontFamily: _options.fontFamily ?? 'courier',
|
||||||
// @ts-ignore TODO: Fix type of fontSize
|
// @ts-ignore TODO: Fix type of fontSize
|
||||||
fontSize: _options.fontSize || '16px',
|
fontSize: _options.fontSize ?? '16px',
|
||||||
sequence: {
|
sequence: {
|
||||||
...(_options.sequence || {}),
|
...(_options.sequence ?? {}),
|
||||||
actorFontFamily: 'courier',
|
actorFontFamily: 'courier',
|
||||||
noteFontFamily:
|
noteFontFamily: _options.sequence?.noteFontFamily
|
||||||
_options.sequence && _options.sequence.noteFontFamily
|
|
||||||
? _options.sequence.noteFontFamily
|
? _options.sequence.noteFontFamily
|
||||||
: 'courier',
|
: 'courier',
|
||||||
messageFontFamily: 'courier',
|
messageFontFamily: 'courier',
|
||||||
@@ -95,8 +94,22 @@ export const openURLAndVerifyRendering = (
|
|||||||
options: CypressMermaidConfig,
|
options: CypressMermaidConfig,
|
||||||
validation?: any
|
validation?: any
|
||||||
): void => {
|
): void => {
|
||||||
|
const name: string = (options.name ?? cy.state('runnable').fullTitle()).replace(/\s+/g, '-');
|
||||||
|
|
||||||
|
cy.visit(url);
|
||||||
|
// cy.window().should('have.property', 'rendered', true);
|
||||||
|
cy.get('svg').should('be.visible');
|
||||||
|
|
||||||
|
if (validation) {
|
||||||
|
cy.get('svg').should(validation);
|
||||||
|
}
|
||||||
|
|
||||||
|
verifyScreenshot(name);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const verifyScreenshot = (name: string): void => {
|
||||||
const useAppli: boolean = Cypress.env('useAppli');
|
const useAppli: boolean = Cypress.env('useAppli');
|
||||||
const name: string = (options.name || cy.state('runnable').fullTitle()).replace(/\s+/g, '-');
|
const useArgos: boolean = Cypress.env('useArgos');
|
||||||
|
|
||||||
if (useAppli) {
|
if (useAppli) {
|
||||||
cy.log(`Opening eyes ${Cypress.spec.name} --- ${name}`);
|
cy.log(`Opening eyes ${Cypress.spec.name} --- ${name}`);
|
||||||
@@ -106,21 +119,12 @@ export const openURLAndVerifyRendering = (
|
|||||||
batchName: Cypress.spec.name,
|
batchName: Cypress.spec.name,
|
||||||
batchId: batchId + Cypress.spec.name,
|
batchId: batchId + Cypress.spec.name,
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
|
||||||
cy.visit(url);
|
|
||||||
cy.window().should('have.property', 'rendered', true);
|
|
||||||
cy.get('svg').should('be.visible');
|
|
||||||
|
|
||||||
if (validation) {
|
|
||||||
cy.get('svg').should(validation);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (useAppli) {
|
|
||||||
cy.log(`Check eyes ${Cypress.spec.name}`);
|
cy.log(`Check eyes ${Cypress.spec.name}`);
|
||||||
cy.eyesCheckWindow('Click!');
|
cy.eyesCheckWindow('Click!');
|
||||||
cy.log(`Closing eyes ${Cypress.spec.name}`);
|
cy.log(`Closing eyes ${Cypress.spec.name}`);
|
||||||
cy.eyesClose();
|
cy.eyesClose();
|
||||||
|
} else if (useArgos) {
|
||||||
|
cy.argosScreenshot(name);
|
||||||
} else {
|
} else {
|
||||||
cy.matchImageSnapshot(name);
|
cy.matchImageSnapshot(name);
|
||||||
}
|
}
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { renderGraph } from '../../helpers/util.ts';
|
import { renderGraph, verifyScreenshot } from '../../helpers/util.ts';
|
||||||
describe('Configuration', () => {
|
describe('Configuration', () => {
|
||||||
describe('arrowMarkerAbsolute', () => {
|
describe('arrowMarkerAbsolute', () => {
|
||||||
it('should handle default value false of arrowMarkerAbsolute', () => {
|
it('should handle default value false of arrowMarkerAbsolute', () => {
|
||||||
@@ -118,11 +118,52 @@ describe('Configuration', () => {
|
|||||||
it('should not taint the initial configuration when using multiple directives', () => {
|
it('should not taint the initial configuration when using multiple directives', () => {
|
||||||
const url = 'http://localhost:9000/regression/issue-1874.html';
|
const url = 'http://localhost:9000/regression/issue-1874.html';
|
||||||
cy.visit(url);
|
cy.visit(url);
|
||||||
|
cy.window().should('have.property', 'rendered', true);
|
||||||
cy.get('svg');
|
verifyScreenshot(
|
||||||
cy.matchImageSnapshot(
|
|
||||||
'configuration.spec-should-not-taint-initial-configuration-when-using-multiple-directives'
|
'configuration.spec-should-not-taint-initial-configuration-when-using-multiple-directives'
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('suppressErrorRendering', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
cy.on('uncaught:exception', (err, runnable) => {
|
||||||
|
return !err.message.includes('Parse error on line');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not render error diagram if suppressErrorRendering is set', () => {
|
||||||
|
const url = 'http://localhost:9000/suppressError.html?suppressErrorRendering=true';
|
||||||
|
cy.visit(url);
|
||||||
|
cy.window().should('have.property', 'rendered', true);
|
||||||
|
cy.get('#test')
|
||||||
|
.find('svg')
|
||||||
|
.should(($svg) => {
|
||||||
|
// all failing diagrams should not appear!
|
||||||
|
expect($svg).to.have.length(2);
|
||||||
|
// none of the diagrams should be error diagrams
|
||||||
|
expect($svg).to.not.contain('Syntax error');
|
||||||
|
});
|
||||||
|
verifyScreenshot(
|
||||||
|
'configuration.spec-should-not-render-error-diagram-if-suppressErrorRendering-is-set'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render error diagram if suppressErrorRendering is not set', () => {
|
||||||
|
const url = 'http://localhost:9000/suppressError.html';
|
||||||
|
cy.visit(url);
|
||||||
|
cy.window().should('have.property', 'rendered', true);
|
||||||
|
cy.get('#test')
|
||||||
|
.find('svg')
|
||||||
|
.should(($svg) => {
|
||||||
|
// all five diagrams should be rendered
|
||||||
|
expect($svg).to.have.length(5);
|
||||||
|
// some of the diagrams should be error diagrams
|
||||||
|
expect($svg).to.contain('Syntax error');
|
||||||
|
});
|
||||||
|
verifyScreenshot(
|
||||||
|
'configuration.spec-should-render-error-diagram-if-suppressErrorRendering-is-not-set'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
14
cypress/integration/other/flowchart-elk.spec.js
Normal file
14
cypress/integration/other/flowchart-elk.spec.js
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import { urlSnapshotTest, openURLAndVerifyRendering } from '../../helpers/util.ts';
|
||||||
|
|
||||||
|
describe('Flowchart elk', () => {
|
||||||
|
it('should use dagre as fallback', () => {
|
||||||
|
urlSnapshotTest('http://localhost:9000/flow-elk.html', {
|
||||||
|
name: 'flow-elk fallback to dagre',
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it('should allow overriding with external package', () => {
|
||||||
|
urlSnapshotTest('http://localhost:9000/flow-elk.html?elk=true', {
|
||||||
|
name: 'flow-elk overriding dagre with elk',
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
11
cypress/integration/other/iife.spec.js
Normal file
11
cypress/integration/other/iife.spec.js
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
describe('IIFE', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
cy.visit('http://localhost:9000/iife.html');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render when using mermaid.min.js', () => {
|
||||||
|
cy.window().should('have.property', 'rendered', true);
|
||||||
|
cy.get('svg').should('be.visible');
|
||||||
|
cy.get('#d2').should('contain', 'Hello');
|
||||||
|
});
|
||||||
|
});
|
@@ -1,16 +0,0 @@
|
|||||||
describe('Sequencediagram', () => {
|
|
||||||
it('should render a simple sequence diagrams', () => {
|
|
||||||
const url = 'http://localhost:9000/webpackUsage.html';
|
|
||||||
|
|
||||||
cy.visit(url);
|
|
||||||
cy.get('body').find('svg').should('have.length', 1);
|
|
||||||
});
|
|
||||||
it('should handle html escapings properly', () => {
|
|
||||||
const url = 'http://localhost:9000/webpackUsage.html?test-html-escaping=true';
|
|
||||||
|
|
||||||
cy.visit(url);
|
|
||||||
cy.get('body').find('svg').should('have.length', 1);
|
|
||||||
|
|
||||||
cy.get('g.label > foreignobject > div').should('not.contain.text', '<b>');
|
|
||||||
});
|
|
||||||
});
|
|
@@ -10,7 +10,6 @@ describe('XSS', () => {
|
|||||||
cy.wait(1000).then(() => {
|
cy.wait(1000).then(() => {
|
||||||
cy.get('.mermaid').should('exist');
|
cy.get('.mermaid').should('exist');
|
||||||
});
|
});
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should not allow tags in the css', () => {
|
it('should not allow tags in the css', () => {
|
||||||
@@ -137,4 +136,9 @@ describe('XSS', () => {
|
|||||||
cy.wait(1000);
|
cy.wait(1000);
|
||||||
cy.get('#the-malware').should('not.exist');
|
cy.get('#the-malware').should('not.exist');
|
||||||
});
|
});
|
||||||
|
it('should sanitize backticks block diagram labels properly', () => {
|
||||||
|
cy.visit('http://localhost:9000/xss25.html');
|
||||||
|
cy.wait(1000);
|
||||||
|
cy.get('#the-malware').should('not.exist');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@@ -11,6 +11,27 @@ describe('Git Graph diagram', () => {
|
|||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
it('Should render subgraphs with title margins and edge labels', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`flowchart LR
|
||||||
|
|
||||||
|
subgraph TOP
|
||||||
|
direction TB
|
||||||
|
subgraph B1
|
||||||
|
direction RL
|
||||||
|
i1 --lb1-->f1
|
||||||
|
end
|
||||||
|
subgraph B2
|
||||||
|
direction BT
|
||||||
|
i2 --lb2-->f2
|
||||||
|
end
|
||||||
|
end
|
||||||
|
A --lb3--> TOP --lb4--> B
|
||||||
|
B1 --lb5--> B2
|
||||||
|
`,
|
||||||
|
{ flowchart: { subGraphTitleMargin: { top: 10, bottom: 5 } } }
|
||||||
|
);
|
||||||
|
});
|
||||||
// it(`ultraFastTest`, function () {
|
// it(`ultraFastTest`, function () {
|
||||||
// // Navigate to the url we want to test
|
// // Navigate to the url we want to test
|
||||||
// // ⭐️ Note to see visual bugs, run the test using the above URL for the 1st run.
|
// // ⭐️ Note to see visual bugs, run the test using the above URL for the 1st run.
|
||||||
|
@@ -30,7 +30,6 @@ describe('C4 diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should render a simple C4Container diagram', () => {
|
it('should render a simple C4Container diagram', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -50,7 +49,6 @@ describe('C4 diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should render a simple C4Component diagram', () => {
|
it('should render a simple C4Component diagram', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -69,7 +67,6 @@ describe('C4 diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should render a simple C4Dynamic diagram', () => {
|
it('should render a simple C4Dynamic diagram', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -93,7 +90,6 @@ describe('C4 diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should render a simple C4Deployment diagram', () => {
|
it('should render a simple C4Deployment diagram', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -117,6 +113,5 @@ describe('C4 diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@@ -32,7 +32,6 @@ describe('Class diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{ logLevel: 1 }
|
{ logLevel: 1 }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('2: should render a simple class diagrams with cardinality', () => {
|
it('2: should render a simple class diagrams with cardinality', () => {
|
||||||
@@ -61,7 +60,6 @@ describe('Class diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('3: should render a simple class diagram with different visibilities', () => {
|
it('3: should render a simple class diagram with different visibilities', () => {
|
||||||
@@ -79,7 +77,6 @@ describe('Class diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('4: should render a simple class diagram with comments', () => {
|
it('4: should render a simple class diagram with comments', () => {
|
||||||
@@ -109,7 +106,6 @@ describe('Class diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('5: should render a simple class diagram with abstract method', () => {
|
it('5: should render a simple class diagram with abstract method', () => {
|
||||||
@@ -121,7 +117,6 @@ describe('Class diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('6: should render a simple class diagram with static method', () => {
|
it('6: should render a simple class diagram with static method', () => {
|
||||||
@@ -133,7 +128,6 @@ describe('Class diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('7: should render a simple class diagram with Generic class', () => {
|
it('7: should render a simple class diagram with Generic class', () => {
|
||||||
@@ -153,7 +147,6 @@ describe('Class diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('8: should render a simple class diagram with Generic class and relations', () => {
|
it('8: should render a simple class diagram with Generic class and relations', () => {
|
||||||
@@ -174,7 +167,6 @@ describe('Class diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('9: should render a simple class diagram with clickable link', () => {
|
it('9: should render a simple class diagram with clickable link', () => {
|
||||||
@@ -196,7 +188,6 @@ describe('Class diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('10: should render a simple class diagram with clickable callback', () => {
|
it('10: should render a simple class diagram with clickable callback', () => {
|
||||||
@@ -218,7 +209,6 @@ describe('Class diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('11: should render a simple class diagram with return type on method', () => {
|
it('11: should render a simple class diagram with return type on method', () => {
|
||||||
@@ -233,7 +223,6 @@ describe('Class diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('12: should render a simple class diagram with generic types', () => {
|
it('12: should render a simple class diagram with generic types', () => {
|
||||||
@@ -249,7 +238,6 @@ describe('Class diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('13: should render a simple class diagram with css classes applied', () => {
|
it('13: should render a simple class diagram with css classes applied', () => {
|
||||||
@@ -267,7 +255,6 @@ describe('Class diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('14: should render a simple class diagram with css classes applied directly', () => {
|
it('14: should render a simple class diagram with css classes applied directly', () => {
|
||||||
@@ -283,7 +270,6 @@ describe('Class diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('15: should render a simple class diagram with css classes applied to multiple classes', () => {
|
it('15: should render a simple class diagram with css classes applied to multiple classes', () => {
|
||||||
@@ -298,7 +284,6 @@ describe('Class diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('16: should render multiple class diagrams', () => {
|
it('16: should render multiple class diagrams', () => {
|
||||||
@@ -351,7 +336,6 @@ describe('Class diagram', () => {
|
|||||||
],
|
],
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// it('17: should render a class diagram when useMaxWidth is true (default)', () => {
|
// it('17: should render a class diagram when useMaxWidth is true (default)', () => {
|
||||||
@@ -421,7 +405,6 @@ describe('Class diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{ logLevel: 1 }
|
{ logLevel: 1 }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should render class diagram with newlines in title', () => {
|
it('should render class diagram with newlines in title', () => {
|
||||||
@@ -439,7 +422,6 @@ describe('Class diagram', () => {
|
|||||||
+quack()
|
+quack()
|
||||||
}
|
}
|
||||||
`);
|
`);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should render class diagram with many newlines in title', () => {
|
it('should render class diagram with many newlines in title', () => {
|
||||||
|
@@ -218,7 +218,6 @@ describe('Entity Relationship Diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{ loglevel: 1 }
|
{ loglevel: 1 }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should render entities with keys', () => {
|
it('should render entities with keys', () => {
|
||||||
|
@@ -844,3 +844,42 @@ end
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('Title and arrow styling #4813', () => {
|
||||||
|
it('should render a flowchart with title', () => {
|
||||||
|
const titleString = 'Test Title';
|
||||||
|
renderGraph(
|
||||||
|
`---
|
||||||
|
title: ${titleString}
|
||||||
|
---
|
||||||
|
flowchart LR
|
||||||
|
A-->B
|
||||||
|
A-->C`,
|
||||||
|
{ flowchart: { defaultRenderer: 'elk' } }
|
||||||
|
);
|
||||||
|
cy.get('svg').should((svg) => {
|
||||||
|
const title = svg[0].querySelector('text');
|
||||||
|
expect(title.textContent).to.contain(titleString);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Render with stylized arrows', () => {
|
||||||
|
renderGraph(
|
||||||
|
`
|
||||||
|
flowchart LR
|
||||||
|
A-->B
|
||||||
|
B-.-oC
|
||||||
|
C==xD
|
||||||
|
D ~~~ A`,
|
||||||
|
{ flowchart: { defaultRenderer: 'elk' } }
|
||||||
|
);
|
||||||
|
cy.get('svg').should((svg) => {
|
||||||
|
const edges = svg[0].querySelectorAll('.edges path');
|
||||||
|
console.log(edges);
|
||||||
|
expect(edges[0]).to.have.attr('pattern', 'solid');
|
||||||
|
expect(edges[1]).to.have.attr('pattern', 'dotted');
|
||||||
|
expect(edges[2]).to.have.css('stroke-width', '3.5px');
|
||||||
|
expect(edges[3]).to.have.css('stroke-width', '1.5px');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
@@ -760,6 +760,51 @@ A ~~~ B
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('3258: Should render subgraphs with main graph nodeSpacing and rankSpacing', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`---
|
||||||
|
title: Subgraph nodeSpacing and rankSpacing example
|
||||||
|
---
|
||||||
|
flowchart LR
|
||||||
|
X --> Y
|
||||||
|
subgraph X
|
||||||
|
direction LR
|
||||||
|
A
|
||||||
|
C
|
||||||
|
end
|
||||||
|
subgraph Y
|
||||||
|
B
|
||||||
|
D
|
||||||
|
end
|
||||||
|
`,
|
||||||
|
{ flowchart: { nodeSpacing: 1, rankSpacing: 1 } }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('3258: Should render subgraphs with large nodeSpacing and rankSpacing', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`---
|
||||||
|
title: Subgraph nodeSpacing and rankSpacing example
|
||||||
|
config:
|
||||||
|
flowchart:
|
||||||
|
nodeSpacing: 250
|
||||||
|
rankSpacing: 250
|
||||||
|
---
|
||||||
|
flowchart LR
|
||||||
|
X --> Y
|
||||||
|
subgraph X
|
||||||
|
direction LR
|
||||||
|
A
|
||||||
|
C
|
||||||
|
end
|
||||||
|
subgraph Y
|
||||||
|
B
|
||||||
|
D
|
||||||
|
end
|
||||||
|
`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
describe('Markdown strings flowchart (#4220)', () => {
|
describe('Markdown strings flowchart (#4220)', () => {
|
||||||
describe('html labels', () => {
|
describe('html labels', () => {
|
||||||
it('With styling and classes', () => {
|
it('With styling and classes', () => {
|
||||||
@@ -904,6 +949,18 @@ end
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should not auto wrap when markdownAutoWrap is false', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`flowchart TD
|
||||||
|
angular_velocity["\`**angular_velocity**
|
||||||
|
*angular_displacement / duration*
|
||||||
|
[rad/s, 1/s]
|
||||||
|
{vector}\`"]
|
||||||
|
frequency["frequency\n(1 / period_duration)\n[Hz, 1/s]"]`,
|
||||||
|
{ markdownAutoWrap: false }
|
||||||
|
);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
describe('Subgraph title margins', () => {
|
describe('Subgraph title margins', () => {
|
||||||
it('Should render subgraphs with title margins set (LR)', () => {
|
it('Should render subgraphs with title margins set (LR)', () => {
|
||||||
|
@@ -573,7 +573,28 @@ describe('Gantt diagram', () => {
|
|||||||
`
|
`
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
it('should render a gantt diagram exculding friday and saturday', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`gantt
|
||||||
|
title A Gantt Diagram
|
||||||
|
dateFormat YYYY-MM-DD
|
||||||
|
excludes weekends
|
||||||
|
weekend friday
|
||||||
|
section Section1
|
||||||
|
A task :a1, 2024-02-28, 10d`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('should render a gantt diagram exculding saturday and sunday', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`gantt
|
||||||
|
title A Gantt Diagram
|
||||||
|
dateFormat YYYY-MM-DD
|
||||||
|
excludes weekends
|
||||||
|
weekend saturday
|
||||||
|
section Section1
|
||||||
|
A task :a1, 2024-02-28, 10d`
|
||||||
|
);
|
||||||
|
});
|
||||||
it('should render when compact is true', () => {
|
it('should render when compact is true', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`
|
||||||
|
@@ -1013,4 +1013,524 @@ gitGraph TB:
|
|||||||
{ gitGraph: { parallelCommits: true } }
|
{ gitGraph: { parallelCommits: true } }
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
describe('Git-Graph Bottom-to-Top Orientation Tests', () => {
|
||||||
|
it('50: should render a simple gitgraph with commit on main branch | Vertical Branch - Bottom-to-top', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`gitGraph BT:
|
||||||
|
commit id: "1"
|
||||||
|
commit id: "2"
|
||||||
|
commit id: "3"
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('51: should render a simple gitgraph with commit on main branch with Id | Vertical Branch - Bottom-to-top', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`gitGraph BT:
|
||||||
|
commit id: "One"
|
||||||
|
commit id: "Two"
|
||||||
|
commit id: "Three"
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('52: should render a simple gitgraph with different commitTypes on main branch | Vertical Branch - Bottom-to-top', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`gitGraph BT:
|
||||||
|
commit id: "Normal Commit"
|
||||||
|
commit id: "Reverse Commit" type: REVERSE
|
||||||
|
commit id: "Highlight Commit" type: HIGHLIGHT
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('53: should render a simple gitgraph with tags commitTypes on main branch | Vertical Branch - Bottom-to-top', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`gitGraph BT:
|
||||||
|
commit id: "Normal Commit with tag" tag: "v1.0.0"
|
||||||
|
commit id: "Reverse Commit with tag" type: REVERSE tag: "RC_1"
|
||||||
|
commit id: "Highlight Commit" type: HIGHLIGHT tag: "8.8.4"
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('54: should render a simple gitgraph with two branches | Vertical Branch - Bottom-to-top', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`gitGraph BT:
|
||||||
|
commit id: "1"
|
||||||
|
commit id: "2"
|
||||||
|
branch develop
|
||||||
|
checkout develop
|
||||||
|
commit id: "3"
|
||||||
|
commit id: "4"
|
||||||
|
checkout main
|
||||||
|
commit id: "5"
|
||||||
|
commit id: "6"
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('55: should render a simple gitgraph with two branches and merge commit | Vertical Branch - Bottom-to-top', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`gitGraph BT:
|
||||||
|
commit id: "1"
|
||||||
|
commit id: "2"
|
||||||
|
branch develop
|
||||||
|
checkout develop
|
||||||
|
commit id: "3"
|
||||||
|
commit id: "4"
|
||||||
|
checkout main
|
||||||
|
merge develop
|
||||||
|
commit id: "5"
|
||||||
|
commit id: "6"
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('56: should render a simple gitgraph with three branches and tagged merge commit | Vertical Branch - Bottom-to-top', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`gitGraph BT:
|
||||||
|
commit id: "1"
|
||||||
|
commit id: "2"
|
||||||
|
branch nice_feature
|
||||||
|
checkout nice_feature
|
||||||
|
commit id: "3"
|
||||||
|
checkout main
|
||||||
|
commit id: "4"
|
||||||
|
checkout nice_feature
|
||||||
|
branch very_nice_feature
|
||||||
|
checkout very_nice_feature
|
||||||
|
commit id: "5"
|
||||||
|
checkout main
|
||||||
|
commit id: "6"
|
||||||
|
checkout nice_feature
|
||||||
|
commit id: "7"
|
||||||
|
checkout main
|
||||||
|
merge nice_feature id: "12345" tag: "my merge commit"
|
||||||
|
checkout very_nice_feature
|
||||||
|
commit id: "8"
|
||||||
|
checkout main
|
||||||
|
commit id: "9"
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('57: should render a simple gitgraph with more than 8 branches & overriding variables | Vertical Branch - Bottom-to-top', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`%%{init: { 'logLevel': 'debug', 'theme': 'default' , 'themeVariables': {
|
||||||
|
'gitBranchLabel0': '#ffffff',
|
||||||
|
'gitBranchLabel1': '#ffffff',
|
||||||
|
'gitBranchLabel2': '#ffffff',
|
||||||
|
'gitBranchLabel3': '#ffffff',
|
||||||
|
'gitBranchLabel4': '#ffffff',
|
||||||
|
'gitBranchLabel5': '#ffffff',
|
||||||
|
'gitBranchLabel6': '#ffffff',
|
||||||
|
'gitBranchLabel7': '#ffffff',
|
||||||
|
} } }%%
|
||||||
|
gitGraph BT:
|
||||||
|
checkout main
|
||||||
|
branch branch1
|
||||||
|
branch branch2
|
||||||
|
branch branch3
|
||||||
|
branch branch4
|
||||||
|
branch branch5
|
||||||
|
branch branch6
|
||||||
|
branch branch7
|
||||||
|
branch branch8
|
||||||
|
branch branch9
|
||||||
|
checkout branch1
|
||||||
|
commit id: "1"
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('58: should render a simple gitgraph with rotated labels | Vertical Branch - Bottom-to-top', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`%%{init: { 'logLevel': 'debug', 'theme': 'default' , 'gitGraph': {
|
||||||
|
'rotateCommitLabel': true
|
||||||
|
} } }%%
|
||||||
|
gitGraph BT:
|
||||||
|
commit id: "75f7219e83b321cd3fdde7dcf83bc7c1000a6828"
|
||||||
|
commit id: "0db4784daf82736dec4569e0dc92980d328c1f2e"
|
||||||
|
commit id: "7067e9973f9eaa6cd4a4b723c506d1eab598e83e"
|
||||||
|
commit id: "66972321ad6c199013b5b31f03b3a86fa3f9817d"
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('59: should render a simple gitgraph with horizontal labels | Vertical Branch - Bottom-to-top', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`%%{init: { 'logLevel': 'debug', 'theme': 'default' , 'gitGraph': {
|
||||||
|
'rotateCommitLabel': false
|
||||||
|
} } }%%
|
||||||
|
gitGraph BT:
|
||||||
|
commit id: "Alpha"
|
||||||
|
commit id: "Beta"
|
||||||
|
commit id: "Gamma"
|
||||||
|
commit id: "Delta"
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('60: should render a simple gitgraph with cherry pick commit | Vertical Branch - Bottom-to-top', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
gitGraph BT:
|
||||||
|
commit id: "ZERO"
|
||||||
|
branch develop
|
||||||
|
commit id:"A"
|
||||||
|
checkout main
|
||||||
|
commit id:"ONE"
|
||||||
|
checkout develop
|
||||||
|
commit id:"B"
|
||||||
|
checkout main
|
||||||
|
commit id:"TWO"
|
||||||
|
cherry-pick id:"A"
|
||||||
|
commit id:"THREE"
|
||||||
|
checkout develop
|
||||||
|
commit id:"C"
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('61: should render a gitgraph with cherry pick commit with custom tag | Vertical Branch - Bottom-to-top', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
gitGraph BT:
|
||||||
|
commit id: "ZERO"
|
||||||
|
branch develop
|
||||||
|
commit id:"A"
|
||||||
|
checkout main
|
||||||
|
commit id:"ONE"
|
||||||
|
checkout develop
|
||||||
|
commit id:"B"
|
||||||
|
checkout main
|
||||||
|
commit id:"TWO"
|
||||||
|
cherry-pick id:"A" tag: "snapshot"
|
||||||
|
commit id:"THREE"
|
||||||
|
checkout develop
|
||||||
|
commit id:"C"
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('62: should render a gitgraph with cherry pick commit with no tag | Vertical Branch - Bottom-to-top', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
gitGraph BT:
|
||||||
|
commit id: "ZERO"
|
||||||
|
branch develop
|
||||||
|
commit id:"A"
|
||||||
|
checkout main
|
||||||
|
commit id:"ONE"
|
||||||
|
checkout develop
|
||||||
|
commit id:"B"
|
||||||
|
checkout main
|
||||||
|
commit id:"TWO"
|
||||||
|
cherry-pick id:"A" tag: ""
|
||||||
|
commit id:"THREE"
|
||||||
|
checkout develop
|
||||||
|
commit id:"C"
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('63: should render a simple gitgraph with two cherry pick commit | Vertical Branch - Bottom-to-top', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
gitGraph BT:
|
||||||
|
commit id: "ZERO"
|
||||||
|
branch develop
|
||||||
|
commit id:"A"
|
||||||
|
checkout main
|
||||||
|
commit id:"ONE"
|
||||||
|
checkout develop
|
||||||
|
commit id:"B"
|
||||||
|
branch featureA
|
||||||
|
commit id:"FIX"
|
||||||
|
commit id: "FIX-2"
|
||||||
|
checkout main
|
||||||
|
commit id:"TWO"
|
||||||
|
cherry-pick id:"A"
|
||||||
|
commit id:"THREE"
|
||||||
|
cherry-pick id:"FIX"
|
||||||
|
checkout develop
|
||||||
|
commit id:"C"
|
||||||
|
merge featureA
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('64: should render commits for more than 8 branches | Vertical Branch - Bottom-to-top', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
gitGraph BT:
|
||||||
|
checkout main
|
||||||
|
%% Make sure to manually set the ID of all commits, for consistent visual tests
|
||||||
|
commit id: "1-abcdefg"
|
||||||
|
checkout main
|
||||||
|
branch branch1
|
||||||
|
commit id: "2-abcdefg"
|
||||||
|
checkout main
|
||||||
|
merge branch1
|
||||||
|
branch branch2
|
||||||
|
commit id: "3-abcdefg"
|
||||||
|
checkout main
|
||||||
|
merge branch2
|
||||||
|
branch branch3
|
||||||
|
commit id: "4-abcdefg"
|
||||||
|
checkout main
|
||||||
|
merge branch3
|
||||||
|
branch branch4
|
||||||
|
commit id: "5-abcdefg"
|
||||||
|
checkout main
|
||||||
|
merge branch4
|
||||||
|
branch branch5
|
||||||
|
commit id: "6-abcdefg"
|
||||||
|
checkout main
|
||||||
|
merge branch5
|
||||||
|
branch branch6
|
||||||
|
commit id: "7-abcdefg"
|
||||||
|
checkout main
|
||||||
|
merge branch6
|
||||||
|
branch branch7
|
||||||
|
commit id: "8-abcdefg"
|
||||||
|
checkout main
|
||||||
|
merge branch7
|
||||||
|
branch branch8
|
||||||
|
commit id: "9-abcdefg"
|
||||||
|
checkout main
|
||||||
|
merge branch8
|
||||||
|
branch branch9
|
||||||
|
commit id: "10-abcdefg"
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('65: should render a simple gitgraph with three branches,custom merge commit id,tag,type | Vertical Branch - Bottom-to-top', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`gitGraph BT:
|
||||||
|
commit id: "1"
|
||||||
|
commit id: "2"
|
||||||
|
branch nice_feature
|
||||||
|
checkout nice_feature
|
||||||
|
commit id: "3"
|
||||||
|
checkout main
|
||||||
|
commit id: "4"
|
||||||
|
checkout nice_feature
|
||||||
|
branch very_nice_feature
|
||||||
|
checkout very_nice_feature
|
||||||
|
commit id: "5"
|
||||||
|
checkout main
|
||||||
|
commit id: "6"
|
||||||
|
checkout nice_feature
|
||||||
|
commit id: "7"
|
||||||
|
checkout main
|
||||||
|
merge nice_feature id: "customID" tag: "customTag" type: REVERSE
|
||||||
|
checkout very_nice_feature
|
||||||
|
commit id: "8"
|
||||||
|
checkout main
|
||||||
|
commit id: "9"
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('66: should render a simple gitgraph with a title | Vertical Branch - Bottom-to-top', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`---
|
||||||
|
title: simple gitGraph
|
||||||
|
---
|
||||||
|
gitGraph BT:
|
||||||
|
commit id: "1-abcdefg"
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('67: should render a simple gitgraph overlapping commits | Vertical Branch - Bottom-to-top', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`gitGraph BT:
|
||||||
|
commit id:"s1"
|
||||||
|
commit id:"s2"
|
||||||
|
branch branch1
|
||||||
|
commit id:"s3"
|
||||||
|
commit id:"s4"
|
||||||
|
checkout main
|
||||||
|
commit id:"s5"
|
||||||
|
checkout branch1
|
||||||
|
commit id:"s6"
|
||||||
|
commit id:"s7"
|
||||||
|
merge main
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('68: should render a simple gitgraph with two branches from same commit | Vertical Branch - Bottom-to-top', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`gitGraph BT:
|
||||||
|
commit id:"1-abcdefg"
|
||||||
|
commit id:"2-abcdefg"
|
||||||
|
branch feature-001
|
||||||
|
commit id:"3-abcdefg"
|
||||||
|
commit id:"4-abcdefg"
|
||||||
|
checkout main
|
||||||
|
branch feature-002
|
||||||
|
commit id:"5-abcdefg"
|
||||||
|
checkout feature-001
|
||||||
|
merge feature-002
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('69: should render GitGraph with branch that is not used immediately | Vertical Branch - Bottom-to-top', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`gitGraph BT:
|
||||||
|
commit id:"1-abcdefg"
|
||||||
|
branch x
|
||||||
|
checkout main
|
||||||
|
commit id:"2-abcdefg"
|
||||||
|
checkout x
|
||||||
|
commit id:"3-abcdefg"
|
||||||
|
checkout main
|
||||||
|
merge x
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('70: should render GitGraph with branch and sub-branch neither of which used immediately | Vertical Branch - Bottom-to-top', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`gitGraph BT:
|
||||||
|
commit id:"1-abcdefg"
|
||||||
|
branch x
|
||||||
|
checkout main
|
||||||
|
commit id:"2-abcdefg"
|
||||||
|
checkout x
|
||||||
|
commit id:"3-abcdefg"
|
||||||
|
checkout main
|
||||||
|
merge x
|
||||||
|
checkout x
|
||||||
|
branch y
|
||||||
|
checkout x
|
||||||
|
commit id:"4-abcdefg"
|
||||||
|
checkout y
|
||||||
|
commit id:"5-abcdefg"
|
||||||
|
checkout x
|
||||||
|
merge y
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('71: should render GitGraph with parallel commits | Vertical Branch - Bottom-to-top', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`gitGraph BT:
|
||||||
|
commit id:"1-abcdefg"
|
||||||
|
commit id:"2-abcdefg"
|
||||||
|
branch develop
|
||||||
|
commit id:"3-abcdefg"
|
||||||
|
commit id:"4-abcdefg"
|
||||||
|
checkout main
|
||||||
|
branch feature
|
||||||
|
commit id:"5-abcdefg"
|
||||||
|
commit id:"6-abcdefg"
|
||||||
|
checkout main
|
||||||
|
commit id:"7-abcdefg"
|
||||||
|
commit id:"8-abcdefg"
|
||||||
|
`,
|
||||||
|
{ gitGraph: { parallelCommits: true } }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('72: should render GitGraph with unconnected branches and parallel commits | Vertical Branch - Bottom-to-top', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`gitGraph BT:
|
||||||
|
branch dev
|
||||||
|
branch v2
|
||||||
|
branch feat
|
||||||
|
commit id:"1-abcdefg"
|
||||||
|
commit id:"2-abcdefg"
|
||||||
|
checkout main
|
||||||
|
commit id:"3-abcdefg"
|
||||||
|
checkout dev
|
||||||
|
commit id:"4-abcdefg"
|
||||||
|
checkout v2
|
||||||
|
commit id:"5-abcdefg"
|
||||||
|
checkout main
|
||||||
|
commit id:"6-abcdefg"
|
||||||
|
`,
|
||||||
|
{ gitGraph: { parallelCommits: true } }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('73: should render a simple gitgraph with three branches and tagged merge commit using switch instead of checkout', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`gitGraph
|
||||||
|
commit id: "1"
|
||||||
|
commit id: "2"
|
||||||
|
branch nice_feature
|
||||||
|
switch nice_feature
|
||||||
|
commit id: "3"
|
||||||
|
switch main
|
||||||
|
commit id: "4"
|
||||||
|
switch nice_feature
|
||||||
|
branch very_nice_feature
|
||||||
|
switch very_nice_feature
|
||||||
|
commit id: "5"
|
||||||
|
switch main
|
||||||
|
commit id: "6"
|
||||||
|
switch nice_feature
|
||||||
|
commit id: "7"
|
||||||
|
switch main
|
||||||
|
merge nice_feature id: "12345" tag: "my merge commit"
|
||||||
|
switch very_nice_feature
|
||||||
|
commit id: "8"
|
||||||
|
switch main
|
||||||
|
commit id: "9"
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('74: should render commits for more than 8 branches using switch instead of checkout', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
gitGraph
|
||||||
|
switch main
|
||||||
|
%% Make sure to manually set the ID of all commits, for consistent visual tests
|
||||||
|
commit id: "1-abcdefg"
|
||||||
|
switch main
|
||||||
|
branch branch1
|
||||||
|
commit id: "2-abcdefg"
|
||||||
|
switch main
|
||||||
|
merge branch1
|
||||||
|
branch branch2
|
||||||
|
commit id: "3-abcdefg"
|
||||||
|
switch main
|
||||||
|
merge branch2
|
||||||
|
branch branch3
|
||||||
|
commit id: "4-abcdefg"
|
||||||
|
switch main
|
||||||
|
merge branch3
|
||||||
|
branch branch4
|
||||||
|
commit id: "5-abcdefg"
|
||||||
|
switch main
|
||||||
|
merge branch4
|
||||||
|
branch branch5
|
||||||
|
commit id: "6-abcdefg"
|
||||||
|
switch main
|
||||||
|
merge branch5
|
||||||
|
branch branch6
|
||||||
|
commit id: "7-abcdefg"
|
||||||
|
switch main
|
||||||
|
merge branch6
|
||||||
|
branch branch7
|
||||||
|
commit id: "8-abcdefg"
|
||||||
|
switch main
|
||||||
|
merge branch7
|
||||||
|
branch branch8
|
||||||
|
commit id: "9-abcdefg"
|
||||||
|
switch main
|
||||||
|
merge branch8
|
||||||
|
branch branch9
|
||||||
|
commit id: "10-abcdefg"
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
67
cypress/integration/rendering/packet.spec.ts
Normal file
67
cypress/integration/rendering/packet.spec.ts
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
import { imgSnapshotTest } from '../../helpers/util';
|
||||||
|
|
||||||
|
describe('packet structure', () => {
|
||||||
|
it('should render a simple packet diagram', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`packet-beta
|
||||||
|
title Hello world
|
||||||
|
0-10: "hello"
|
||||||
|
`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render a complex packet diagram', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`packet-beta
|
||||||
|
0-15: "Source Port"
|
||||||
|
16-31: "Destination Port"
|
||||||
|
32-63: "Sequence Number"
|
||||||
|
64-95: "Acknowledgment Number"
|
||||||
|
96-99: "Data Offset"
|
||||||
|
100-105: "Reserved"
|
||||||
|
106: "URG"
|
||||||
|
107: "ACK"
|
||||||
|
108: "PSH"
|
||||||
|
109: "RST"
|
||||||
|
110: "SYN"
|
||||||
|
111: "FIN"
|
||||||
|
112-127: "Window"
|
||||||
|
128-143: "Checksum"
|
||||||
|
144-159: "Urgent Pointer"
|
||||||
|
160-191: "(Options and Padding)"
|
||||||
|
192-223: "data"
|
||||||
|
`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should render a complex packet diagram with showBits false', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
---
|
||||||
|
title: "Packet Diagram"
|
||||||
|
config:
|
||||||
|
packet:
|
||||||
|
showBits: false
|
||||||
|
---
|
||||||
|
packet-beta
|
||||||
|
0-15: "Source Port"
|
||||||
|
16-31: "Destination Port"
|
||||||
|
32-63: "Sequence Number"
|
||||||
|
64-95: "Acknowledgment Number"
|
||||||
|
96-99: "Data Offset"
|
||||||
|
100-105: "Reserved"
|
||||||
|
106: "URG"
|
||||||
|
107: "ACK"
|
||||||
|
108: "PSH"
|
||||||
|
109: "RST"
|
||||||
|
110: "SYN"
|
||||||
|
111: "FIN"
|
||||||
|
112-127: "Window"
|
||||||
|
128-143: "Checksum"
|
||||||
|
144-159: "Urgent Pointer"
|
||||||
|
160-191: "(Options and Padding)"
|
||||||
|
192-223: "data"
|
||||||
|
`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
@@ -1,4 +1,4 @@
|
|||||||
import { imgSnapshotTest, renderGraph } from '../../helpers/util.ts';
|
import { imgSnapshotTest } from '../../helpers/util.ts';
|
||||||
|
|
||||||
describe('Quadrant Chart', () => {
|
describe('Quadrant Chart', () => {
|
||||||
it('should render if only chart type is provided', () => {
|
it('should render if only chart type is provided', () => {
|
||||||
@@ -8,7 +8,6 @@ describe('Quadrant Chart', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should render a complete quadrant chart', () => {
|
it('should render a complete quadrant chart', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -30,7 +29,6 @@ describe('Quadrant Chart', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should render without points', () => {
|
it('should render without points', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -46,7 +44,6 @@ describe('Quadrant Chart', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should able to render y-axix on right side', () => {
|
it('should able to render y-axix on right side', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -63,7 +60,6 @@ describe('Quadrant Chart', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should able to render x-axix on bottom', () => {
|
it('should able to render x-axix on bottom', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -80,7 +76,6 @@ describe('Quadrant Chart', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should able to render x-axix on bottom and y-axis on right', () => {
|
it('should able to render x-axix on bottom and y-axis on right', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -97,7 +92,6 @@ describe('Quadrant Chart', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should render without title', () => {
|
it('should render without title', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -112,7 +106,6 @@ describe('Quadrant Chart', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should use all the config', () => {
|
it('should use all the config', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -135,7 +128,6 @@ describe('Quadrant Chart', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should use all the theme variable', () => {
|
it('should use all the theme variable', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -158,7 +150,6 @@ describe('Quadrant Chart', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should render x-axis labels in the center, if x-axis has two labels', () => {
|
it('should render x-axis labels in the center, if x-axis has two labels', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -180,7 +171,6 @@ describe('Quadrant Chart', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should render y-axis labels in the center, if y-axis has two labels', () => {
|
it('should render y-axis labels in the center, if y-axis has two labels', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -202,7 +192,6 @@ describe('Quadrant Chart', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should render both axes labels on the left and bottom, if both axes have only one label', () => {
|
it('should render both axes labels on the left and bottom, if both axes have only one label', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -224,6 +213,52 @@ describe('Quadrant Chart', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
});
|
||||||
|
|
||||||
|
it('it should render data points with styles', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
quadrantChart
|
||||||
|
title Reach and engagement of campaigns
|
||||||
|
x-axis Reach -->
|
||||||
|
y-axis Engagement -->
|
||||||
|
quadrant-1 We should expand
|
||||||
|
quadrant-2 Need to promote
|
||||||
|
quadrant-3 Re-evaluate
|
||||||
|
quadrant-4 May be improved
|
||||||
|
Campaign A: [0.3, 0.6] radius: 20
|
||||||
|
Campaign B: [0.45, 0.23] color: #ff0000
|
||||||
|
Campaign C: [0.57, 0.69] stroke-color: #ff00ff
|
||||||
|
Campaign D: [0.78, 0.34] stroke-width: 3px
|
||||||
|
Campaign E: [0.40, 0.34] radius: 20, color: #ff0000 , stroke-color : #ff00ff, stroke-width : 3px
|
||||||
|
Campaign F: [0.35, 0.78] stroke-width: 3px , color: #ff0000, radius: 20, stroke-color: #ff00ff
|
||||||
|
Campaign G: [0.22, 0.22] stroke-width: 3px , color: #309708 , radius : 20 , stroke-color: #5060ff
|
||||||
|
Campaign H: [0.22, 0.44]
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('it should render data points with styles + classes', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
quadrantChart
|
||||||
|
title Reach and engagement of campaigns
|
||||||
|
x-axis Reach -->
|
||||||
|
y-axis Engagement -->
|
||||||
|
quadrant-1 We should expand
|
||||||
|
quadrant-2 Need to promote
|
||||||
|
quadrant-3 Re-evaluate
|
||||||
|
quadrant-4 May be improved
|
||||||
|
Campaign A:::class1: [0.3, 0.6] radius: 20
|
||||||
|
Campaign B: [0.45, 0.23] color: #ff0000
|
||||||
|
Campaign C: [0.57, 0.69] stroke-color: #ff00ff
|
||||||
|
Campaign D:::class2: [0.78, 0.34] stroke-width: 3px
|
||||||
|
Campaign E:::class2: [0.40, 0.34] radius: 20, color: #ff0000, stroke-color: #ff00ff, stroke-width: 3px
|
||||||
|
Campaign F:::class1: [0.35, 0.78]
|
||||||
|
classDef class1 color: #908342, radius : 10, stroke-color: #310085, stroke-width: 10px
|
||||||
|
classDef class2 color: #f00fff, radius : 10
|
||||||
|
`
|
||||||
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@@ -44,6 +44,5 @@ describe('Requirement diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@@ -1,8 +1,6 @@
|
|||||||
/// <reference types="Cypress" />
|
|
||||||
|
|
||||||
import { imgSnapshotTest, renderGraph } from '../../helpers/util.ts';
|
import { imgSnapshotTest, renderGraph } from '../../helpers/util.ts';
|
||||||
|
|
||||||
context('Sequence diagram', () => {
|
describe('Sequence diagram', () => {
|
||||||
it('should render a sequence diagram with boxes', () => {
|
it('should render a sequence diagram with boxes', () => {
|
||||||
renderGraph(
|
renderGraph(
|
||||||
`
|
`
|
||||||
@@ -68,6 +66,19 @@ context('Sequence diagram', () => {
|
|||||||
{ sequence: { actorFontFamily: 'courier' } }
|
{ sequence: { actorFontFamily: 'courier' } }
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
it('should render bidirectional arrows', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
sequenceDiagram
|
||||||
|
Alice<<->>John: Hello John, how are you?
|
||||||
|
Alice<<-->>John: Hi Alice, I can hear you!
|
||||||
|
John<<->>Alice: This also works the other way
|
||||||
|
John<<-->>Alice: Yes
|
||||||
|
Alice->John: Test
|
||||||
|
John->>Alice: Still works
|
||||||
|
`
|
||||||
|
);
|
||||||
|
});
|
||||||
it('should handle different line breaks', () => {
|
it('should handle different line breaks', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`
|
||||||
@@ -231,7 +242,7 @@ context('Sequence diagram', () => {
|
|||||||
`
|
`
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
context('font settings', () => {
|
describe('font settings', () => {
|
||||||
it('should render different note fonts when configured', () => {
|
it('should render different note fonts when configured', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`
|
||||||
@@ -328,7 +339,7 @@ context('Sequence diagram', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
context('auth width scaling', () => {
|
describe('auth width scaling', () => {
|
||||||
it('should render long actor descriptions', () => {
|
it('should render long actor descriptions', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`
|
||||||
@@ -375,7 +386,7 @@ context('Sequence diagram', () => {
|
|||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
it('should have actor-top and actor-bottom classes on top and bottom actor box and symbol', () => {
|
it('should have actor-top and actor-bottom classes on top and bottom actor box and symbol and actor-box and actor-man classes for text tags', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`
|
||||||
sequenceDiagram
|
sequenceDiagram
|
||||||
@@ -394,6 +405,9 @@ context('Sequence diagram', () => {
|
|||||||
cy.get('.actor-man').should('have.class', 'actor-bottom');
|
cy.get('.actor-man').should('have.class', 'actor-bottom');
|
||||||
cy.get('.actor.actor-bottom').should('not.have.class', 'actor-top');
|
cy.get('.actor.actor-bottom').should('not.have.class', 'actor-top');
|
||||||
cy.get('.actor-man.actor-bottom').should('not.have.class', 'actor-top');
|
cy.get('.actor-man.actor-bottom').should('not.have.class', 'actor-top');
|
||||||
|
|
||||||
|
cy.get('text.actor-box').should('include.text', 'Alice');
|
||||||
|
cy.get('text.actor-man').should('include.text', 'Bob');
|
||||||
});
|
});
|
||||||
it('should render long notes left of actor', () => {
|
it('should render long notes left of actor', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -461,6 +475,18 @@ context('Sequence diagram', () => {
|
|||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
it('should render notes over actors and participant', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
sequenceDiagram
|
||||||
|
actor Alice
|
||||||
|
participant Charlie
|
||||||
|
note over Alice: some note
|
||||||
|
note over Charlie: other note
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
it('should render long messages from an actor to the left to one to the right', () => {
|
it('should render long messages from an actor to the left to one to the right', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`
|
||||||
@@ -502,7 +528,7 @@ context('Sequence diagram', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
context('background rects', () => {
|
describe('background rects', () => {
|
||||||
it('should render a single and nested rects', () => {
|
it('should render a single and nested rects', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`
|
||||||
@@ -782,7 +808,7 @@ context('Sequence diagram', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
context('directives', () => {
|
describe('directives', () => {
|
||||||
it('should override config with directive settings', () => {
|
it('should override config with directive settings', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`
|
||||||
@@ -807,11 +833,14 @@ context('Sequence diagram', () => {
|
|||||||
note left of Alice: config: mirrorActors=true<br/>directive: mirrorActors=false
|
note left of Alice: config: mirrorActors=true<br/>directive: mirrorActors=false
|
||||||
Bob->>Alice: Short as well
|
Bob->>Alice: Short as well
|
||||||
`,
|
`,
|
||||||
{ logLevel: 0, sequence: { mirrorActors: true, noteFontSize: 18, noteFontFamily: 'Arial' } }
|
{
|
||||||
|
logLevel: 0,
|
||||||
|
sequence: { mirrorActors: true, noteFontSize: 18, noteFontFamily: 'Arial' },
|
||||||
|
}
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
context('links', () => {
|
describe('links', () => {
|
||||||
it('should support actor links', () => {
|
it('should support actor links', () => {
|
||||||
renderGraph(
|
renderGraph(
|
||||||
`
|
`
|
||||||
@@ -827,7 +856,7 @@ context('Sequence diagram', () => {
|
|||||||
);
|
);
|
||||||
cy.get('#actor0_popup').should((popupMenu) => {
|
cy.get('#actor0_popup').should((popupMenu) => {
|
||||||
const style = popupMenu.attr('style');
|
const style = popupMenu.attr('style');
|
||||||
expect(style).to.undefined;
|
// expect(style).to.undefined;
|
||||||
});
|
});
|
||||||
cy.get('#root-0').click();
|
cy.get('#root-0').click();
|
||||||
cy.get('#actor0_popup').should((popupMenu) => {
|
cy.get('#actor0_popup').should((popupMenu) => {
|
||||||
@@ -858,7 +887,10 @@ context('Sequence diagram', () => {
|
|||||||
a->>j: Hello John, how are you?
|
a->>j: Hello John, how are you?
|
||||||
j-->>a: Great!
|
j-->>a: Great!
|
||||||
`,
|
`,
|
||||||
{ logLevel: 0, sequence: { mirrorActors: true, noteFontSize: 18, noteFontFamily: 'Arial' } }
|
{
|
||||||
|
logLevel: 0,
|
||||||
|
sequence: { mirrorActors: true, noteFontSize: 18, noteFontFamily: 'Arial' },
|
||||||
|
}
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
it('should support actor links and properties when not mirrored EXPERIMENTAL: USE WITH CAUTION', () => {
|
it('should support actor links and properties when not mirrored EXPERIMENTAL: USE WITH CAUTION', () => {
|
||||||
@@ -899,7 +931,7 @@ context('Sequence diagram', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
context('svg size', () => {
|
describe('svg size', () => {
|
||||||
it('should render a sequence diagram when useMaxWidth is true (default)', () => {
|
it('should render a sequence diagram when useMaxWidth is true (default)', () => {
|
||||||
renderGraph(
|
renderGraph(
|
||||||
`
|
`
|
||||||
@@ -978,7 +1010,7 @@ context('Sequence diagram', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
context('render after error', () => {
|
describe('render after error', () => {
|
||||||
it('should render diagram after fixing destroy participant error', () => {
|
it('should render diagram after fixing destroy participant error', () => {
|
||||||
cy.on('uncaught:exception', (err) => {
|
cy.on('uncaught:exception', (err) => {
|
||||||
return false;
|
return false;
|
||||||
|
@@ -8,7 +8,6 @@ describe('State diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{ logLevel: 1, fontFamily: 'courier' }
|
{ logLevel: 1, fontFamily: 'courier' }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('v2 should render a simple state diagrams', () => {
|
it('v2 should render a simple state diagrams', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -20,7 +19,6 @@ describe('State diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{ logLevel: 0, fontFamily: 'courier' }
|
{ logLevel: 0, fontFamily: 'courier' }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('v2 should render a long descriptions instead of id when available', () => {
|
it('v2 should render a long descriptions instead of id when available', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -32,7 +30,6 @@ describe('State diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{ logLevel: 0, fontFamily: 'courier' }
|
{ logLevel: 0, fontFamily: 'courier' }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('v2 should render a long descriptions with additional descriptions', () => {
|
it('v2 should render a long descriptions with additional descriptions', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -44,7 +41,6 @@ describe('State diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{ logLevel: 0, fontFamily: 'courier' }
|
{ logLevel: 0, fontFamily: 'courier' }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('v2 should render a single state with short descriptions', () => {
|
it('v2 should render a single state with short descriptions', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -55,7 +51,6 @@ describe('State diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{ logLevel: 0, fontFamily: 'courier' }
|
{ logLevel: 0, fontFamily: 'courier' }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('v2 should render a transition descriptions with new lines', () => {
|
it('v2 should render a transition descriptions with new lines', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -69,7 +64,6 @@ describe('State diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{ logLevel: 0, fontFamily: 'courier' }
|
{ logLevel: 0, fontFamily: 'courier' }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('v2 should render a state with a note', () => {
|
it('v2 should render a state with a note', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -83,7 +77,6 @@ describe('State diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{ logLevel: 0, fontFamily: 'courier' }
|
{ logLevel: 0, fontFamily: 'courier' }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('v2 should render a state with on the left side when so specified', () => {
|
it('v2 should render a state with on the left side when so specified', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -97,7 +90,6 @@ describe('State diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{ logLevel: 0, fontFamily: 'courier' }
|
{ logLevel: 0, fontFamily: 'courier' }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('v2 should render a state with a note together with another state', () => {
|
it('v2 should render a state with a note together with another state', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -113,7 +105,6 @@ describe('State diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{ logLevel: 0, fontFamily: 'courier' }
|
{ logLevel: 0, fontFamily: 'courier' }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('v2 should render a note with multiple lines in it', () => {
|
it('v2 should render a note with multiple lines in it', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -156,7 +147,6 @@ describe('State diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{ logLevel: 0, fontFamily: 'courier' }
|
{ logLevel: 0, fontFamily: 'courier' }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('v2 should render a simple state diagrams 2', () => {
|
it('v2 should render a simple state diagrams 2', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -169,7 +159,6 @@ describe('State diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{ logLevel: 0, fontFamily: 'courier' }
|
{ logLevel: 0, fontFamily: 'courier' }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('v2 should render a simple state diagrams with labels', () => {
|
it('v2 should render a simple state diagrams with labels', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -185,7 +174,6 @@ describe('State diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{ logLevel: 0, fontFamily: 'courier' }
|
{ logLevel: 0, fontFamily: 'courier' }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('v2 should render state descriptions', () => {
|
it('v2 should render state descriptions', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -198,7 +186,6 @@ describe('State diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{ logLevel: 0, fontFamily: 'courier' }
|
{ logLevel: 0, fontFamily: 'courier' }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('v2 should render composite states', () => {
|
it('v2 should render composite states', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -217,7 +204,6 @@ describe('State diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{ logLevel: 0, fontFamily: 'courier' }
|
{ logLevel: 0, fontFamily: 'courier' }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('v2 should render multiple composite states', () => {
|
it('v2 should render multiple composite states', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -287,7 +273,6 @@ describe('State diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{ logLevel: 0, fontFamily: 'courier' }
|
{ logLevel: 0, fontFamily: 'courier' }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('v2 should render concurrency states', () => {
|
it('v2 should render concurrency states', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -311,7 +296,6 @@ describe('State diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{ logLevel: 0, fontFamily: 'courier' }
|
{ logLevel: 0, fontFamily: 'courier' }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('v2 should render a state with states in it', () => {
|
it('v2 should render a state with states in it', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -558,6 +542,43 @@ stateDiagram-v2
|
|||||||
{ logLevel: 0, fontFamily: 'courier' }
|
{ logLevel: 0, fontFamily: 'courier' }
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
it(' can have styles applied ', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
stateDiagram-v2
|
||||||
|
AState
|
||||||
|
style AState fill:#636,border:1px solid red,color:white;
|
||||||
|
`,
|
||||||
|
{ logLevel: 0, fontFamily: 'courier' }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it(' should let styles take preceedence over classes', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
stateDiagram-v2
|
||||||
|
AState: Should NOT be white
|
||||||
|
BState
|
||||||
|
classDef exampleStyleClass fill:#fff,color: blue;
|
||||||
|
class AState,BState exampleStyleClass
|
||||||
|
style AState fill:#636,border:1px solid red,color:white;
|
||||||
|
`,
|
||||||
|
{ logLevel: 0, fontFamily: 'courier' }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it(' should allow styles to take effect in stubgraphs', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
stateDiagram
|
||||||
|
state roundWithTitle {
|
||||||
|
C: Black with white text
|
||||||
|
}
|
||||||
|
D: Black with white text
|
||||||
|
|
||||||
|
style C,D stroke:#00f, fill:black, color:white
|
||||||
|
`,
|
||||||
|
{ logLevel: 0, fontFamily: 'courier' }
|
||||||
|
);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
it('1433: should render a simple state diagram with a title', () => {
|
it('1433: should render a simple state diagram with a title', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
|
@@ -10,7 +10,6 @@ describe('State diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{ logLevel: 0, fontFamily: 'courier' }
|
{ logLevel: 0, fontFamily: 'courier' }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should render a long descriptions instead of id when available', () => {
|
it('should render a long descriptions instead of id when available', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -22,7 +21,6 @@ describe('State diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{ logLevel: 0, fontFamily: 'courier' }
|
{ logLevel: 0, fontFamily: 'courier' }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should render a long descriptions with additional descriptions', () => {
|
it('should render a long descriptions with additional descriptions', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -34,7 +32,6 @@ describe('State diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{ logLevel: 0, fontFamily: 'courier' }
|
{ logLevel: 0, fontFamily: 'courier' }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should render a single state with short descriptions', () => {
|
it('should render a single state with short descriptions', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -45,7 +42,6 @@ describe('State diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{ logLevel: 0, fontFamily: 'courier' }
|
{ logLevel: 0, fontFamily: 'courier' }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should render a transition descriptions with new lines', () => {
|
it('should render a transition descriptions with new lines', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -59,7 +55,6 @@ describe('State diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{ logLevel: 0, fontFamily: 'courier' }
|
{ logLevel: 0, fontFamily: 'courier' }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should render a state with a note', () => {
|
it('should render a state with a note', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -73,7 +68,6 @@ describe('State diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{ logLevel: 0, fontFamily: 'courier' }
|
{ logLevel: 0, fontFamily: 'courier' }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should render a state with on the left side when so specified', () => {
|
it('should render a state with on the left side when so specified', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -87,7 +81,6 @@ describe('State diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{ logLevel: 0, fontFamily: 'courier' }
|
{ logLevel: 0, fontFamily: 'courier' }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should render a state with a note together with another state', () => {
|
it('should render a state with a note together with another state', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -103,7 +96,6 @@ describe('State diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{ logLevel: 0, fontFamily: 'courier' }
|
{ logLevel: 0, fontFamily: 'courier' }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should render a note with multiple lines in it', () => {
|
it('should render a note with multiple lines in it', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -146,7 +138,6 @@ describe('State diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{ logLevel: 0, fontFamily: 'courier' }
|
{ logLevel: 0, fontFamily: 'courier' }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should render a simple state diagrams 2', () => {
|
it('should render a simple state diagrams 2', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -159,7 +150,6 @@ describe('State diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{ logLevel: 0, fontFamily: 'courier' }
|
{ logLevel: 0, fontFamily: 'courier' }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should render a simple state diagrams with labels', () => {
|
it('should render a simple state diagrams with labels', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -175,7 +165,6 @@ describe('State diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{ logLevel: 0, fontFamily: 'courier' }
|
{ logLevel: 0, fontFamily: 'courier' }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should render state descriptions', () => {
|
it('should render state descriptions', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -188,7 +177,6 @@ describe('State diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{ logLevel: 0, fontFamily: 'courier' }
|
{ logLevel: 0, fontFamily: 'courier' }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should render composite states', () => {
|
it('should render composite states', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -207,7 +195,6 @@ describe('State diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{ logLevel: 0, fontFamily: 'courier' }
|
{ logLevel: 0, fontFamily: 'courier' }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should render multiple composit states', () => {
|
it('should render multiple composit states', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -277,7 +264,6 @@ describe('State diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{ logLevel: 0, fontFamily: 'courier' }
|
{ logLevel: 0, fontFamily: 'courier' }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should render concurrency states', () => {
|
it('should render concurrency states', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -301,7 +287,6 @@ describe('State diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{ logLevel: 0, fontFamily: 'courier' }
|
{ logLevel: 0, fontFamily: 'courier' }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should render a state with states in it', () => {
|
it('should render a state with states in it', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
|
@@ -10,7 +10,6 @@ describe('themeCSS balancing, it', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should not allow unbalanced CSS definitions 2', () => {
|
it('should not allow unbalanced CSS definitions 2', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -21,7 +20,6 @@ describe('themeCSS balancing, it', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -45,7 +43,6 @@ describe('Pie Chart', () => {
|
|||||||
`,
|
`,
|
||||||
{ theme }
|
{ theme }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should render a flowchart diagram', () => {
|
it('should render a flowchart diagram', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -70,7 +67,6 @@ describe('Pie Chart', () => {
|
|||||||
`,
|
`,
|
||||||
{ theme }
|
{ theme }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should render a new flowchart diagram', () => {
|
it('should render a new flowchart diagram', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -96,7 +92,6 @@ describe('Pie Chart', () => {
|
|||||||
`,
|
`,
|
||||||
{ theme }
|
{ theme }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should render a sequence diagram', () => {
|
it('should render a sequence diagram', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -125,7 +120,6 @@ describe('Pie Chart', () => {
|
|||||||
`,
|
`,
|
||||||
{ theme }
|
{ theme }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should render a class diagram', () => {
|
it('should render a class diagram', () => {
|
||||||
@@ -175,7 +169,6 @@ describe('Pie Chart', () => {
|
|||||||
`,
|
`,
|
||||||
{ theme }
|
{ theme }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should render a state diagram', () => {
|
it('should render a state diagram', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -210,7 +203,6 @@ stateDiagram
|
|||||||
`,
|
`,
|
||||||
{ theme }
|
{ theme }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should render a state diagram (v2)', () => {
|
it('should render a state diagram (v2)', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -245,7 +237,6 @@ stateDiagram-v2
|
|||||||
`,
|
`,
|
||||||
{ theme }
|
{ theme }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should render a er diagram', () => {
|
it('should render a er diagram', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -266,7 +257,6 @@ erDiagram
|
|||||||
`,
|
`,
|
||||||
{ theme }
|
{ theme }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should render a user journey diagram', () => {
|
it('should render a user journey diagram', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -287,7 +277,6 @@ erDiagram
|
|||||||
`,
|
`,
|
||||||
{ theme }
|
{ theme }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should render a gantt diagram', () => {
|
it('should render a gantt diagram', () => {
|
||||||
cy.clock(new Date('2014-01-06').getTime());
|
cy.clock(new Date('2014-01-06').getTime());
|
||||||
@@ -326,7 +315,6 @@ erDiagram
|
|||||||
`,
|
`,
|
||||||
{ theme }
|
{ theme }
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@@ -9,7 +9,6 @@ describe('XY Chart', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('Should render a complete chart', () => {
|
it('Should render a complete chart', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -35,7 +34,6 @@ describe('XY Chart', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('y-axis title not required', () => {
|
it('y-axis title not required', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -48,7 +46,6 @@ describe('XY Chart', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('Should render a chart without y-axis with different range', () => {
|
it('Should render a chart without y-axis with different range', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -60,7 +57,6 @@ describe('XY Chart', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('x axis title not required', () => {
|
it('x axis title not required', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -72,7 +68,6 @@ describe('XY Chart', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('Multiple plots can be rendered', () => {
|
it('Multiple plots can be rendered', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -87,7 +82,6 @@ describe('XY Chart', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('Decimals and negative numbers are supported', () => {
|
it('Decimals and negative numbers are supported', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -98,7 +92,6 @@ describe('XY Chart', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('Render spark line with "plotReservedSpacePercent"', () => {
|
it('Render spark line with "plotReservedSpacePercent"', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -116,7 +109,6 @@ describe('XY Chart', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('Render spark bar without displaying other property', () => {
|
it('Render spark bar without displaying other property', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -143,7 +135,6 @@ describe('XY Chart', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('Should use all the config from directive', () => {
|
it('Should use all the config from directive', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -158,7 +149,6 @@ describe('XY Chart', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('Should use all the config from yaml', () => {
|
it('Should use all the config from yaml', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -199,7 +189,6 @@ describe('XY Chart', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('Render with show axis title false', () => {
|
it('Render with show axis title false', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -221,7 +210,6 @@ describe('XY Chart', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('Render with show axis label false', () => {
|
it('Render with show axis label false', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -243,7 +231,6 @@ describe('XY Chart', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('Render with show axis tick false', () => {
|
it('Render with show axis tick false', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -265,7 +252,6 @@ describe('XY Chart', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('Render with show axis line false', () => {
|
it('Render with show axis line false', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -287,7 +273,6 @@ describe('XY Chart', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('Render all the theme color', () => {
|
it('Render all the theme color', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
@@ -317,6 +302,17 @@ describe('XY Chart', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
|
});
|
||||||
|
it('should use the correct distances between data points', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
xychart-beta
|
||||||
|
x-axis 0 --> 2
|
||||||
|
line [0, 1, 0, 1]
|
||||||
|
bar [1, 0, 1, 0]
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
cy.get('svg');
|
cy.get('svg');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@@ -4,7 +4,7 @@
|
|||||||
<link href="https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" rel="stylesheet" />
|
<link href="https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" rel="stylesheet" />
|
||||||
<link
|
<link
|
||||||
rel="stylesheet"
|
rel="stylesheet"
|
||||||
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"
|
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/font-awesome.min.css"
|
||||||
/>
|
/>
|
||||||
<link
|
<link
|
||||||
href="https://cdn.jsdelivr.net/npm/@mdi/font@6.9.96/css/materialdesignicons.min.css"
|
href="https://cdn.jsdelivr.net/npm/@mdi/font@6.9.96/css/materialdesignicons.min.css"
|
||||||
@@ -33,7 +33,9 @@
|
|||||||
background-image: radial-gradient(#fff 1%, transparent 11%),
|
background-image: radial-gradient(#fff 1%, transparent 11%),
|
||||||
radial-gradient(#fff 1%, transparent 11%);
|
radial-gradient(#fff 1%, transparent 11%);
|
||||||
background-size: 20px 20px;
|
background-size: 20px 20px;
|
||||||
background-position: 0 0, 10px 10px;
|
background-position:
|
||||||
|
0 0,
|
||||||
|
10px 10px;
|
||||||
background-repeat: repeat;
|
background-repeat: repeat;
|
||||||
}
|
}
|
||||||
.malware {
|
.malware {
|
||||||
|
@@ -27,7 +27,7 @@ const code3 = `flowchart TD
|
|||||||
A(<img scr='https://iconscout.com/ms-icon-310x310.png' width='20' height='20' />)
|
A(<img scr='https://iconscout.com/ms-icon-310x310.png' width='20' height='20' />)
|
||||||
B(<b>Bold text!</b>)`;
|
B(<b>Bold text!</b>)`;
|
||||||
|
|
||||||
if (location.href.match('test-html-escaping')) {
|
if (/test-html-escaping/.exec(location.href)) {
|
||||||
code = code3;
|
code = code3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
<link href="https://fonts.googleapis.com/css?family=Montserrat&display=swap" rel="stylesheet" />
|
<link href="https://fonts.googleapis.com/css?family=Montserrat&display=swap" rel="stylesheet" />
|
||||||
<link
|
<link
|
||||||
rel="stylesheet"
|
rel="stylesheet"
|
||||||
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"
|
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/font-awesome.min.css"
|
||||||
/>
|
/>
|
||||||
<link
|
<link
|
||||||
href="https://fonts.googleapis.com/css?family=Noto+Sans+SC&display=swap"
|
href="https://fonts.googleapis.com/css?family=Noto+Sans+SC&display=swap"
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
<!DOCTYPE html>
|
<!doctype html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
<!DOCTYPE html>
|
<!doctype html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
<!DOCTYPE html>
|
<!doctype html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
<!DOCTYPE html>
|
<!doctype html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
<!DOCTYPE html>
|
<!doctype html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
|
@@ -4,7 +4,7 @@
|
|||||||
<link href="https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" rel="stylesheet" />
|
<link href="https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" rel="stylesheet" />
|
||||||
<link
|
<link
|
||||||
rel="stylesheet"
|
rel="stylesheet"
|
||||||
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"
|
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/font-awesome.min.css"
|
||||||
/>
|
/>
|
||||||
<link
|
<link
|
||||||
href="https://fonts.googleapis.com/css?family=Noto+Sans+SC&display=swap"
|
href="https://fonts.googleapis.com/css?family=Noto+Sans+SC&display=swap"
|
||||||
|
@@ -4,7 +4,7 @@
|
|||||||
<link href="https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" rel="stylesheet" />
|
<link href="https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" rel="stylesheet" />
|
||||||
<link
|
<link
|
||||||
rel="stylesheet"
|
rel="stylesheet"
|
||||||
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"
|
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/font-awesome.min.css"
|
||||||
/>
|
/>
|
||||||
<link
|
<link
|
||||||
href="https://fonts.googleapis.com/css?family=Noto+Sans+SC&display=swap"
|
href="https://fonts.googleapis.com/css?family=Noto+Sans+SC&display=swap"
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<script src="./viewer.js" type="module"></script>
|
<script type="module" src="./viewer.js"></script>
|
||||||
<link
|
<link
|
||||||
href="https://fonts.googleapis.com/css?family=Noto+Sans+SC&display=swap"
|
href="https://fonts.googleapis.com/css?family=Noto+Sans+SC&display=swap"
|
||||||
rel="stylesheet"
|
rel="stylesheet"
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
<!DOCTYPE html>
|
<!doctype html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8" />
|
<meta charset="UTF-8" />
|
||||||
|
@@ -11,8 +11,7 @@ example-diagram
|
|||||||
<!-- <script src="//cdn.jsdelivr.net/npm/mermaid@9.1.7/dist/mermaid.min.js"></script> -->
|
<!-- <script src="//cdn.jsdelivr.net/npm/mermaid@9.1.7/dist/mermaid.min.js"></script> -->
|
||||||
<!-- <script type="module" src="./external-diagrams-mindmap.mjs" /> -->
|
<!-- <script type="module" src="./external-diagrams-mindmap.mjs" /> -->
|
||||||
<script type="module">
|
<script type="module">
|
||||||
import exampleDiagram from '../../packages/mermaid-example-diagram/dist/mermaid-example-diagram.core.mjs';
|
import exampleDiagram from './mermaid-example-diagram.esm.mjs';
|
||||||
// import example from '../../packages/mermaid-example-diagram/src/detector';
|
|
||||||
import mermaid from './mermaid.esm.mjs';
|
import mermaid from './mermaid.esm.mjs';
|
||||||
|
|
||||||
await mermaid.registerExternalDiagrams([exampleDiagram]);
|
await mermaid.registerExternalDiagrams([exampleDiagram]);
|
||||||
|
28
cypress/platform/flow-elk.html
Normal file
28
cypress/platform/flow-elk.html
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
<html>
|
||||||
|
<body>
|
||||||
|
<pre class="mermaid">
|
||||||
|
flowchart-elk
|
||||||
|
a[hello] --> b[world]
|
||||||
|
b --> c{test}
|
||||||
|
c --> one
|
||||||
|
c --> two
|
||||||
|
c --> three
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<script type="module">
|
||||||
|
import mermaid from './mermaid.esm.mjs';
|
||||||
|
import elk from './mermaid-flowchart-elk.esm.min.mjs';
|
||||||
|
if (window.location.search.includes('elk')) {
|
||||||
|
await mermaid.registerExternalDiagrams([elk]);
|
||||||
|
}
|
||||||
|
mermaid.initialize({
|
||||||
|
logLevel: 3,
|
||||||
|
startOnLoad: false,
|
||||||
|
});
|
||||||
|
await mermaid.run();
|
||||||
|
if (window.Cypress) {
|
||||||
|
window.rendered = true;
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
866
cypress/platform/flowchart-refactor.html
Normal file
866
cypress/platform/flowchart-refactor.html
Normal file
@@ -0,0 +1,866 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link href="https://fonts.googleapis.com/css?family=Montserrat&display=swap" rel="stylesheet" />
|
||||||
|
<link href="https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" rel="stylesheet" />
|
||||||
|
<link
|
||||||
|
rel="stylesheet"
|
||||||
|
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"
|
||||||
|
/>
|
||||||
|
<link
|
||||||
|
href="https://cdn.jsdelivr.net/npm/@mdi/font@6.9.96/css/materialdesignicons.min.css"
|
||||||
|
rel="stylesheet"
|
||||||
|
/>
|
||||||
|
<link
|
||||||
|
href="https://fonts.googleapis.com/css?family=Noto+Sans+SC&display=swap"
|
||||||
|
rel="stylesheet"
|
||||||
|
/>
|
||||||
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||||
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
||||||
|
<link
|
||||||
|
href="https://fonts.googleapis.com/css2?family=Kalam:wght@300;400;700&display=swap"
|
||||||
|
rel="stylesheet"
|
||||||
|
/>
|
||||||
|
<link
|
||||||
|
href="https://fonts.googleapis.com/css2?family=Caveat:wght@400..700&family=Kalam:wght@300;400;700&family=Rubik+Mono+One&display=swap"
|
||||||
|
rel="stylesheet"
|
||||||
|
/>
|
||||||
|
<link
|
||||||
|
href="https://fonts.googleapis.com/css2?family=Kalam:wght@300;400;700&family=Rubik+Mono+One&display=swap"
|
||||||
|
rel="stylesheet"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
font-family: 'Arial';
|
||||||
|
}
|
||||||
|
|
||||||
|
table {
|
||||||
|
width: 100%;
|
||||||
|
border-collapse: collapse;
|
||||||
|
table-layout: fixed;
|
||||||
|
}
|
||||||
|
|
||||||
|
th,
|
||||||
|
td {
|
||||||
|
border: 1px solid black;
|
||||||
|
padding: 10px;
|
||||||
|
text-align: center;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.separator {
|
||||||
|
height: 20px;
|
||||||
|
background-color: #f0f0f0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vertical-header {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.collapsible {
|
||||||
|
background-color: #f9f9f9;
|
||||||
|
color: #444;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 18px;
|
||||||
|
width: 100%;
|
||||||
|
border: none;
|
||||||
|
text-align: left;
|
||||||
|
outline: none;
|
||||||
|
font-size: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.active,
|
||||||
|
.collapsible:hover {
|
||||||
|
background-color: #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
.collapsible:after {
|
||||||
|
content: '\002B';
|
||||||
|
color: #777;
|
||||||
|
font-weight: bold;
|
||||||
|
float: right;
|
||||||
|
margin-left: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.active:after {
|
||||||
|
content: '\2212';
|
||||||
|
}
|
||||||
|
|
||||||
|
.content {
|
||||||
|
padding: 0 5px;
|
||||||
|
max-height: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
transition: max-height 0.2s ease-out;
|
||||||
|
background-color: #f1f1f1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content .pre-scrollable {
|
||||||
|
max-height: 200px;
|
||||||
|
overflow-y: scroll;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<th></th>
|
||||||
|
<!-- Placeholder for the top left corner -->
|
||||||
|
<th>Dagre</th>
|
||||||
|
<th>Dagre with rough</th>
|
||||||
|
<th>ELK</th>
|
||||||
|
<th>ELK with rough</th>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th class="vertical-header">
|
||||||
|
<button class="collapsible">Stadium shape</button>
|
||||||
|
<div class="content">
|
||||||
|
<div class="pre-scrollable">
|
||||||
|
<pre>
|
||||||
|
flowchart LR
|
||||||
|
id1([This is the text in the box])
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</th>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram1" class="mermaid">
|
||||||
|
flowchart LR
|
||||||
|
id1([This is the text in the box])
|
||||||
|
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram2" class="mermaid">
|
||||||
|
%%{init: {"look": "handdrawn"} }%%
|
||||||
|
flowchart LR
|
||||||
|
id1([This is the text in the box])
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram3" class="mermaid">
|
||||||
|
%%{init: {"handdrawn": false, "layout": "elk"} }%%
|
||||||
|
flowchart LR
|
||||||
|
id1([This is the text in the box])
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram4" class="mermaid">
|
||||||
|
%%{init: {"look": "handdrawn", "layout": "elk"} }%%
|
||||||
|
flowchart LR
|
||||||
|
id1([This is the text in the box])
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<!-- Separator row -->
|
||||||
|
<tr class="separator">
|
||||||
|
<td colspan="5"></td>
|
||||||
|
<!-- This cell spans all columns including the vertical header -->
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<th class="vertical-header">
|
||||||
|
<button class="collapsible">Sub-Routine shape</button>
|
||||||
|
<div class="content">
|
||||||
|
<div class="pre-scrollable">
|
||||||
|
<pre>
|
||||||
|
flowchart LR
|
||||||
|
id1[[This is the text in the box]]
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</th>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram5" class="mermaid">
|
||||||
|
flowchart LR
|
||||||
|
id1[[This is the text in the box]]
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram6" class="mermaid">
|
||||||
|
%%{init: {"look": "handdrawn"} }%%
|
||||||
|
flowchart LR
|
||||||
|
id1[[This is the text in the box]]
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram7" class="mermaid">
|
||||||
|
%%{init: {"handdrawn": false, "layout": "elk"} }%%
|
||||||
|
flowchart LR
|
||||||
|
id1[[This is the text in the box]]
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram8" class="mermaid">
|
||||||
|
%%{init: {"look": "handdrawn", "layout": "elk"} }%%
|
||||||
|
flowchart LR
|
||||||
|
id1[[This is the text in the box]]
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<!-- Separator row -->
|
||||||
|
<tr class="separator">
|
||||||
|
<td colspan="5"></td>
|
||||||
|
<!-- This cell spans all columns including the vertical header -->
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<th class="vertical-header">
|
||||||
|
<button class="collapsible">Cylindrical shape</button>
|
||||||
|
<div class="content">
|
||||||
|
<div class="pre-scrollable">
|
||||||
|
<pre>
|
||||||
|
flowchart LR
|
||||||
|
id1[(Database)]
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</th>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram9" class="mermaid">
|
||||||
|
flowchart LR
|
||||||
|
id1[(Database)]
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram10" class="mermaid">
|
||||||
|
%%{init: {"look": "handdrawn"} }%%
|
||||||
|
flowchart LR
|
||||||
|
id1[(Database)]
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram11" class="mermaid">
|
||||||
|
%%{init: {"handdrawn": false, "layout": "elk"} }%%
|
||||||
|
flowchart LR
|
||||||
|
id1[(Database)]
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram12" class="mermaid">
|
||||||
|
%%{init: {"look": "handdrawn", "layout": "elk"} }%%
|
||||||
|
flowchart LR
|
||||||
|
id1[(Database)]
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<!-- Separator row -->
|
||||||
|
<tr class="separator">
|
||||||
|
<td colspan="5"></td>
|
||||||
|
<!-- This cell spans all columns including the vertical header -->
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<th class="vertical-header">
|
||||||
|
<button class="collapsible">Circle shape</button>
|
||||||
|
<div class="content">
|
||||||
|
<div class="pre-scrollable">
|
||||||
|
<pre>
|
||||||
|
flowchart LR
|
||||||
|
id1((This is the text in the circle))
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</th>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram13" class="mermaid">
|
||||||
|
flowchart LR
|
||||||
|
id1((This is the text in the circle))
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram14" class="mermaid">
|
||||||
|
%%{init: {"look": "handdrawn"} }%%
|
||||||
|
flowchart LR
|
||||||
|
id1((This is the text in the circle))
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram15" class="mermaid">
|
||||||
|
%%{init: {"handdrawn": false, "layout": "elk"} }%%
|
||||||
|
flowchart LR
|
||||||
|
id1((This is the text in the circle))
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram16" class="mermaid">
|
||||||
|
%%{init: {"look": "handdrawn", "layout": "elk"} }%%
|
||||||
|
flowchart LR
|
||||||
|
id1((This is the text in the circle))
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<!-- Separator row -->
|
||||||
|
<tr class="separator">
|
||||||
|
<td colspan="5"></td>
|
||||||
|
<!-- This cell spans all columns including the vertical header -->
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<th class="vertical-header">
|
||||||
|
<button class="collapsible">Double Circle shape</button>
|
||||||
|
<div class="content">
|
||||||
|
<div class="pre-scrollable">
|
||||||
|
<pre>
|
||||||
|
flowchart TD
|
||||||
|
id1(((This is the text in the circle)))
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</th>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram17" class="mermaid">
|
||||||
|
flowchart TD
|
||||||
|
id1(((This is the text in the circle)))
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram18" class="mermaid">
|
||||||
|
%%{init: {"look": "handdrawn"} }%%
|
||||||
|
flowchart TD
|
||||||
|
id1(((This is the text in the circle)))
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram19" class="mermaid">
|
||||||
|
%%{init: {"handdrawn": false, "layout": "elk"} }%%
|
||||||
|
flowchart TD
|
||||||
|
id1(((This is the text in the circle)))
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram20" class="mermaid">
|
||||||
|
%%{init: {"look": "handdrawn", "layout": "elk"} }%%
|
||||||
|
flowchart TD
|
||||||
|
id1(((This is the text in the circle)))
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<!-- Separator row -->
|
||||||
|
<tr class="separator">
|
||||||
|
<td colspan="5"></td>
|
||||||
|
<!-- This cell spans all columns including the vertical header -->
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<th class="vertical-header">
|
||||||
|
<button class="collapsible">Asymmetric shape</button>
|
||||||
|
<div class="content">
|
||||||
|
<div class="pre-scrollable">
|
||||||
|
<pre>
|
||||||
|
flowchart LR
|
||||||
|
id1>This is the text in the box]
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</th>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram21" class="mermaid">
|
||||||
|
flowchart LR
|
||||||
|
id1>This is the text in the box]
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram22" class="mermaid">
|
||||||
|
%%{init: {"look": "handdrawn"} }%%
|
||||||
|
flowchart LR
|
||||||
|
id1>This is the text in the box]
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram23" class="mermaid">
|
||||||
|
%%{init: {"handdrawn": false, "layout": "elk"} }%%
|
||||||
|
flowchart LR
|
||||||
|
id1>This is the text in the box]
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram24" class="mermaid">
|
||||||
|
%%{init: {"look": "handdrawn", "layout": "elk"} }%%
|
||||||
|
flowchart LR
|
||||||
|
id1>This is the text in the box]
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<!-- Separator row -->
|
||||||
|
<tr class="separator">
|
||||||
|
<td colspan="5"></td>
|
||||||
|
<!-- This cell spans all columns including the vertical header -->
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<th class="vertical-header">
|
||||||
|
<button class="collapsible">Rhombus/Diamond/Question shape</button>
|
||||||
|
<div class="content">
|
||||||
|
<div class="pre-scrollable">
|
||||||
|
<pre>
|
||||||
|
flowchart LR
|
||||||
|
id1{This is the text in the box}
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</th>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram25" class="mermaid">
|
||||||
|
flowchart LR
|
||||||
|
id1{This is the text in the box}
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram26" class="mermaid">
|
||||||
|
%%{init: {"look": "handdrawn"} }%%
|
||||||
|
flowchart LR
|
||||||
|
id1{This is the text in the box}
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram27" class="mermaid">
|
||||||
|
%%{init: {"handdrawn": false, "layout": "elk"} }%%
|
||||||
|
flowchart LR
|
||||||
|
id1{This is the text in the box}
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram28" class="mermaid">
|
||||||
|
%%{init: {"look": "handdrawn", "layout": "elk"} }%%
|
||||||
|
flowchart LR
|
||||||
|
id1{This is the text in the box}
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<!-- Separator row -->
|
||||||
|
<tr class="separator">
|
||||||
|
<td colspan="5"></td>
|
||||||
|
<!-- This cell spans all columns including the vertical header -->
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<th class="vertical-header">
|
||||||
|
<button class="collapsible">Hexagon shape</button>
|
||||||
|
<div class="content">
|
||||||
|
<div class="pre-scrollable">
|
||||||
|
<pre>
|
||||||
|
flowchart LR
|
||||||
|
id1{{This is the text in the box}}
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</th>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram29" class="mermaid">
|
||||||
|
flowchart LR
|
||||||
|
id1{{This is the text in the box}}
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram31" class="mermaid">
|
||||||
|
%%{init: {"handdrawn": false, "layout": "elk"} }%%
|
||||||
|
flowchart LR
|
||||||
|
id1{{This is the text in the box}}
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram32" class="mermaid">
|
||||||
|
%%{init: {"look": "handdrawn", "layout": "elk"} }%%
|
||||||
|
flowchart LR
|
||||||
|
id1{{This is the text in the box}}
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<!-- Separator row -->
|
||||||
|
<tr class="separator">
|
||||||
|
<td colspan="5"></td>
|
||||||
|
<!-- This cell spans all columns including the vertical header -->
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<th class="vertical-header">
|
||||||
|
<button class="collapsible">Parallelogram shape</button>
|
||||||
|
<div class="content">
|
||||||
|
<div class="pre-scrollable">
|
||||||
|
<pre>
|
||||||
|
flowchart TD
|
||||||
|
id1[/This is the text in the box/]
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</th>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram33" class="mermaid">
|
||||||
|
flowchart TD
|
||||||
|
id1[/This is the text in the box/]
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram34" class="mermaid">
|
||||||
|
%%{init: {"look": "handdrawn"} }%%
|
||||||
|
flowchart TD
|
||||||
|
id1[/This is the text in the box/]
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram35" class="mermaid">
|
||||||
|
%%{init: {"handdrawn": false, "layout": "elk"} }%%
|
||||||
|
flowchart TD
|
||||||
|
id1[/This is the text in the box/]
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram36" class="mermaid">
|
||||||
|
%%{init: {"look": "handdrawn", "layout": "elk"} }%%
|
||||||
|
flowchart TD
|
||||||
|
id1[/This is the text in the box/]
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<!-- Separator row -->
|
||||||
|
<tr class="separator">
|
||||||
|
<td colspan="5"></td>
|
||||||
|
<!-- This cell spans all columns including the vertical header -->
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<th class="vertical-header">
|
||||||
|
<button class="collapsible">Parallelogram Alt shape</button>
|
||||||
|
<div class="content">
|
||||||
|
<div class="pre-scrollable">
|
||||||
|
<pre>
|
||||||
|
flowchart TD
|
||||||
|
id1[\This is the text in the box\]
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</th>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram37" class="mermaid">
|
||||||
|
flowchart TD
|
||||||
|
id1[\This is the text in the box\]
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram38" class="mermaid">
|
||||||
|
%%{init: {"look": "handdrawn"} }%%
|
||||||
|
flowchart TD
|
||||||
|
id1[\This is the text in the box\]
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram39" class="mermaid">
|
||||||
|
%%{init: {"handdrawn": false, "layout": "elk"} }%%
|
||||||
|
flowchart TD
|
||||||
|
id1[\This is the text in the box\]
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram40" class="mermaid">
|
||||||
|
%%{init: {"look": "handdrawn", "layout": "elk"} }%%
|
||||||
|
flowchart TD
|
||||||
|
id1[\This is the text in the box\]
|
||||||
|
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<!-- Separator row -->
|
||||||
|
<tr class="separator">
|
||||||
|
<td colspan="5"></td>
|
||||||
|
<!-- This cell spans all columns including the vertical header -->
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<th class="vertical-header">
|
||||||
|
<button class="collapsible">Trapezoid shape</button>
|
||||||
|
<div class="content">
|
||||||
|
<div class="pre-scrollable">
|
||||||
|
<pre>
|
||||||
|
flowchart TD
|
||||||
|
A[/Christmas\]
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</th>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram41" class="mermaid">
|
||||||
|
flowchart TD
|
||||||
|
A[/Christmas\]
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram42" class="mermaid">
|
||||||
|
%%{init: {"look": "handdrawn"} }%%
|
||||||
|
flowchart TD
|
||||||
|
A[/Christmas\]
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram43" class="mermaid">
|
||||||
|
%%{init: {"handdrawn": false, "layout": "elk"} }%%
|
||||||
|
flowchart TD
|
||||||
|
A[/Christmas\]
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram44" class="mermaid">
|
||||||
|
%%{init: {"look": "handdrawn", "layout": "elk"} }%%
|
||||||
|
flowchart TD
|
||||||
|
A[/Christmas\]
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<!-- Separator row -->
|
||||||
|
<tr class="separator">
|
||||||
|
<td colspan="5"></td>
|
||||||
|
<!-- This cell spans all columns including the vertical header -->
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<th class="vertical-header">
|
||||||
|
<button class="collapsible">Trapezoid Alt shape</button>
|
||||||
|
<div class="content">
|
||||||
|
<div class="pre-scrollable">
|
||||||
|
<pre>
|
||||||
|
flowchart TD
|
||||||
|
A[\Christmas/]
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</th>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram45" class="mermaid">
|
||||||
|
flowchart TD
|
||||||
|
A[\Christmas/]
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram46" class="mermaid">
|
||||||
|
%%{init: {"look": "handdrawn"} }%%
|
||||||
|
flowchart TD
|
||||||
|
A[\Christmas/]
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram47" class="mermaid">
|
||||||
|
%%{init: {"handdrawn": false, "layout": "elk"} }%%
|
||||||
|
flowchart TD
|
||||||
|
A[\Christmas/]
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram48" class="mermaid">
|
||||||
|
%%{init: {"look": "handdrawn", "layout": "elk"} }%%
|
||||||
|
flowchart TD
|
||||||
|
A[\Christmas/]
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<!-- Separator row -->
|
||||||
|
<tr class="separator">
|
||||||
|
<td colspan="5"></td>
|
||||||
|
<!-- This cell spans all columns including the vertical header -->
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<th class="vertical-header">
|
||||||
|
<button class="collapsible">Rect with rounded corner</button>
|
||||||
|
<div class="content">
|
||||||
|
<div class="pre-scrollable">
|
||||||
|
<pre>
|
||||||
|
flowchart LR
|
||||||
|
id1(This is the text in the box)
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</th>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram49" class="mermaid">
|
||||||
|
flowchart LR
|
||||||
|
id1(This is the text in the box)
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram50" class="mermaid">
|
||||||
|
%%{init: {"look": "handdrawn"} }%%
|
||||||
|
flowchart LR
|
||||||
|
id1(This is the text in the box)
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram51" class="mermaid">
|
||||||
|
%%{init: {"handdrawn": false, "layout": "elk"} }%%
|
||||||
|
flowchart LR
|
||||||
|
id1(This is the text in the box)
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram52" class="mermaid">
|
||||||
|
%%{init: {"look": "handdrawn", "layout": "elk"} }%%
|
||||||
|
flowchart LR
|
||||||
|
id1(This is the text in the box)
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<!-- Separator row -->
|
||||||
|
<tr class="separator">
|
||||||
|
<td colspan="5"></td>
|
||||||
|
<!-- This cell spans all columns including the vertical header -->
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<th class="vertical-header">
|
||||||
|
<button class="collapsible">Rect with sharp corner</button>
|
||||||
|
<div class="content">
|
||||||
|
<div class="pre-scrollable">
|
||||||
|
<pre>
|
||||||
|
flowchart LR
|
||||||
|
id1[This is the text in the box]
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</th>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram53" class="mermaid">
|
||||||
|
flowchart LR
|
||||||
|
id1[This is the text in the box]
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram54" class="mermaid">
|
||||||
|
%%{init: {"look": "handdrawn"} }%%
|
||||||
|
flowchart LR
|
||||||
|
id1[This is the text in the box]
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram55" class="mermaid">
|
||||||
|
%%{init: {"handdrawn": false, "layout": "elk"} }%%
|
||||||
|
flowchart LR
|
||||||
|
id1[This is the text in the box]
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram56" class="mermaid">
|
||||||
|
%%{init: {"look": "handdrawn", "layout": "elk"} }%%
|
||||||
|
flowchart LR
|
||||||
|
id1[This is the text in the box]
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<!-- Separator row -->
|
||||||
|
<tr class="separator">
|
||||||
|
<td colspan="5"></td>
|
||||||
|
<!-- This cell spans all columns including the vertical header -->
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<script type="module">
|
||||||
|
import mermaid from './mermaid.esm.mjs';
|
||||||
|
import { layouts } from './mermaid-layout-elk.esm.mjs';
|
||||||
|
mermaid.registerLayoutLoaders(layouts);
|
||||||
|
mermaid.parseError = function (err, hash) {};
|
||||||
|
|
||||||
|
mermaid.initialize({
|
||||||
|
handdrawn: false,
|
||||||
|
mergeEdges: true,
|
||||||
|
layout: 'dagre',
|
||||||
|
flowchart: { titleTopMargin: 10 },
|
||||||
|
// fontFamily: 'Caveat',
|
||||||
|
fontFamily: 'Kalam',
|
||||||
|
sequence: {
|
||||||
|
actorFontFamily: 'courier',
|
||||||
|
noteFontFamily: 'courier',
|
||||||
|
messageFontFamily: 'courier',
|
||||||
|
},
|
||||||
|
fontSize: 16,
|
||||||
|
logLevel: 0,
|
||||||
|
});
|
||||||
|
function callback() {
|
||||||
|
alert('It worked');
|
||||||
|
}
|
||||||
|
mermaid.parseError = function (err, hash) {
|
||||||
|
console.error('In parse error:');
|
||||||
|
console.error(err);
|
||||||
|
};
|
||||||
|
|
||||||
|
let coll = document.getElementsByClassName('collapsible');
|
||||||
|
for (const element of coll) {
|
||||||
|
element.addEventListener('click', function () {
|
||||||
|
this.classList.toggle('active');
|
||||||
|
let content = this.nextElementSibling;
|
||||||
|
if (content.style.maxHeight) {
|
||||||
|
content.style.maxHeight = null;
|
||||||
|
} else {
|
||||||
|
content.style.maxHeight = content.scrollHeight + 'px';
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
191
cypress/platform/flowchart-sate.html
Normal file
191
cypress/platform/flowchart-sate.html
Normal file
@@ -0,0 +1,191 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<link href="https://fonts.googleapis.com/css?family=Montserrat&display=swap" rel="stylesheet" />
|
||||||
|
<link href="https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" rel="stylesheet" />
|
||||||
|
<link
|
||||||
|
rel="stylesheet"
|
||||||
|
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"
|
||||||
|
/>
|
||||||
|
<link
|
||||||
|
href="https://cdn.jsdelivr.net/npm/@mdi/font@6.9.96/css/materialdesignicons.min.css"
|
||||||
|
rel="stylesheet"
|
||||||
|
/>
|
||||||
|
<link
|
||||||
|
href="https://fonts.googleapis.com/css?family=Noto+Sans+SC&display=swap"
|
||||||
|
rel="stylesheet"
|
||||||
|
/>
|
||||||
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||||
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
||||||
|
<link
|
||||||
|
href="https://fonts.googleapis.com/css2?family=Kalam:wght@300;400;700&display=swap"
|
||||||
|
rel="stylesheet"
|
||||||
|
/>
|
||||||
|
<link
|
||||||
|
href="https://fonts.googleapis.com/css2?family=Caveat:wght@400..700&family=Kalam:wght@300;400;700&family=Rubik+Mono+One&display=swap"
|
||||||
|
rel="stylesheet"
|
||||||
|
/>
|
||||||
|
<link
|
||||||
|
href="https://fonts.googleapis.com/css2?family=Kalam:wght@300;400;700&family=Rubik+Mono+One&display=swap"
|
||||||
|
rel="stylesheet"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
font-family: 'Arial';
|
||||||
|
}
|
||||||
|
|
||||||
|
table {
|
||||||
|
width: 100%;
|
||||||
|
border-collapse: collapse;
|
||||||
|
table-layout: fixed;
|
||||||
|
}
|
||||||
|
|
||||||
|
th,
|
||||||
|
td {
|
||||||
|
border: 1px solid black;
|
||||||
|
padding: 10px;
|
||||||
|
text-align: center;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.separator {
|
||||||
|
height: 20px;
|
||||||
|
background-color: #f0f0f0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vertical-header {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.collapsible {
|
||||||
|
background-color: #f9f9f9;
|
||||||
|
color: #444;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 18px;
|
||||||
|
width: 100%;
|
||||||
|
border: none;
|
||||||
|
text-align: left;
|
||||||
|
outline: none;
|
||||||
|
font-size: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.active,
|
||||||
|
.collapsible:hover {
|
||||||
|
background-color: #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
.collapsible:after {
|
||||||
|
content: '\002B';
|
||||||
|
color: #777;
|
||||||
|
font-weight: bold;
|
||||||
|
float: right;
|
||||||
|
margin-left: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.active:after {
|
||||||
|
content: '\2212';
|
||||||
|
}
|
||||||
|
|
||||||
|
.content {
|
||||||
|
padding: 0 5px;
|
||||||
|
max-height: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
transition: max-height 0.2s ease-out;
|
||||||
|
background-color: #f1f1f1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content .pre-scrollable {
|
||||||
|
max-height: 200px;
|
||||||
|
overflow-y: scroll;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<th></th>
|
||||||
|
<!-- Placeholder for the top left corner -->
|
||||||
|
<th>State rough</th>
|
||||||
|
<th>Flowchart rough</th>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th class="vertical-header">
|
||||||
|
<button class="collapsible">Stadium shape</button>
|
||||||
|
<div class="content">
|
||||||
|
<div class="pre-scrollable">
|
||||||
|
<pre>
|
||||||
|
flowchart LR
|
||||||
|
id1([This is the text in the box])
|
||||||
|
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</th>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram1" class="mermaid">
|
||||||
|
%%{init: {"look": "handdrawn"} }%%
|
||||||
|
stateDiagram-v2
|
||||||
|
stateA
|
||||||
|
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<pre id="diagram2" class="mermaid">
|
||||||
|
%%{init: {"look": "handdrawn"} }%%
|
||||||
|
flowchart LR
|
||||||
|
id1[[This is the text in the box]]
|
||||||
|
|
||||||
|
|
||||||
|
</pre
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<script type="module">
|
||||||
|
import mermaid from './mermaid.esm.mjs';
|
||||||
|
import { layouts } from './mermaid-layout-elk.esm.mjs';
|
||||||
|
mermaid.registerLayoutLoaders(layouts);
|
||||||
|
mermaid.parseError = function (err, hash) {};
|
||||||
|
|
||||||
|
mermaid.initialize({
|
||||||
|
handdrawn: false,
|
||||||
|
mergeEdges: true,
|
||||||
|
layout: 'dagre',
|
||||||
|
flowchart: { titleTopMargin: 10 },
|
||||||
|
// fontFamily: 'Caveat',
|
||||||
|
fontFamily: 'Kalam',
|
||||||
|
sequence: {
|
||||||
|
actorFontFamily: 'courier',
|
||||||
|
noteFontFamily: 'courier',
|
||||||
|
messageFontFamily: 'courier',
|
||||||
|
},
|
||||||
|
fontSize: 16,
|
||||||
|
logLevel: 0,
|
||||||
|
});
|
||||||
|
function callback() {
|
||||||
|
alert('It worked');
|
||||||
|
}
|
||||||
|
mermaid.parseError = function (err, hash) {
|
||||||
|
console.error('In parse error:');
|
||||||
|
console.error(err);
|
||||||
|
};
|
||||||
|
|
||||||
|
let coll = document.getElementsByClassName('collapsible');
|
||||||
|
for (const element of coll) {
|
||||||
|
element.addEventListener('click', function () {
|
||||||
|
this.classList.toggle('active');
|
||||||
|
let content = this.nextElementSibling;
|
||||||
|
if (content.style.maxHeight) {
|
||||||
|
content.style.maxHeight = null;
|
||||||
|
} else {
|
||||||
|
content.style.maxHeight = content.scrollHeight + 'px';
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
@@ -4,7 +4,7 @@
|
|||||||
<link href="https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" rel="stylesheet" />
|
<link href="https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" rel="stylesheet" />
|
||||||
<link
|
<link
|
||||||
rel="stylesheet"
|
rel="stylesheet"
|
||||||
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"
|
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/font-awesome.min.css"
|
||||||
/>
|
/>
|
||||||
<link
|
<link
|
||||||
href="https://fonts.googleapis.com/css?family=Noto+Sans+SC&display=swap"
|
href="https://fonts.googleapis.com/css?family=Noto+Sans+SC&display=swap"
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
<link href="https://fonts.googleapis.com/css?family=Montserrat&display=swap" rel="stylesheet" />
|
<link href="https://fonts.googleapis.com/css?family=Montserrat&display=swap" rel="stylesheet" />
|
||||||
<link
|
<link
|
||||||
rel="stylesheet"
|
rel="stylesheet"
|
||||||
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"
|
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/font-awesome.min.css"
|
||||||
/>
|
/>
|
||||||
<link
|
<link
|
||||||
href="https://fonts.googleapis.com/css?family=Noto+Sans+SC&display=swap"
|
href="https://fonts.googleapis.com/css?family=Noto+Sans+SC&display=swap"
|
||||||
|
@@ -3,7 +3,7 @@
|
|||||||
<link href="https://fonts.googleapis.com/css?family=Montserrat&display=swap" rel="stylesheet" />
|
<link href="https://fonts.googleapis.com/css?family=Montserrat&display=swap" rel="stylesheet" />
|
||||||
<link
|
<link
|
||||||
rel="stylesheet"
|
rel="stylesheet"
|
||||||
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"
|
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/font-awesome.min.css"
|
||||||
/>
|
/>
|
||||||
<link
|
<link
|
||||||
href="https://fonts.googleapis.com/css?family=Noto+Sans+SC&display=swap"
|
href="https://fonts.googleapis.com/css?family=Noto+Sans+SC&display=swap"
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user