mirror of
https://github.com/mermaid-js/mermaid.git
synced 2025-08-20 08:46:44 +02:00
Compare commits
2133 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
2cfdd1620a | ||
![]() |
b9f4faa916 | ||
![]() |
21c636c4c6 | ||
![]() |
dd57030732 | ||
![]() |
efba4c18d1 | ||
![]() |
48fd76e076 | ||
![]() |
fdf376f9c8 | ||
![]() |
46b7ee87dd | ||
![]() |
14a94c0c51 | ||
![]() |
24490f7789 | ||
![]() |
09afb077f0 | ||
![]() |
99ee235e75 | ||
![]() |
029a444d32 | ||
![]() |
8c4c92a861 | ||
![]() |
19d46fc823 | ||
![]() |
ae2dc70385 | ||
![]() |
0ad44c12fe | ||
![]() |
53bff117aa | ||
![]() |
2fe5e678bf | ||
![]() |
4665b6bf15 | ||
![]() |
a9d317f997 | ||
![]() |
0e68788de4 | ||
![]() |
44037c0c9d | ||
![]() |
95e47d283e | ||
![]() |
225115ad07 | ||
![]() |
4da479388d | ||
![]() |
0a0546e241 | ||
![]() |
47ac57be69 | ||
![]() |
f1c066b68e | ||
![]() |
0b9554c675 | ||
![]() |
9134e1c837 | ||
![]() |
10c25348f3 | ||
![]() |
8ffd198d8b | ||
![]() |
7c81096bbc | ||
![]() |
3593fa63db | ||
![]() |
037ba2fa9c | ||
![]() |
4d7b1e8eaf | ||
![]() |
f6e1515f66 | ||
![]() |
c5be9fd882 | ||
![]() |
01b5935a4e | ||
![]() |
c1cd39bd65 | ||
![]() |
b2db7eb6bf | ||
![]() |
f4097dfd82 | ||
![]() |
797877bcbf | ||
![]() |
db8a0028a6 | ||
![]() |
50a535125e | ||
![]() |
ed07a9e896 | ||
![]() |
43ffb00996 | ||
![]() |
04e205bcb4 | ||
![]() |
58aa4c467f | ||
![]() |
0cc7eb7638 | ||
![]() |
4e126e174b | ||
![]() |
44875691db | ||
![]() |
c140e1a658 | ||
![]() |
77118ad40c | ||
![]() |
bc3fe33428 | ||
![]() |
754fa24104 | ||
![]() |
69b3a9d3a2 | ||
![]() |
8fdeb6d9d3 | ||
![]() |
21efbbdbe8 | ||
![]() |
1956d3d63c | ||
![]() |
25efa4e63f | ||
![]() |
6df6f5ab2c | ||
![]() |
c5dfa4213d | ||
![]() |
a48d970410 | ||
![]() |
1168db6830 | ||
![]() |
f76cab1ba3 | ||
![]() |
78fbf36c6e | ||
![]() |
3ee19337ca | ||
![]() |
d82958d73d | ||
![]() |
6b5286eff8 | ||
![]() |
04c29e2a96 | ||
![]() |
4e7d65062a | ||
![]() |
d5432ce811 | ||
![]() |
262bf4e2b0 | ||
![]() |
f63eb45e7d | ||
![]() |
22168ed760 | ||
![]() |
210f8c2306 | ||
![]() |
6205ddd430 | ||
![]() |
4e40f29f33 | ||
![]() |
0faeeb6411 | ||
![]() |
bd0237369b | ||
![]() |
79d50ebc76 | ||
![]() |
c5eb07c83f | ||
![]() |
87b2084d97 | ||
![]() |
9b42ffd070 | ||
![]() |
d2bbe83e08 | ||
![]() |
61cfb156cc | ||
![]() |
d24239530c | ||
![]() |
2352137f6b | ||
![]() |
3b2bb5a6ec | ||
![]() |
7f9d4cd079 | ||
![]() |
39fdaef0a4 | ||
![]() |
db725c1de5 | ||
![]() |
734f1add8e | ||
![]() |
9b9f4ea704 | ||
![]() |
02eb8dacb6 | ||
![]() |
afb69a3bb0 | ||
![]() |
095e8ca9e7 | ||
![]() |
95fb824cc7 | ||
![]() |
d4d7ca7d65 | ||
![]() |
537512fb27 | ||
![]() |
ba0d21682a | ||
![]() |
729080f4b1 | ||
![]() |
c2a479ab44 | ||
![]() |
59aaa310dd | ||
![]() |
f4ce428d66 | ||
![]() |
5aecd127bd | ||
![]() |
47601ac311 | ||
![]() |
1990786c2c | ||
![]() |
980c97a44c | ||
![]() |
42177a3098 | ||
![]() |
657e38f6e0 | ||
![]() |
6cd0585339 | ||
![]() |
e32151cc40 | ||
![]() |
61cc2fc215 | ||
![]() |
53e5f3a0c8 | ||
![]() |
3f4c346e0c | ||
![]() |
e8ddae4882 | ||
![]() |
09c966b271 | ||
![]() |
f7ed91b5bd | ||
![]() |
aa24229786 | ||
![]() |
c4ce8543d3 | ||
![]() |
c0d6d89330 | ||
![]() |
1cdc73d270 | ||
![]() |
1f44d11e15 | ||
![]() |
2fdcb0bfe6 | ||
![]() |
6b336cbe77 | ||
![]() |
cdca63dcfe | ||
![]() |
b79191e39c | ||
![]() |
4694ec08d3 | ||
![]() |
e26dbfe11a | ||
![]() |
0d6552e63d | ||
![]() |
e683b8886a | ||
![]() |
765e0cd35c | ||
![]() |
c0bf6d8bbc | ||
![]() |
d809d8ba28 | ||
![]() |
c91dc7d0bc | ||
![]() |
7bc75851cf | ||
![]() |
1c0cb8b2d7 | ||
![]() |
ee8893291c | ||
![]() |
fca35a3363 | ||
![]() |
0ad2282395 | ||
![]() |
f20d89ee51 | ||
![]() |
2800f555c7 | ||
![]() |
86e4642046 | ||
![]() |
2718cdae51 | ||
![]() |
7175f5776f | ||
![]() |
d96dcd2529 | ||
![]() |
5b47950f9f | ||
![]() |
3c3d28d8ee | ||
![]() |
61f55feca1 | ||
![]() |
138ee49943 | ||
![]() |
09c5c62e07 | ||
![]() |
63850fde66 | ||
![]() |
f30d370e3b | ||
![]() |
9b77c8a1aa | ||
![]() |
932260f26b | ||
![]() |
5b86fe38ae | ||
![]() |
4bf52cc0c0 | ||
![]() |
bae2741e0e | ||
![]() |
aba109afa4 | ||
![]() |
7dda1f5724 | ||
![]() |
7389b9476b | ||
![]() |
bcc998cdae | ||
![]() |
7db2de3bbd | ||
![]() |
c5cf5550c6 | ||
![]() |
dd18cd187f | ||
![]() |
c269f6fcee | ||
![]() |
fd8f3c3039 | ||
![]() |
eb714eb71a | ||
![]() |
15c85efd88 | ||
![]() |
5a6edf2fc4 | ||
![]() |
b3dfb5a21f | ||
![]() |
99644bad17 | ||
![]() |
ab1a2ec411 | ||
![]() |
38a7a47d11 | ||
![]() |
acb799cca0 | ||
![]() |
bfeab9ec0b | ||
![]() |
b6a03fca8b | ||
![]() |
5868a96494 | ||
![]() |
05a3806075 | ||
![]() |
74c6fc35a8 | ||
![]() |
594f2180a0 | ||
![]() |
b1b480a13b | ||
![]() |
3681a7a4c1 | ||
![]() |
d2a73bcef4 | ||
![]() |
f9a20ab94e | ||
![]() |
dd7b071a94 | ||
![]() |
2fb50a2d69 | ||
![]() |
061aaf6f28 | ||
![]() |
6ead2e16ea | ||
![]() |
8950fb1795 | ||
![]() |
cdb87c193c | ||
![]() |
587c3c8884 | ||
![]() |
9343c6fd37 | ||
![]() |
8b5b1d4701 | ||
![]() |
70dcfc83e6 | ||
![]() |
3698c2b1e4 | ||
![]() |
df872427af | ||
![]() |
720aef6ff0 | ||
![]() |
d71fe28a35 | ||
![]() |
644199d0d0 | ||
![]() |
207bc7c090 | ||
![]() |
4bb75e5e37 | ||
![]() |
84b51792d6 | ||
![]() |
7a45ed8733 | ||
![]() |
cc6eae22b3 | ||
![]() |
9cb959ba87 | ||
![]() |
aa279f6410 | ||
![]() |
7afff877e5 | ||
![]() |
4eba114c8b | ||
![]() |
4434cf39a7 | ||
![]() |
8bdd37ca44 | ||
![]() |
0d110350f4 | ||
![]() |
d686cee2af | ||
![]() |
192946337a | ||
![]() |
6b7f33e1e5 | ||
![]() |
728334b3ba | ||
![]() |
515d880f0a | ||
![]() |
60a30a3beb | ||
![]() |
e95e915d2b | ||
![]() |
aa1432af5a | ||
![]() |
d44c65eb59 | ||
![]() |
c7e1b45377 | ||
![]() |
fe22a5f7b3 | ||
![]() |
e63b5a7de2 | ||
![]() |
01fa7e6dad | ||
![]() |
5dbe3ee444 | ||
![]() |
b263164c83 | ||
![]() |
a80dd711a7 | ||
![]() |
7f185d06df | ||
![]() |
8ea7d5b80e | ||
![]() |
adf4351afd | ||
![]() |
f014061292 | ||
![]() |
7f815693a0 | ||
![]() |
03a634607a | ||
![]() |
fde668a3a6 | ||
![]() |
6b7d78ebcf | ||
![]() |
8db678a039 | ||
![]() |
81419d1ef9 | ||
![]() |
91670385f5 | ||
![]() |
017a86bc0e | ||
![]() |
d12cdf4fbe | ||
![]() |
9930d2927b | ||
![]() |
8aa85d72de | ||
![]() |
345e3cdaa7 | ||
![]() |
d0b712f0fb | ||
![]() |
caf8341445 | ||
![]() |
f3474fa778 | ||
![]() |
772a7fcfbb | ||
![]() |
9a638ece80 | ||
![]() |
161506baf2 | ||
![]() |
364511b133 | ||
![]() |
b5b2bc4aa5 | ||
![]() |
934a761c37 | ||
![]() |
2c2bd62e25 | ||
![]() |
6e35c32cb2 | ||
![]() |
f78f3e79f7 | ||
![]() |
49c6c4d873 | ||
![]() |
95d629e615 | ||
![]() |
efd5cf1c67 | ||
![]() |
6337470b1b | ||
![]() |
254ec07da9 | ||
![]() |
ec27270748 | ||
![]() |
00467c646c | ||
![]() |
771d3fcbbe | ||
![]() |
775d8bb353 | ||
![]() |
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 | ||
![]() |
16a15c4179 | ||
![]() |
49cb10457e | ||
![]() |
67c1eb34eb | ||
![]() |
9cc59f0206 | ||
![]() |
7167710800 | ||
![]() |
de115e2071 | ||
![]() |
e32e7f3256 | ||
![]() |
8132f0a5b0 | ||
![]() |
3c6ae36611 | ||
![]() |
b1b5ad3c9b | ||
![]() |
3b2c751cd2 | ||
![]() |
5e8ac1a66e | ||
![]() |
02ef40223c | ||
![]() |
69538aad09 | ||
![]() |
ce8256b8f6 | ||
![]() |
ced5cef2a3 | ||
![]() |
93b41eddb9 | ||
![]() |
39c6533881 | ||
![]() |
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 | ||
![]() |
99552b3389 | ||
![]() |
7391b05c43 | ||
![]() |
0691c722c3 | ||
![]() |
534a10edea | ||
![]() |
a46f993e3e | ||
![]() |
fc78ee0fc5 | ||
![]() |
ee6ae6a47a | ||
![]() |
6d7b2b1e14 | ||
![]() |
2117e71b51 | ||
![]() |
c3423beeda | ||
![]() |
de51bc40c7 | ||
![]() |
aa9f4a7760 | ||
![]() |
9979ea1d74 | ||
![]() |
fc31b22eb0 | ||
![]() |
c221350d59 | ||
![]() |
881a68241c | ||
![]() |
469acbe810 | ||
![]() |
ab726f008c | ||
![]() |
9b56cb3feb | ||
![]() |
cfacd3b2e1 | ||
![]() |
f45ae227a0 | ||
![]() |
97be6cbd73 | ||
![]() |
ce3b0af03a | ||
![]() |
c7c1218e02 | ||
![]() |
f5bdbf22e7 | ||
![]() |
1ab23d137f | ||
![]() |
b608083c2f | ||
![]() |
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 | ||
![]() |
af5e69327b | ||
![]() |
20b03189df | ||
![]() |
3d44eb0f42 | ||
![]() |
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 | ||
![]() |
a4bbaf071e | ||
![]() |
12bd301401 | ||
![]() |
a14637b416 | ||
![]() |
5d1ac22fd1 | ||
![]() |
3ccfea84b8 | ||
![]() |
38beca11fd | ||
![]() |
3555577581 | ||
![]() |
e852596862 | ||
![]() |
f15fde26f9 | ||
![]() |
73c426f8be | ||
![]() |
8f40c1a77f | ||
![]() |
0d00e88580 | ||
![]() |
8792e0a978 | ||
![]() |
e27e56f7bf | ||
![]() |
6b7e1225dd | ||
![]() |
0051620840 | ||
![]() |
c239b6e311 | ||
![]() |
d1a3a84b6f | ||
![]() |
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 | ||
![]() |
e13e5f836e | ||
![]() |
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 | ||
![]() |
6d69c26c8d | ||
![]() |
b914f48a91 | ||
![]() |
de89355a49 | ||
![]() |
cf88f0609d | ||
![]() |
6502036be9 | ||
![]() |
f86da19362 | ||
![]() |
b04e150dc1 | ||
![]() |
1c0c374c29 | ||
![]() |
fcda3dc8c6 | ||
![]() |
e433b953f6 | ||
![]() |
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 | ||
![]() |
da33867ad7 | ||
![]() |
539010c65c | ||
![]() |
cbe44a6cff | ||
![]() |
b077fedd4c | ||
![]() |
5aa884f594 | ||
![]() |
5b3f320e5d | ||
![]() |
a43cd55c53 | ||
![]() |
803e068630 | ||
![]() |
3147bb34ee | ||
![]() |
8daa28dd8b | ||
![]() |
231534a0db | ||
![]() |
2c6d1cb1ce | ||
![]() |
972ecba597 | ||
![]() |
fe905cedd3 | ||
![]() |
d8b878414b | ||
![]() |
b3245742b3 | ||
![]() |
82fd371e38 | ||
![]() |
b67dee1eed | ||
![]() |
6c1228f039 | ||
![]() |
d5c48e4be3 | ||
![]() |
be6b3176f4 | ||
![]() |
2537bf5310 | ||
![]() |
f4dffc8cdf | ||
![]() |
aef29affa3 | ||
![]() |
70d236244f | ||
![]() |
171a2019ec | ||
![]() |
70df6bbbca | ||
![]() |
5807d521b7 | ||
![]() |
67e482ff97 | ||
![]() |
2b2bbe35d0 | ||
![]() |
8862d63377 | ||
![]() |
2ac4e08e75 | ||
![]() |
fc7427536c | ||
![]() |
1b0b1227b6 | ||
![]() |
0cb365cf31 | ||
![]() |
49a0d0d9bf | ||
![]() |
38fcc2847b | ||
![]() |
2caeb9db47 | ||
![]() |
f9c359e70c | ||
![]() |
24528c1426 | ||
![]() |
1857eb1dae | ||
![]() |
970a98acad | ||
![]() |
619f097f1a | ||
![]() |
5fe9f9ed57 | ||
![]() |
3602191f69 | ||
![]() |
5935e277e6 | ||
![]() |
0ce33cb160 | ||
![]() |
df026c795d | ||
![]() |
d945030803 | ||
![]() |
fab6987601 | ||
![]() |
9e3ebf1648 | ||
![]() |
60a484f1e4 | ||
![]() |
077b1a5d8a | ||
![]() |
e59f290546 | ||
![]() |
9377d054a0 | ||
![]() |
10bb9202a7 | ||
![]() |
2c59ceb005 | ||
![]() |
adf0ae5474 | ||
![]() |
a9e67e4266 | ||
![]() |
0215e0173f | ||
![]() |
31a287b7b0 | ||
![]() |
af93b72ec5 | ||
![]() |
370cd98d23 | ||
![]() |
31686802b3 | ||
![]() |
b96eaed6f4 | ||
![]() |
c842401aaa | ||
![]() |
d163ca7e1b | ||
![]() |
cbb715a44d | ||
![]() |
af3d728a72 | ||
![]() |
3093afe63e | ||
![]() |
a5a2ea1c92 | ||
![]() |
197d808e33 | ||
![]() |
9f8c87a1d8 | ||
![]() |
69266bbfe6 | ||
![]() |
4707fb27fa | ||
![]() |
f13beabdd0 | ||
![]() |
1169cb9e85 | ||
![]() |
00bd208f18 | ||
![]() |
61c92f9df4 | ||
![]() |
ed612827d8 | ||
![]() |
d4ff5f5c27 | ||
![]() |
a4ba282dc0 | ||
![]() |
39d870d069 | ||
![]() |
4e12157180 | ||
![]() |
e371d72e18 | ||
![]() |
628cf79048 | ||
![]() |
ccfec58aeb | ||
![]() |
a57ac092f0 | ||
![]() |
6f3a2605c1 | ||
![]() |
e79a08ee0f | ||
![]() |
77706216c9 | ||
![]() |
d9448e4a91 | ||
![]() |
15b3647514 | ||
![]() |
6d58c7504d | ||
![]() |
c8fc989237 | ||
![]() |
392ebd0af4 | ||
![]() |
a2efa0d289 | ||
![]() |
81491f2e34 | ||
![]() |
77f76f52b5 | ||
![]() |
cabcf1e270 | ||
![]() |
70c8a3dde8 | ||
![]() |
762113d045 | ||
![]() |
53599817a9 | ||
![]() |
4336b91dbd | ||
![]() |
eaffe334c4 | ||
![]() |
6be91bc3a8 | ||
![]() |
551ccfc8ce | ||
![]() |
e54d0902c1 | ||
![]() |
36f056fd92 | ||
![]() |
c3060548cf | ||
![]() |
f3282e4dad | ||
![]() |
4a7489a7b6 | ||
![]() |
af7364bdf9 | ||
![]() |
23dd7b2b10 | ||
![]() |
bee88ac70e | ||
![]() |
1a8361d5c9 | ||
![]() |
e21643229e | ||
![]() |
fe1cff3f55 | ||
![]() |
4a4e96cfbd | ||
![]() |
14e1e6368a | ||
![]() |
447c5a4b35 | ||
![]() |
18589ddda4 | ||
![]() |
267e142ac9 | ||
![]() |
9ee2d70c8c | ||
![]() |
a90a8ceea5 | ||
![]() |
ddd971eae4 | ||
![]() |
f1aa6fff9c | ||
![]() |
d11bfaa6c4 | ||
![]() |
25cd86feec | ||
![]() |
062176d8d0 | ||
![]() |
a344d88020 | ||
![]() |
30b180d77b | ||
![]() |
00423ed152 | ||
![]() |
48ff3b2c11 | ||
![]() |
eee0d4bf31 | ||
![]() |
e047755a21 | ||
![]() |
b30d609d19 | ||
![]() |
1406de5a6c | ||
![]() |
ec7591bfa8 | ||
![]() |
c45f39e819 | ||
![]() |
6682988403 | ||
![]() |
8ad056b8a2 | ||
![]() |
c1cb171071 | ||
![]() |
17959f648a | ||
![]() |
c3d9aa791a | ||
![]() |
f846e7719e | ||
![]() |
f25c215f6a | ||
![]() |
2640120be8 | ||
![]() |
b55014617e | ||
![]() |
9c6ad54681 | ||
![]() |
c7f5e01721 | ||
![]() |
19f150922b | ||
![]() |
be036ad414 | ||
![]() |
9261715003 | ||
![]() |
42589a0034 | ||
![]() |
dee99d2c4a | ||
![]() |
5f0b514c92 | ||
![]() |
337f07b865 | ||
![]() |
b043d79cc4 | ||
![]() |
3b5cb020ea | ||
![]() |
1c61ccabad | ||
![]() |
3fe7e2dfe8 | ||
![]() |
51e7444b94 | ||
![]() |
2fa9219353 | ||
![]() |
f5555245f9 | ||
![]() |
5c9857c4eb | ||
![]() |
8691874dbb | ||
![]() |
494ba45c5e | ||
![]() |
b38def6866 | ||
![]() |
a7afc11079 | ||
![]() |
d3c5b02008 | ||
![]() |
16149abcc0 | ||
![]() |
13d0b61757 | ||
![]() |
ebc59d8227 | ||
![]() |
45f4d3d443 | ||
![]() |
33d45f639c | ||
![]() |
7503694453 | ||
![]() |
e9680e086e | ||
![]() |
cd7003e9c1 | ||
![]() |
941d9d13d5 | ||
![]() |
4786cfb6aa | ||
![]() |
7aa4466b69 | ||
![]() |
2bfd5a9e2a | ||
![]() |
56da881ed4 | ||
![]() |
a3364e72ff | ||
![]() |
aa50db8bf5 | ||
![]() |
e8db7a71e2 | ||
![]() |
f00e7676b9 | ||
![]() |
63ef228ed0 | ||
![]() |
6fce617284 | ||
![]() |
2a64834ecc | ||
![]() |
7bcdea9bd1 | ||
![]() |
8fdf512b4c | ||
![]() |
dbcb80087c | ||
![]() |
b99b1bfd0c | ||
![]() |
fcffa6ca4e | ||
![]() |
6fd69090ed | ||
![]() |
051ef598f6 | ||
![]() |
907006ff3d | ||
![]() |
df9b801b0e | ||
![]() |
726d633dd3 | ||
![]() |
4a04ce6bf8 | ||
![]() |
010fc703eb | ||
![]() |
8f8ce2f142 | ||
![]() |
452cb83ad7 | ||
![]() |
2f8f9dd341 | ||
![]() |
4a14d997d1 | ||
![]() |
10237976f3 | ||
![]() |
92e7c7b894 | ||
![]() |
80c20a72b2 | ||
![]() |
2d92ffb085 | ||
![]() |
4823cf5df4 | ||
![]() |
dae8a13e8a | ||
![]() |
0b087b71dc | ||
![]() |
ea8d7ec5cc | ||
![]() |
78f1631c8f | ||
![]() |
ff6988e875 | ||
![]() |
cddca04885 | ||
![]() |
f737c9f6f9 | ||
![]() |
7e86d03dc9 | ||
![]() |
bfa8111e14 | ||
![]() |
5aab2ba1dd | ||
![]() |
37d7c7e2dd | ||
![]() |
1965f69a10 | ||
![]() |
95dcd30324 | ||
![]() |
65bb82962f | ||
![]() |
c84c7f52f9 | ||
![]() |
cd04c430af | ||
![]() |
dd553cb28f | ||
![]() |
25d0de13a5 | ||
![]() |
52bb31b98a | ||
![]() |
a4a94fd6e2 | ||
![]() |
cd8e354234 | ||
![]() |
d797365802 | ||
![]() |
73293efcf3 | ||
![]() |
91ae282808 | ||
![]() |
4c551b2aca | ||
![]() |
d21461fba0 | ||
![]() |
b51d8ff7ba | ||
![]() |
75ec719257 | ||
![]() |
13e052ff81 | ||
![]() |
bde6a9ff4f | ||
![]() |
23d843b6d3 | ||
![]() |
cffac848ea | ||
![]() |
9651d0c2da | ||
![]() |
e1a23f10df | ||
![]() |
d346a77e3c | ||
![]() |
f069de5487 | ||
![]() |
ba0bddf417 | ||
![]() |
f30c26485e | ||
![]() |
b71f4c7e54 | ||
![]() |
e046da10c2 | ||
![]() |
12dc3d8373 | ||
![]() |
82c405289d | ||
![]() |
191ea24e29 | ||
![]() |
72a6fad1db | ||
![]() |
a2a99485f9 | ||
![]() |
bc332e3124 | ||
![]() |
8d2605d537 | ||
![]() |
069a132fe1 | ||
![]() |
969e2c1ff1 | ||
![]() |
c5272d5279 | ||
![]() |
c1b5d527df | ||
![]() |
cc4dfeab1a | ||
![]() |
280525b4b1 | ||
![]() |
9fadf621a8 | ||
![]() |
fd3f1caff6 | ||
![]() |
3b0c5c3e60 | ||
![]() |
52d276b010 | ||
![]() |
d1178c490b | ||
![]() |
9ee5667580 | ||
![]() |
36c196e80b | ||
![]() |
7ca990d762 | ||
![]() |
7d0faa3fed | ||
![]() |
4256177531 | ||
![]() |
327530fb9d | ||
![]() |
91907fe0eb | ||
![]() |
6bf5571f96 | ||
![]() |
8619a53a9c | ||
![]() |
9bedfa2033 | ||
![]() |
59264a33d7 | ||
![]() |
db92b5a219 | ||
![]() |
70d9f50fc9 | ||
![]() |
b253cd65d4 | ||
![]() |
f2f8d89a28 | ||
![]() |
0b0f988180 | ||
![]() |
1c200ee5bc | ||
![]() |
55be75c974 | ||
![]() |
47a6ce4342 | ||
![]() |
3ecb841c1a | ||
![]() |
1d2450245e | ||
![]() |
f6c4c9260f | ||
![]() |
f354d68350 | ||
![]() |
bea76aa682 | ||
![]() |
6d4b27aacb | ||
![]() |
e008b7dae7 | ||
![]() |
96a3991c56 | ||
![]() |
8d1d691bc3 | ||
![]() |
e07608209b | ||
![]() |
50cdb74d54 | ||
![]() |
edc091f4d4 | ||
![]() |
e0448a7b7b | ||
![]() |
0f02f5ff34 | ||
![]() |
b2111adef5 | ||
![]() |
099f580e52 | ||
![]() |
442da6c4a2 | ||
![]() |
f715863540 | ||
![]() |
ed7dbb100d | ||
![]() |
52fdea0419 | ||
![]() |
98c578da02 | ||
![]() |
cbf7e6a880 | ||
![]() |
8982e2f78c | ||
![]() |
62ae072918 | ||
![]() |
04f92e5b1c | ||
![]() |
b7c72cb38a | ||
![]() |
5cc20b5e44 | ||
![]() |
ce9a9db33a | ||
![]() |
6939cf52e6 | ||
![]() |
ec79ac200c | ||
![]() |
de03a017db | ||
![]() |
42ad1f4fe4 | ||
![]() |
a01be16d27 | ||
![]() |
5c6c8d1135 | ||
![]() |
493f238319 | ||
![]() |
31e19a0434 | ||
![]() |
16968eb38c | ||
![]() |
5c46b98eee | ||
![]() |
ba46747cb0 | ||
![]() |
17066aab97 | ||
![]() |
21c9397ec1 | ||
![]() |
427bcaa3f6 | ||
![]() |
8fad1f55e2 | ||
![]() |
140645b760 | ||
![]() |
05e17c0bf0 | ||
![]() |
1612d3fabd | ||
![]() |
679f77dea5 | ||
![]() |
1bad612c51 | ||
![]() |
81825f22f5 | ||
![]() |
e668698b5c | ||
![]() |
b44ec7dadd | ||
![]() |
cafe932cbc | ||
![]() |
1629a91a25 | ||
![]() |
c85b24862d | ||
![]() |
fe89b9510d | ||
![]() |
7b624667fa | ||
![]() |
e7c52bbf59 | ||
![]() |
3e87412e97 | ||
![]() |
2401f334ec | ||
![]() |
4f60a27472 | ||
![]() |
0dcca35ec2 | ||
![]() |
c7eaee037e | ||
![]() |
2bbdd15031 | ||
![]() |
fa201ad9ad | ||
![]() |
c226358f65 | ||
![]() |
8fd268d59b | ||
![]() |
b91624cb63 | ||
![]() |
54f2452406 | ||
![]() |
84a18a1858 | ||
![]() |
5b2a10e592 | ||
![]() |
8820c7baf1 | ||
![]() |
1e70b3817e | ||
![]() |
1f37b6c91b | ||
![]() |
832e3f5d49 | ||
![]() |
c080522102 | ||
![]() |
d95fdfee94 | ||
![]() |
6a1a38b395 | ||
![]() |
d74025bd80 | ||
![]() |
413de284ed | ||
![]() |
d0224b23b0 | ||
![]() |
6334516639 | ||
![]() |
aadf32ab3e | ||
![]() |
6424f823b2 | ||
![]() |
8bfb269b37 | ||
![]() |
3935f6b389 | ||
![]() |
f5dd24bce4 | ||
![]() |
d96425d19e | ||
![]() |
279e31bc55 | ||
![]() |
f1fc874da8 | ||
![]() |
a871a68f3c | ||
![]() |
a964af67ec | ||
![]() |
6f205f89b2 | ||
![]() |
35b3192c2b | ||
![]() |
be4721b24d | ||
![]() |
a9a8a208a6 | ||
![]() |
f58a86d747 | ||
![]() |
4ce5d07125 | ||
![]() |
658af081ee | ||
![]() |
6261fce91f | ||
![]() |
fdfa917cdb | ||
![]() |
46552faa2e | ||
![]() |
e8f655439d | ||
![]() |
c11093fa71 | ||
![]() |
af7282511a | ||
![]() |
58b6cf0174 | ||
![]() |
1285e59080 | ||
![]() |
cb0ee5aa41 | ||
![]() |
95ebb4aaec | ||
![]() |
7abcb61afb | ||
![]() |
97f9919250 | ||
![]() |
d6e738ac4c | ||
![]() |
91a63933ec | ||
![]() |
448756ab54 | ||
![]() |
7805e05495 | ||
![]() |
98782d3a1f | ||
![]() |
76dacf8e90 | ||
![]() |
681d3c3ed8 | ||
![]() |
d2c82c1802 | ||
![]() |
ff5240c0bc | ||
![]() |
3852117581 | ||
![]() |
bf55d940b6 | ||
![]() |
e0ee9b1bc0 | ||
![]() |
51aea90e9a | ||
![]() |
7918f96f94 | ||
![]() |
be8faae68c | ||
![]() |
04ebf0ddc9 | ||
![]() |
223c8c92cb | ||
![]() |
b4dece88e9 | ||
![]() |
d075766760 | ||
![]() |
8754b9dd5d | ||
![]() |
fb7cd9ca40 | ||
![]() |
5553cbbb22 | ||
![]() |
858d512766 | ||
![]() |
781065dee4 | ||
![]() |
bf64509216 | ||
![]() |
2525966853 | ||
![]() |
173ba2ecf5 | ||
![]() |
8e147206d8 | ||
![]() |
1230da7fc7 | ||
![]() |
a0d328d734 | ||
![]() |
4e3d935acf | ||
![]() |
bbc7fe6163 | ||
![]() |
3fad11e104 | ||
![]() |
8788b49351 | ||
![]() |
7a8a1315c0 | ||
![]() |
9213afbacd | ||
![]() |
c77a6e156c | ||
![]() |
02246f64d2 | ||
![]() |
bf1edd99f9 | ||
![]() |
6f09bc7dc7 | ||
![]() |
96ac2369b6 | ||
![]() |
8c7edebe93 | ||
![]() |
aab7631a9f | ||
![]() |
38ee1724a8 | ||
![]() |
0c7e2e2364 | ||
![]() |
f693084065 | ||
![]() |
a5ecc7a06d | ||
![]() |
36fdff8378 | ||
![]() |
0e7e597384 | ||
![]() |
dc857f804e | ||
![]() |
0bd2340a33 | ||
![]() |
d972ddd932 | ||
![]() |
54307bb0f4 | ||
![]() |
b3fa9167a0 | ||
![]() |
7508d9adc5 | ||
![]() |
d91b3ce857 | ||
![]() |
11542b3b5d | ||
![]() |
b46da49f85 | ||
![]() |
0e105afbf9 | ||
![]() |
565f1543c6 | ||
![]() |
bafb991a35 | ||
![]() |
385bf328c2 | ||
![]() |
3290c38260 | ||
![]() |
621d6cbda1 | ||
![]() |
0d8016d926 | ||
![]() |
f6b321d769 | ||
![]() |
3fb6acbf8f | ||
![]() |
cbeee51108 | ||
![]() |
a599e33ec2 | ||
![]() |
5e61867c89 | ||
![]() |
d6d465d207 | ||
![]() |
c96cc21692 | ||
![]() |
36c84b3fec | ||
![]() |
9cca389031 | ||
![]() |
a3092fc174 | ||
![]() |
26f6aec442 | ||
![]() |
e965507470 | ||
![]() |
21ecc28b40 | ||
![]() |
374e788e81 | ||
![]() |
7219d604a9 | ||
![]() |
e52fcd0bdd | ||
![]() |
1c43e8e15c | ||
![]() |
e7d239b579 | ||
![]() |
904a200620 | ||
![]() |
3e5b395792 | ||
![]() |
6ac8523f78 | ||
![]() |
6d1a38d2ff | ||
![]() |
85e7010689 | ||
![]() |
505689de39 | ||
![]() |
26bab802c7 | ||
![]() |
1d4bb50b32 | ||
![]() |
2516b20efc | ||
![]() |
977a3f2246 | ||
![]() |
54446f1ec5 | ||
![]() |
1b20fe9723 | ||
![]() |
0ac339494f | ||
![]() |
65fd3a3193 | ||
![]() |
34e0942fa2 | ||
![]() |
2b3dee6e45 | ||
![]() |
8383b1b9bc | ||
![]() |
303e5be16c | ||
![]() |
1d1875718d | ||
![]() |
7043892e87 | ||
![]() |
809c450164 | ||
![]() |
3bbd8fe4c9 | ||
![]() |
beb308c5b3 | ||
![]() |
818cb2fd76 | ||
![]() |
e628f64a93 | ||
![]() |
be7c6377ca | ||
![]() |
5f9b965be3 | ||
![]() |
6d5f33856c | ||
![]() |
e0bd684248 | ||
![]() |
17312a0232 | ||
![]() |
a05aba4cc9 | ||
![]() |
3c27f46c57 | ||
![]() |
275e01acba | ||
![]() |
9ccb340d63 | ||
![]() |
9aaf63139a | ||
![]() |
67dde70bec | ||
![]() |
54db85bfea | ||
![]() |
72135c294e | ||
![]() |
d0eca268ad | ||
![]() |
2ed4469029 | ||
![]() |
98cf63ebb2 | ||
![]() |
a32e72b660 | ||
![]() |
e7824f05cb | ||
![]() |
e2fd5ecd02 | ||
![]() |
a7d0d414b2 | ||
![]() |
8edf96fe1c | ||
![]() |
807a5bfab4 | ||
![]() |
526d2a61f8 | ||
![]() |
8ab00442ea | ||
![]() |
cba803abaf | ||
![]() |
54a09ead95 | ||
![]() |
c2ea23f01f | ||
![]() |
5cec92ceb3 | ||
![]() |
44dcac7501 | ||
![]() |
c50a82a60e | ||
![]() |
f5ef0b600e | ||
![]() |
41f3f9fb32 | ||
![]() |
46583cf4eb | ||
![]() |
eb3e924c44 | ||
![]() |
222c46e7f0 | ||
![]() |
00ac6ccb37 | ||
![]() |
e6bd1ae9dc | ||
![]() |
5073cfaea2 | ||
![]() |
749db745d0 | ||
![]() |
d54d13ef28 | ||
![]() |
dfa0ad5b7a | ||
![]() |
60280361b0 | ||
![]() |
8e6f5bbdb1 | ||
![]() |
8002d9e2eb | ||
![]() |
f02114eaab | ||
![]() |
2469419070 | ||
![]() |
97ee5a8488 | ||
![]() |
d2b9240a22 | ||
![]() |
37829696d8 | ||
![]() |
2705c0de03 | ||
![]() |
5b58883db8 | ||
![]() |
3bc39409e5 | ||
![]() |
2f3f76fa24 | ||
![]() |
7b6764da20 | ||
![]() |
f66f4f438f | ||
![]() |
ddd6e9ac73 | ||
![]() |
31578ae72d | ||
![]() |
5d70b8922d | ||
![]() |
26956bf128 | ||
![]() |
11aa7a7052 | ||
![]() |
2b4940d67d | ||
![]() |
c5220bd92d | ||
![]() |
0506ba872a | ||
![]() |
4a6f8a62c5 | ||
![]() |
35224e5fe2 | ||
![]() |
7ec5bdcca4 | ||
![]() |
1babceb63c | ||
![]() |
237518ba3b | ||
![]() |
7e6fd1ebe2 | ||
![]() |
5e1f0c620a | ||
![]() |
d8e26dcb17 | ||
![]() |
aaea8cf45e | ||
![]() |
97e07f8473 | ||
![]() |
3a816e7298 | ||
![]() |
41a9ac953a | ||
![]() |
a71bdbd2bb | ||
![]() |
70b4a374cd | ||
![]() |
668bf327d5 | ||
![]() |
3dce04e0a9 | ||
![]() |
24957f44df | ||
![]() |
6e64556326 | ||
![]() |
b7fa22d80c | ||
![]() |
01908b1278 | ||
![]() |
57f0a3aa8e | ||
![]() |
f1a10d11c3 | ||
![]() |
5a26edf6c0 | ||
![]() |
b92b344844 | ||
![]() |
b51ca4fb15 | ||
![]() |
3bb005b973 | ||
![]() |
d91934b219 | ||
![]() |
9f061c5eba | ||
![]() |
ff6188bd80 | ||
![]() |
dc1b2a6873 | ||
![]() |
c8f0b39075 | ||
![]() |
7e1cc27c76 | ||
![]() |
8bff32adab | ||
![]() |
d732a146c2 | ||
![]() |
b9bc518a0a | ||
![]() |
edf32911be | ||
![]() |
b8470a471b | ||
![]() |
45880395ea | ||
![]() |
6f3c9205cd | ||
![]() |
96c90b24d1 | ||
![]() |
aa4bfa0727 | ||
![]() |
8873ffca12 | ||
![]() |
0bda748ad9 | ||
![]() |
f363af482e | ||
![]() |
b60fc1b056 | ||
![]() |
867686fe34 | ||
![]() |
7c3bd9abd2 | ||
![]() |
60f92dcdbc | ||
![]() |
d3257cef80 | ||
![]() |
69f31097e7 | ||
![]() |
9b34adf2c9 | ||
![]() |
3b7cabee4b | ||
![]() |
4fe2f31301 | ||
![]() |
4f9988a799 | ||
![]() |
22f83f1614 | ||
![]() |
f476c25c6d | ||
![]() |
1d08155fb1 | ||
![]() |
a9818b40b6 | ||
![]() |
85774b7e46 | ||
![]() |
886eda92a9 | ||
![]() |
1d86cf01ad | ||
![]() |
70b948fd17 | ||
![]() |
0d98e6ca53 | ||
![]() |
8d90815862 | ||
![]() |
6871ad09e6 | ||
![]() |
479188bc40 | ||
![]() |
c3c7ccd78a | ||
![]() |
000b432bb2 | ||
![]() |
dacd2cbc30 | ||
![]() |
c7b38b824b | ||
![]() |
770fc412ca | ||
![]() |
cc4af0cafa | ||
![]() |
03b5c00f03 | ||
![]() |
faf282b45b | ||
![]() |
02b2d71eb3 | ||
![]() |
e25515a960 | ||
![]() |
ca386ab597 | ||
![]() |
fe07e9da46 | ||
![]() |
a9610d3ba0 | ||
![]() |
276b5c748a | ||
![]() |
1ecae7dc93 | ||
![]() |
239fad94ee | ||
![]() |
11affc32ee | ||
![]() |
aa3a19b63c | ||
![]() |
542fc19862 | ||
![]() |
78c44bf793 | ||
![]() |
5d56835c31 | ||
![]() |
4a7e4a3bcb | ||
![]() |
6a31ae6b4f | ||
![]() |
a24f96ed60 | ||
![]() |
798f9f8b78 | ||
![]() |
80fa3e9597 | ||
![]() |
60ea9a2972 | ||
![]() |
1165fb163d | ||
![]() |
87a0ab3438 | ||
![]() |
160c7d399a | ||
![]() |
e87243c135 | ||
![]() |
886405b65f | ||
![]() |
761fa27eea | ||
![]() |
93a920cdfe | ||
![]() |
d22ee8d1d5 | ||
![]() |
f806de3a1d | ||
![]() |
8de1bde8f4 | ||
![]() |
31a1de1566 | ||
![]() |
c6bf9083c8 | ||
![]() |
8e95cdb883 | ||
![]() |
68ff352f2d | ||
![]() |
f02dfe60af | ||
![]() |
9be9601927 | ||
![]() |
f81e4d4361 | ||
![]() |
fdf9988af1 | ||
![]() |
ae7003aa39 | ||
![]() |
f35fb3955d | ||
![]() |
4499926453 | ||
![]() |
252a8a73b1 | ||
![]() |
1564358421 | ||
![]() |
72d2d04dcc | ||
![]() |
005c998438 | ||
![]() |
e0bf7faf78 | ||
![]() |
a1563c9f7d | ||
![]() |
4ed7b2be02 | ||
![]() |
af9566df75 | ||
![]() |
89b392327a | ||
![]() |
9c2dae92f8 | ||
![]() |
403ac4b76b | ||
![]() |
0620c6daf2 | ||
![]() |
1f4e335f8d | ||
![]() |
18bc2af570 | ||
![]() |
fe4485c55f | ||
![]() |
5718be50ee | ||
![]() |
8e794e3af9 | ||
![]() |
7979b2830f | ||
![]() |
a807a58a29 | ||
![]() |
8d53fa17da | ||
![]() |
c0b80df1cb | ||
![]() |
65a08efa00 | ||
![]() |
60266289e0 | ||
![]() |
3145758411 | ||
![]() |
d7948a845d | ||
![]() |
aff69e583e | ||
![]() |
d3d4948b3a | ||
![]() |
4dbfa2f0d3 | ||
![]() |
25e9bb354e | ||
![]() |
e7f7b6ad68 | ||
![]() |
7ca76b02e1 | ||
![]() |
282da45d0e | ||
![]() |
7e119381e8 | ||
![]() |
4a4d715270 | ||
![]() |
1d5378a4f2 | ||
![]() |
62b991b6f7 | ||
![]() |
952f2fb92c | ||
![]() |
84065838e0 | ||
![]() |
b5e58f4076 | ||
![]() |
2cc4f23856 | ||
![]() |
ce875c9a33 | ||
![]() |
fd0f51926e | ||
![]() |
733d6fe6eb | ||
![]() |
904be162a8 | ||
![]() |
3489fc49b9 | ||
![]() |
b2509c82b8 | ||
![]() |
65ee65b3ec | ||
![]() |
1ff7218558 | ||
![]() |
5b705cf94f | ||
![]() |
bffbf87cb3 | ||
![]() |
63890cc2fd | ||
![]() |
9ade49b39c | ||
![]() |
53b4f584db | ||
![]() |
61747b67a3 | ||
![]() |
b5ba09500f | ||
![]() |
6d49cd6859 | ||
![]() |
5eb116059b | ||
![]() |
bcdd1c56bf | ||
![]() |
7b0f6c1c74 | ||
![]() |
26df81816e | ||
![]() |
cbcd2cce9b | ||
![]() |
201016ccc5 | ||
![]() |
c0fcf4f3b1 | ||
![]() |
55ce05fc75 | ||
![]() |
aaf9fd5f03 | ||
![]() |
783becebf6 | ||
![]() |
3e098ab73b | ||
![]() |
94c3d7fb60 | ||
![]() |
a2db4a464a | ||
![]() |
8f733c6b01 | ||
![]() |
78e118c876 | ||
![]() |
fe7da97c5c | ||
![]() |
c294a0a9ac | ||
![]() |
30fe363b57 | ||
![]() |
4ec57836d8 | ||
![]() |
5b7ba838f1 | ||
![]() |
ac99eb59d2 | ||
![]() |
1be09df9d4 | ||
![]() |
f604017f93 | ||
![]() |
9ae00ebcdb | ||
![]() |
fd208ddcaf | ||
![]() |
997a3771f1 | ||
![]() |
d79671e04a | ||
![]() |
a935380713 | ||
![]() |
d61bfde167 | ||
![]() |
fc3018e977 | ||
![]() |
63c2d36232 | ||
![]() |
c0a43f5d5a | ||
![]() |
ad6c76116d | ||
![]() |
df858dc7b6 | ||
![]() |
4a4e614b64 | ||
![]() |
3ba0fee406 | ||
![]() |
36247bc5af | ||
![]() |
0643c71523 | ||
![]() |
cbc97dacdf | ||
![]() |
8405454a1a | ||
![]() |
a1c0761ef9 | ||
![]() |
38b3a2080b | ||
![]() |
0fec0ef624 | ||
![]() |
42ac630304 | ||
![]() |
7e77433ef7 | ||
![]() |
453c16d08e | ||
![]() |
c19fa122af | ||
![]() |
aadf5339a4 | ||
![]() |
f0d6789722 | ||
![]() |
a47a9e400b | ||
![]() |
7ef61d58fd | ||
![]() |
96ae4a5967 | ||
![]() |
bca645f63d | ||
![]() |
a8105f084e | ||
![]() |
d7f59c1091 | ||
![]() |
3df7cf2266 | ||
![]() |
e86f09aaed | ||
![]() |
692a7471c1 | ||
![]() |
480645d22f | ||
![]() |
784a853ec7 | ||
![]() |
088fc392ab | ||
![]() |
0d7644c782 | ||
![]() |
f15d24b4e8 | ||
![]() |
510549f365 | ||
![]() |
99313fe162 | ||
![]() |
e8ee5f548f | ||
![]() |
862d20ce9d | ||
![]() |
f9df193b7b | ||
![]() |
113a400952 | ||
![]() |
b6983e4b21 | ||
![]() |
fc400ea57b | ||
![]() |
068a74adeb | ||
![]() |
1a8743ec11 | ||
![]() |
9925b9b455 | ||
![]() |
4c43bae92d | ||
![]() |
659db9f04b | ||
![]() |
52603d7acd | ||
![]() |
c56025ec3b | ||
![]() |
b88d1dfaa9 | ||
![]() |
7c79bbd6b0 | ||
![]() |
ce6bfcb7f5 | ||
![]() |
6ce543e118 | ||
![]() |
0c0f7a739e | ||
![]() |
33e94d3f35 | ||
![]() |
5fdbf5d891 | ||
![]() |
6d0d8ac8e6 | ||
![]() |
fb031ee11a | ||
![]() |
adff22c1e2 | ||
![]() |
56c3809b57 | ||
![]() |
8b0a5be6d9 | ||
![]() |
52ed38719f | ||
![]() |
0bcd5d28e8 | ||
![]() |
b134766647 | ||
![]() |
aa5d586bd6 | ||
![]() |
b12b8a9278 | ||
![]() |
3c13386e5d | ||
![]() |
a177141962 | ||
![]() |
92f1644550 | ||
![]() |
07dcb64b22 | ||
![]() |
0f2b941e2d | ||
![]() |
c89557d85c | ||
![]() |
e8ad72a980 | ||
![]() |
a8fe640546 | ||
![]() |
01bbcc597a | ||
![]() |
6fb5641afc | ||
![]() |
fe32bcbf7c | ||
![]() |
f47e920a97 | ||
![]() |
1571b25d29 | ||
![]() |
4a92fc5c92 | ||
![]() |
8d6317b49a | ||
![]() |
ee49c4b660 | ||
![]() |
72038a68a9 | ||
![]() |
051260e9a8 | ||
![]() |
3cf0a2b290 | ||
![]() |
adfb60e045 | ||
![]() |
ac595eb96c | ||
![]() |
79bae62ce0 | ||
![]() |
3038ce5864 | ||
![]() |
c8a826dfce | ||
![]() |
4286372a9c | ||
![]() |
0075538431 | ||
![]() |
8db9700807 | ||
![]() |
1fa8de2771 | ||
![]() |
09d9c31d53 | ||
![]() |
fadae38bec | ||
![]() |
e46626d3ed | ||
![]() |
8f572021af | ||
![]() |
4952b13ad0 | ||
![]() |
d1fba9c567 | ||
![]() |
cd9bf03fb7 | ||
![]() |
c2e26baf4d | ||
![]() |
1d88ac43cf | ||
![]() |
6102285577 | ||
![]() |
b83603488c | ||
![]() |
f6b1e049f1 | ||
![]() |
f487dcd57b | ||
![]() |
71478f5a64 | ||
![]() |
c9ace33cf1 | ||
![]() |
4ecf7806cd | ||
![]() |
c117447bb3 | ||
![]() |
1f7aec7405 | ||
![]() |
30646d80f1 | ||
![]() |
6e74e91b5d | ||
![]() |
eb4bd314b6 | ||
![]() |
7a3ce3e337 | ||
![]() |
d1045ed644 | ||
![]() |
396ea3cec2 | ||
![]() |
51d076a83b | ||
![]() |
dff8b783b8 | ||
![]() |
78c1a3d980 | ||
![]() |
23cbf50413 | ||
![]() |
dff13439f6 | ||
![]() |
b61ea4b8aa | ||
![]() |
cf22e30237 | ||
![]() |
f01971b67c | ||
![]() |
c62be1bb45 | ||
![]() |
cf1880343b | ||
![]() |
0c57433567 | ||
![]() |
5ef0527ebc | ||
![]() |
53ef5c51cc | ||
![]() |
b5fd8fb7c1 | ||
![]() |
4ba3e2cff3 | ||
![]() |
58c7934dd8 | ||
![]() |
0a626917f8 | ||
![]() |
922bb1452f | ||
![]() |
1cda37659e | ||
![]() |
fe2e46fe60 | ||
![]() |
7765afa7da | ||
![]() |
55d7e9ec61 | ||
![]() |
6a4ad8af06 | ||
![]() |
018440354f | ||
![]() |
a818f3e3ae | ||
![]() |
58bad981be | ||
![]() |
6a5b7c40bd | ||
![]() |
6e6e92a1d1 | ||
![]() |
99244ffae5 | ||
![]() |
379722d0fb | ||
![]() |
0c5cf72235 | ||
![]() |
57a9d7356c | ||
![]() |
a9c5d903c5 | ||
![]() |
d80e1a2662 | ||
![]() |
bf52e76a39 | ||
![]() |
31a8e040fa | ||
![]() |
f7d83e2cda | ||
![]() |
0555368e1c | ||
![]() |
adfe1728ae | ||
![]() |
2acad550da | ||
![]() |
b0b276898a | ||
![]() |
25a678caec | ||
![]() |
3e18e76d31 | ||
![]() |
3ba33c8b75 | ||
![]() |
7c87df7cf6 | ||
![]() |
dba7197fc6 | ||
![]() |
902a9dd42b | ||
![]() |
461a293d71 | ||
![]() |
9f8457d249 | ||
![]() |
8c43d2273f | ||
![]() |
69ec4a0359 | ||
![]() |
9469f759a9 | ||
![]() |
60bb7b5b6c | ||
![]() |
4787bb07df | ||
![]() |
33050e1812 | ||
![]() |
6dc8e58b47 | ||
![]() |
839645f161 | ||
![]() |
d9daf19055 | ||
![]() |
f42cec282a | ||
![]() |
fff25e7e2c | ||
![]() |
2a8323f951 | ||
![]() |
390e22cc0b | ||
![]() |
a3ee21d7fc | ||
![]() |
8f2a5064cb | ||
![]() |
61fb9e50d3 | ||
![]() |
03c59adaed | ||
![]() |
7198fe55a9 | ||
![]() |
3394541b41 | ||
![]() |
54ab3fc3b2 | ||
![]() |
36a727d44e | ||
![]() |
6d2904cff1 | ||
![]() |
55fac29b3e | ||
![]() |
5e966d60b0 | ||
![]() |
c08f927d60 | ||
![]() |
06d2ba8398 | ||
![]() |
9637b0c187 | ||
![]() |
5834818ebe | ||
![]() |
7f1e0ab422 | ||
![]() |
b461efab5d | ||
![]() |
ca96c0f45f | ||
![]() |
122e5929bc | ||
![]() |
b0cfdcc22f | ||
![]() |
7960f94eba | ||
![]() |
3f486ac0e1 | ||
![]() |
b36cdaceca | ||
![]() |
3b8c48dd26 | ||
![]() |
af73818c90 | ||
![]() |
77e700832f | ||
![]() |
111e067df5 | ||
![]() |
58e9e5658b | ||
![]() |
f92ad6307e | ||
![]() |
f31cddee0c | ||
![]() |
b232975064 | ||
![]() |
f3f25c7874 | ||
![]() |
5619f8771b | ||
![]() |
3389ecdfea | ||
![]() |
87675e687e | ||
![]() |
827808dca3 | ||
![]() |
d65191f6c1 | ||
![]() |
6eee8973ba | ||
![]() |
d8500f9e08 | ||
![]() |
99a79e15f3 | ||
![]() |
31ec3d1496 | ||
![]() |
3b5f5c7843 | ||
![]() |
3128ba73a0 | ||
![]() |
d97e31a38c | ||
![]() |
74a9e86e74 | ||
![]() |
a641fd51e8 | ||
![]() |
0a0bd0ac97 | ||
![]() |
4051b42b5a | ||
![]() |
6e5cd2b3c2 | ||
![]() |
f12b19216b | ||
![]() |
345e82abee | ||
![]() |
3118c7c532 | ||
![]() |
fc0ade2985 | ||
![]() |
6eae46b927 | ||
![]() |
985eda2dee | ||
![]() |
45552451fe | ||
![]() |
18ea27ac58 | ||
![]() |
b4f444869e | ||
![]() |
13d85b6ee5 | ||
![]() |
e6906563a4 | ||
![]() |
2dce7f0268 | ||
![]() |
6fa8a51a21 | ||
![]() |
995449cbf6 | ||
![]() |
ce3d9fcdde | ||
![]() |
c279a9f9ed | ||
![]() |
cdb4639aa4 | ||
![]() |
2a9eb7f123 | ||
![]() |
1fec55d5f7 | ||
![]() |
4559ba625c | ||
![]() |
49a197eaa8 | ||
![]() |
3abe7cfc45 | ||
![]() |
41c7b08c99 | ||
![]() |
da79b371fe | ||
![]() |
c8d155c455 | ||
![]() |
f00871a6b4 | ||
![]() |
b4e32542e8 | ||
![]() |
0239e49d92 | ||
![]() |
99beeba261 | ||
![]() |
a1673d3aca | ||
![]() |
672a289909 | ||
![]() |
dc22189eef | ||
![]() |
5f740312fe | ||
![]() |
123d53c265 | ||
![]() |
b928e60d8b | ||
![]() |
9688269027 | ||
![]() |
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 | ||
![]() |
faa1fda7ba | ||
![]() |
29e5e66481 | ||
![]() |
52b33f6f47 | ||
![]() |
5aee43d05b | ||
![]() |
836d3a87be | ||
![]() |
7b29a380fc | ||
![]() |
997c23befa | ||
![]() |
fcd983d915 | ||
![]() |
24d43849a0 | ||
![]() |
4ce26296d6 | ||
![]() |
4342759da7 | ||
![]() |
25f2d224f1 | ||
![]() |
8b8b828cd1 | ||
![]() |
65dabeaf15 | ||
![]() |
0480339272 | ||
![]() |
b09cdc0a18 | ||
![]() |
c3b86b687c | ||
![]() |
0abb4f8c6f | ||
![]() |
ccdb803501 | ||
![]() |
1e864a508d | ||
![]() |
697ac18872 | ||
![]() |
fc229cf274 | ||
![]() |
b48136d994 | ||
![]() |
77ba7c987a | ||
![]() |
84f3baf013 | ||
![]() |
5f1cfc7519 | ||
![]() |
e52de6c279 | ||
![]() |
8a55b212a2 | ||
![]() |
aa7f5a8387 | ||
![]() |
5fc99f1982 | ||
![]() |
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 | ||
![]() |
b9531d56c4 | ||
![]() |
a61d94d3aa | ||
![]() |
13114ebaa1 | ||
![]() |
e251baa61c | ||
![]() |
d165e8a642 | ||
![]() |
c10f76580f | ||
![]() |
c2f60568cf | ||
![]() |
6518e1300f | ||
![]() |
22a7234b54 | ||
![]() |
67cbdb41f7 | ||
![]() |
2cce8eebc3 | ||
![]() |
3d5616cb35 | ||
![]() |
f15e8c9edb | ||
![]() |
a23f0da2a4 | ||
![]() |
975f36c7db | ||
![]() |
fee2b244a1 | ||
![]() |
791e67641e | ||
![]() |
e33c4acf7d | ||
![]() |
a2d1fb5e54 | ||
![]() |
bb16e50233 | ||
![]() |
86e1bb38ee | ||
![]() |
f211ed686c | ||
![]() |
77999f0b37 | ||
![]() |
40e75fe9b4 | ||
![]() |
f979ced49d | ||
![]() |
fe8474f6c0 | ||
![]() |
8b42302f9b | ||
![]() |
bee2b696aa | ||
![]() |
5c69e5fdb0 | ||
![]() |
8d48f8d8b0 | ||
![]() |
9ee45767de | ||
![]() |
b193013c84 | ||
![]() |
a3930eb629 | ||
![]() |
619ae2fb6d | ||
![]() |
0605b85d99 | ||
![]() |
077cc653d0 | ||
![]() |
cf54ddc62b | ||
![]() |
e7a1d8390c | ||
![]() |
4202488da0 | ||
![]() |
f8a4488050 | ||
![]() |
b4618f9ba1 | ||
![]() |
2c5d83fab3 | ||
![]() |
e0e038d223 | ||
![]() |
f4cb6a1927 | ||
![]() |
f3b939e03a | ||
![]() |
12e1af44fc | ||
![]() |
7dd21d85ba | ||
![]() |
fdd900060a | ||
![]() |
ebef1c4f6b | ||
![]() |
bbc6eb6ee7 | ||
![]() |
fb5d80a7a1 | ||
![]() |
2740edfc2b | ||
![]() |
4da9c71be9 | ||
![]() |
21479b2b28 | ||
![]() |
483722fb3d | ||
![]() |
58bc6c7f02 | ||
![]() |
b243609e87 | ||
![]() |
f346056058 | ||
![]() |
f67254cdc7 | ||
![]() |
cc2c828e78 | ||
![]() |
825f50299a | ||
![]() |
1db4230d35 | ||
![]() |
4736e59393 | ||
![]() |
275f2002b5 | ||
![]() |
c2e8cb75bd | ||
![]() |
b746747650 | ||
![]() |
1e53c121ae |
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"]
|
|
||||||
}
|
|
148
.cspell/code-terms.txt
Normal file
148
.cspell/code-terms.txt
Normal file
@@ -0,0 +1,148 @@
|
|||||||
|
# This file contains coding related terms
|
||||||
|
ALPHANUM
|
||||||
|
antiscript
|
||||||
|
APPLYCLASS
|
||||||
|
ARROWHEADSTYLE
|
||||||
|
ARROWTYPE
|
||||||
|
autonumber
|
||||||
|
axisl-line
|
||||||
|
Bigdecimal
|
||||||
|
birel
|
||||||
|
BIREL
|
||||||
|
bqstring
|
||||||
|
BQUOTE
|
||||||
|
bramp
|
||||||
|
BRKT
|
||||||
|
brotli
|
||||||
|
callbackargs
|
||||||
|
callbackname
|
||||||
|
classdef
|
||||||
|
classdefid
|
||||||
|
classentity
|
||||||
|
classname
|
||||||
|
COLONSEP
|
||||||
|
COMPOSIT_STATE
|
||||||
|
concat
|
||||||
|
controlx
|
||||||
|
controly
|
||||||
|
CSSCLASS
|
||||||
|
CYLINDEREND
|
||||||
|
CYLINDERSTART
|
||||||
|
DAGA
|
||||||
|
datakey
|
||||||
|
DEND
|
||||||
|
descr
|
||||||
|
distp
|
||||||
|
distq
|
||||||
|
divs
|
||||||
|
docref
|
||||||
|
DOMID
|
||||||
|
doublecircle
|
||||||
|
DOUBLECIRCLEEND
|
||||||
|
DOUBLECIRCLESTART
|
||||||
|
DQUOTE
|
||||||
|
DSTART
|
||||||
|
edgesep
|
||||||
|
EMPTYSTR
|
||||||
|
enddate
|
||||||
|
ERDIAGRAM
|
||||||
|
flatmap
|
||||||
|
forwardable
|
||||||
|
frontmatter
|
||||||
|
funs
|
||||||
|
gantt
|
||||||
|
GENERICTYPE
|
||||||
|
getBoundarys
|
||||||
|
grammr
|
||||||
|
graphtype
|
||||||
|
iife
|
||||||
|
interp
|
||||||
|
introdcued
|
||||||
|
INVTRAPEND
|
||||||
|
INVTRAPSTART
|
||||||
|
JDBC
|
||||||
|
jison
|
||||||
|
Kaufmann
|
||||||
|
keyify
|
||||||
|
LABELPOS
|
||||||
|
LABELTYPE
|
||||||
|
lcov
|
||||||
|
LEFTOF
|
||||||
|
Lexa
|
||||||
|
linebreak
|
||||||
|
LINETYPE
|
||||||
|
LINKSTYLE
|
||||||
|
LLABEL
|
||||||
|
loglevel
|
||||||
|
LOGMSG
|
||||||
|
lookaheads
|
||||||
|
mdast
|
||||||
|
metafile
|
||||||
|
minlen
|
||||||
|
Mstartx
|
||||||
|
MULT
|
||||||
|
NODIR
|
||||||
|
NSTR
|
||||||
|
outdir
|
||||||
|
Qcontrolx
|
||||||
|
reinit
|
||||||
|
rels
|
||||||
|
reqs
|
||||||
|
rewritelinks
|
||||||
|
rgba
|
||||||
|
RIGHTOF
|
||||||
|
roughjs
|
||||||
|
sankey
|
||||||
|
sequencenumber
|
||||||
|
shrc
|
||||||
|
signaltype
|
||||||
|
someclass
|
||||||
|
SPACELINE
|
||||||
|
SPACELIST
|
||||||
|
STADIUMEND
|
||||||
|
STADIUMSTART
|
||||||
|
startdate
|
||||||
|
startx
|
||||||
|
starty
|
||||||
|
STMNT
|
||||||
|
stopx
|
||||||
|
stopy
|
||||||
|
strikethrough
|
||||||
|
stringifying
|
||||||
|
struct
|
||||||
|
STYLECLASS
|
||||||
|
STYLEDEF
|
||||||
|
STYLEOPTS
|
||||||
|
subcomponent
|
||||||
|
subcomponents
|
||||||
|
subconfig
|
||||||
|
SUBROUTINEEND
|
||||||
|
SUBROUTINESTART
|
||||||
|
Subschemas
|
||||||
|
substr
|
||||||
|
SVGG
|
||||||
|
SVGSVG
|
||||||
|
TAGEND
|
||||||
|
TAGSTART
|
||||||
|
techn
|
||||||
|
TESTSTR
|
||||||
|
TEXTDATA
|
||||||
|
TEXTLENGTH
|
||||||
|
titlevalue
|
||||||
|
topbar
|
||||||
|
TRAPEND
|
||||||
|
TRAPSTART
|
||||||
|
treemap
|
||||||
|
ts-nocheck
|
||||||
|
tsdoc
|
||||||
|
typeof
|
||||||
|
typestr
|
||||||
|
unshift
|
||||||
|
verifymethod
|
||||||
|
VERIFYMTHD
|
||||||
|
WARN_DOCSDIR_DOESNT_MATCH
|
||||||
|
xhost
|
||||||
|
yaxis
|
||||||
|
yfunc
|
||||||
|
yytext
|
||||||
|
zenuml
|
9
.cspell/contributors.txt
Normal file
9
.cspell/contributors.txt
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
# Contributors to mermaidjs, one per line
|
||||||
|
Ashish Jain
|
||||||
|
cpettitt
|
||||||
|
Dong Cai
|
||||||
|
Nikolay Rozhkov
|
||||||
|
Peng Xiao
|
||||||
|
Per Brolin
|
||||||
|
subhash-halder
|
||||||
|
Vinod Sidharth
|
52
.cspell/cspell.config.yaml
Normal file
52
.cspell/cspell.config.yaml
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
# yaml-language-server: $schema=https://raw.githubusercontent.com/streetsidesoftware/cspell/main/cspell.schema.json
|
||||||
|
|
||||||
|
$schema: https://raw.githubusercontent.com/streetsidesoftware/cspell/main/cspell.schema.json
|
||||||
|
|
||||||
|
dictionaryDefinitions:
|
||||||
|
- name: code-terms
|
||||||
|
path: ./code-terms.txt
|
||||||
|
description: A list of coding related terms.
|
||||||
|
addWords: true
|
||||||
|
- name: mermaid-terms
|
||||||
|
path: ./mermaid-terms.txt
|
||||||
|
description: A list of terms related to the mermaid project.
|
||||||
|
addWords: true
|
||||||
|
- name: misc-terms
|
||||||
|
path: ./misc-terms.txt
|
||||||
|
description: A list of miscellaneous terms.
|
||||||
|
- name: 3rd-party-terms
|
||||||
|
path: ./libraries.txt
|
||||||
|
description: A list of 3rd party terms from dependencies.
|
||||||
|
addWords: true
|
||||||
|
- name: contributors
|
||||||
|
path: ./contributors.txt
|
||||||
|
description: A list of contributors to the mermaid project.
|
||||||
|
type: 'W'
|
||||||
|
addWords: true
|
||||||
|
|
||||||
|
# cspell:disable
|
||||||
|
- name: suggestions
|
||||||
|
words:
|
||||||
|
- none
|
||||||
|
suggestWords:
|
||||||
|
- seperator:separator
|
||||||
|
- vertice:vertex
|
||||||
|
# cspell:enable
|
||||||
|
|
||||||
|
patterns:
|
||||||
|
- name: character-set-cyrillic
|
||||||
|
pattern: '/\p{Script_Extensions=Cyrillic}+/gu'
|
||||||
|
- name: svg-block
|
||||||
|
pattern: '<svg[\S\s]+?</svg>'
|
||||||
|
- name: json-property
|
||||||
|
pattern: '/"[\w/@-]+":/g'
|
||||||
|
|
||||||
|
dictionaries:
|
||||||
|
- mermaid-terms
|
||||||
|
- suggestions
|
||||||
|
- contributors
|
||||||
|
|
||||||
|
ignorePaths:
|
||||||
|
- '*.txt' # do not spell check local dictionaries
|
||||||
|
|
||||||
|
# cspell:dictionary misc-terms
|
76
.cspell/libraries.txt
Normal file
76
.cspell/libraries.txt
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
# Add third party library terms below
|
||||||
|
acyclicer
|
||||||
|
Antlr
|
||||||
|
Appli
|
||||||
|
applitools
|
||||||
|
Asciidoctor
|
||||||
|
Astah
|
||||||
|
automerge
|
||||||
|
bilkent
|
||||||
|
bisheng
|
||||||
|
Blazor
|
||||||
|
codedoc
|
||||||
|
Codemia
|
||||||
|
codepaths
|
||||||
|
csstree
|
||||||
|
cytoscape
|
||||||
|
cytoscape-cose-bilkent
|
||||||
|
dagre
|
||||||
|
dagre-d3
|
||||||
|
Deepdwn
|
||||||
|
Docsify
|
||||||
|
Docsy
|
||||||
|
Doctave
|
||||||
|
DokuWiki
|
||||||
|
dompurify
|
||||||
|
elkjs
|
||||||
|
fontawesome
|
||||||
|
Foswiki
|
||||||
|
Gitea
|
||||||
|
graphlib
|
||||||
|
Grav
|
||||||
|
iconify
|
||||||
|
Inkdrop
|
||||||
|
jiti
|
||||||
|
jsdocs
|
||||||
|
jsfiddle
|
||||||
|
jsonschema
|
||||||
|
katex
|
||||||
|
khroma
|
||||||
|
langium
|
||||||
|
mathml
|
||||||
|
matplotlib
|
||||||
|
mdbook
|
||||||
|
Mermerd
|
||||||
|
mkdocs
|
||||||
|
Nextra
|
||||||
|
nodenext
|
||||||
|
npmjs
|
||||||
|
pageview
|
||||||
|
pathe
|
||||||
|
phpbb
|
||||||
|
pixelmatch
|
||||||
|
Podlite
|
||||||
|
presetAttributify
|
||||||
|
pyplot
|
||||||
|
redmine
|
||||||
|
rehype
|
||||||
|
roughjs
|
||||||
|
rscratch
|
||||||
|
shiki
|
||||||
|
Slidev
|
||||||
|
sparkline
|
||||||
|
sphinxcontrib
|
||||||
|
ssim
|
||||||
|
stylis
|
||||||
|
Swimm
|
||||||
|
tsbuildinfo
|
||||||
|
tseslint
|
||||||
|
Tuleap
|
||||||
|
Typora
|
||||||
|
unocss
|
||||||
|
unplugin
|
||||||
|
unstub
|
||||||
|
vite
|
||||||
|
vitest
|
||||||
|
Zune
|
41
.cspell/mermaid-terms.txt
Normal file
41
.cspell/mermaid-terms.txt
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
Adamiecki
|
||||||
|
arrowend
|
||||||
|
bmatrix
|
||||||
|
braintree
|
||||||
|
catmull
|
||||||
|
compositTitleSize
|
||||||
|
doublecircle
|
||||||
|
elems
|
||||||
|
gantt
|
||||||
|
gitgraph
|
||||||
|
gzipped
|
||||||
|
handDrawn
|
||||||
|
knsv
|
||||||
|
Knut
|
||||||
|
marginx
|
||||||
|
marginy
|
||||||
|
Markdownish
|
||||||
|
mermaidjs
|
||||||
|
mindmap
|
||||||
|
mindmaps
|
||||||
|
mrtree
|
||||||
|
multigraph
|
||||||
|
nodesep
|
||||||
|
NOTEGROUP
|
||||||
|
Pinterest
|
||||||
|
rankdir
|
||||||
|
ranksep
|
||||||
|
rect
|
||||||
|
rects
|
||||||
|
sandboxed
|
||||||
|
siebling
|
||||||
|
statediagram
|
||||||
|
substate
|
||||||
|
Sveidqvist
|
||||||
|
unfixable
|
||||||
|
Viewbox
|
||||||
|
viewports
|
||||||
|
visio
|
||||||
|
vitepress
|
||||||
|
xlink
|
||||||
|
xychart
|
6
.cspell/misc-terms.txt
Normal file
6
.cspell/misc-terms.txt
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
BRANDES
|
||||||
|
circo
|
||||||
|
handDrawn
|
||||||
|
KOEPF
|
||||||
|
neato
|
||||||
|
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
|
|
165
.eslintrc.cjs
165
.eslintrc.cjs
@@ -1,165 +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,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
'json/*': ['error', 'allowComments'],
|
|
||||||
'@cspell/spellchecker': [
|
|
||||||
'error',
|
|
||||||
{
|
|
||||||
checkIdentifiers: false,
|
|
||||||
checkStrings: false,
|
|
||||||
checkStringTemplates: false,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
'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: ['*.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,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
|
6
.github/ISSUE_TEMPLATE/config.yml
vendored
6
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -3,9 +3,9 @@ contact_links:
|
|||||||
- name: GitHub Discussions
|
- name: GitHub Discussions
|
||||||
url: https://github.com/mermaid-js/mermaid/discussions
|
url: https://github.com/mermaid-js/mermaid/discussions
|
||||||
about: Ask the Community questions or share your own graphs in our discussions.
|
about: Ask the Community questions or share your own graphs in our discussions.
|
||||||
- name: Slack
|
- name: Discord
|
||||||
url: https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE
|
url: https://discord.gg/AgrbSrBer3
|
||||||
about: Join our Community on Slack for Help and a casual chat.
|
about: Join our Community on Discord for Help and a casual chat.
|
||||||
- name: Documentation
|
- name: Documentation
|
||||||
url: https://mermaid.js.org
|
url: https://mermaid.js.org
|
||||||
about: Read our documentation for all that Mermaid.js can offer.
|
about: Read our documentation for all that Mermaid.js can offer.
|
||||||
|
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
|
||||||
|
13
.github/lychee.toml
vendored
13
.github/lychee.toml
vendored
@@ -34,8 +34,17 @@ exclude = [
|
|||||||
# Don't check files that are generated during the build via `pnpm docs:code`
|
# Don't check files that are generated during the build via `pnpm docs:code`
|
||||||
'packages/mermaid/src/docs/config/setup/*',
|
'packages/mermaid/src/docs/config/setup/*',
|
||||||
|
|
||||||
# Ignore slack invite
|
# Ignore Discord invite
|
||||||
"https://join.slack.com/"
|
"https://discord.gg",
|
||||||
|
|
||||||
|
# BundlePhobia has frequent downtime
|
||||||
|
"https://bundlephobia.com",
|
||||||
|
|
||||||
|
# Chrome webstore migration issue. Temporary
|
||||||
|
"https://chromewebstore.google.com",
|
||||||
|
|
||||||
|
# Drupal 403
|
||||||
|
"https://(www.)?drupal.org"
|
||||||
]
|
]
|
||||||
|
|
||||||
# Exclude all private IPs from checking.
|
# Exclude all private IPs from checking.
|
||||||
|
26
.github/pr-labeler.yml
vendored
26
.github/pr-labeler.yml
vendored
@@ -1,4 +1,22 @@
|
|||||||
'Type: Bug / Error': ['bug/*', fix/*]
|
# yaml-language-server: $schema=https://raw.githubusercontent.com/release-drafter/release-drafter/master/schema.json
|
||||||
'Type: Enhancement': ['feature/*', 'feat/*']
|
autolabeler:
|
||||||
'Type: Other': ['other/*', 'chore/*', 'test/*', 'refactor/*']
|
- label: 'Type: Bug / Error'
|
||||||
'Area: Documentation': ['docs/*']
|
branch:
|
||||||
|
- '/bug\/.+/'
|
||||||
|
- '/fix\/.+/'
|
||||||
|
- label: 'Type: Enhancement'
|
||||||
|
branch:
|
||||||
|
- '/feature\/.+/'
|
||||||
|
- '/feat\/.+/'
|
||||||
|
- label: 'Type: Other'
|
||||||
|
branch:
|
||||||
|
- '/other\/.+/'
|
||||||
|
- '/chore\/.+/'
|
||||||
|
- '/test\/.+/'
|
||||||
|
- '/refactor\/.+/'
|
||||||
|
- label: 'Area: Documentation'
|
||||||
|
branch:
|
||||||
|
- '/docs\/.+/'
|
||||||
|
|
||||||
|
template: |
|
||||||
|
This field is unused, as we only use this config file for labeling PRs.
|
||||||
|
4
.github/pull_request_template.md
vendored
4
.github/pull_request_template.md
vendored
@@ -12,7 +12,7 @@ Describe the way your implementation works or what design decisions you made if
|
|||||||
|
|
||||||
Make sure you
|
Make sure you
|
||||||
|
|
||||||
- [ ] :book: have read the [contribution guidelines](https://github.com/mermaid-js/mermaid/blob/develop/CONTRIBUTING.md)
|
- [ ] :book: have read the [contribution guidelines](https://mermaid.js.org/community/contributing.html)
|
||||||
- [ ] :computer: have added necessary unit/e2e tests.
|
- [ ] :computer: have added necessary unit/e2e tests.
|
||||||
- [ ] :notebook: have added documentation. Make sure [`MERMAID_RELEASE_VERSION`](https://github.com/mermaid-js/mermaid/blob/develop/packages/mermaid/src/docs/community/development.md#3-update-documentation) is used for all new features.
|
- [ ] :notebook: have added documentation. Make sure [`MERMAID_RELEASE_VERSION`](https://mermaid.js.org/community/contributing.html#update-documentation) is used for all new features.
|
||||||
- [ ] :bookmark: targeted `develop` branch
|
- [ ] :bookmark: targeted `develop` branch
|
||||||
|
2
.github/release-drafter.yml
vendored
2
.github/release-drafter.yml
vendored
@@ -25,8 +25,6 @@ categories:
|
|||||||
change-template: '- $TITLE (#$NUMBER) @$AUTHOR'
|
change-template: '- $TITLE (#$NUMBER) @$AUTHOR'
|
||||||
sort-by: title
|
sort-by: title
|
||||||
sort-direction: ascending
|
sort-direction: ascending
|
||||||
branches:
|
|
||||||
- develop
|
|
||||||
exclude-labels:
|
exclude-labels:
|
||||||
- 'Skip changelog'
|
- 'Skip changelog'
|
||||||
no-changes-template: 'This release contains minor changes and bugfixes.'
|
no-changes-template: 'This release contains minor changes and bugfixes.'
|
||||||
|
43
.github/workflows/autofix.yml
vendored
Normal file
43
.github/workflows/autofix.yml
vendored
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
name: autofix.ci # needed to securely identify the workflow
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
branches-ignore:
|
||||||
|
- 'renovate/**'
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
autofix:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- uses: pnpm/action-setup@v4
|
||||||
|
# uses version from "packageManager" field in package.json
|
||||||
|
|
||||||
|
- name: Setup Node.js
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
cache: pnpm
|
||||||
|
node-version-file: '.node-version'
|
||||||
|
|
||||||
|
- name: Install Packages
|
||||||
|
run: |
|
||||||
|
pnpm install --frozen-lockfile
|
||||||
|
env:
|
||||||
|
CYPRESS_CACHE_FOLDER: .cache/Cypress
|
||||||
|
|
||||||
|
- name: Fix Linting
|
||||||
|
shell: bash
|
||||||
|
run: pnpm -w run lint:fix
|
||||||
|
|
||||||
|
- name: Sync `./src/config.type.ts` with `./src/schemas/config.schema.yaml`
|
||||||
|
shell: bash
|
||||||
|
run: pnpm run --filter mermaid types:build-config
|
||||||
|
|
||||||
|
- name: Build Docs
|
||||||
|
working-directory: ./packages/mermaid
|
||||||
|
run: pnpm run docs:build
|
||||||
|
|
||||||
|
- uses: autofix-ci/action@ff86a557419858bb967097bfc916833f5647fa8c
|
8
.github/workflows/build-docs.yml
vendored
8
.github/workflows/build-docs.yml
vendored
@@ -16,15 +16,15 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- uses: pnpm/action-setup@v2
|
- uses: pnpm/action-setup@v4
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v3
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
cache: pnpm
|
cache: pnpm
|
||||||
node-version: 18
|
node-version-file: '.node-version'
|
||||||
|
|
||||||
- name: Install Packages
|
- name: Install Packages
|
||||||
run: pnpm install --frozen-lockfile
|
run: pnpm install --frozen-lockfile
|
||||||
|
17
.github/workflows/build.yml
vendored
17
.github/workflows/build.yml
vendored
@@ -15,20 +15,17 @@ permissions:
|
|||||||
jobs:
|
jobs:
|
||||||
build-mermaid:
|
build-mermaid:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
node-version: [18.x]
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- uses: pnpm/action-setup@v2
|
- uses: pnpm/action-setup@v4
|
||||||
# uses version from "packageManager" field in package.json
|
# uses version from "packageManager" field in package.json
|
||||||
|
|
||||||
- name: Setup Node.js ${{ matrix.node-version }}
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v3
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
cache: pnpm
|
cache: pnpm
|
||||||
node-version: ${{ matrix.node-version }}
|
node-version-file: '.node-version'
|
||||||
|
|
||||||
- name: Install Packages
|
- name: Install Packages
|
||||||
run: |
|
run: |
|
||||||
@@ -40,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
|
||||||
|
2
.github/workflows/check-readme-in-sync.yml
vendored
2
.github/workflows/check-readme-in-sync.yml
vendored
@@ -18,7 +18,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Check for difference in README.md and docs/README.md
|
- name: Check for difference in README.md and docs/README.md
|
||||||
run: |
|
run: |
|
||||||
|
2
.github/workflows/checks.yml
vendored
2
.github/workflows/checks.yml
vendored
@@ -15,7 +15,7 @@ jobs:
|
|||||||
name: check tests
|
name: check tests
|
||||||
if: github.repository_owner == 'mermaid-js'
|
if: github.repository_owner == 'mermaid-js'
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- uses: testomatio/check-tests@stable
|
- uses: testomatio/check-tests@stable
|
||||||
|
8
.github/workflows/codeql.yml
vendored
8
.github/workflows/codeql.yml
vendored
@@ -29,11 +29,11 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
# 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
|
||||||
|
6
.github/workflows/dependency-review.yml
vendored
6
.github/workflows/dependency-review.yml
vendored
@@ -1,6 +1,6 @@
|
|||||||
# Dependency Review Action
|
# Dependency Review Action
|
||||||
#
|
#
|
||||||
# This Action will scan dependency manifest files that change as part of a Pull Reqest, surfacing known-vulnerable versions of the packages declared or updated in the PR. Once installed, if the workflow run is marked as required, PRs introducing known-vulnerable packages will be blocked from merging.
|
# This Action will scan dependency manifest files that change as part of a Pull Request, surfacing known-vulnerable versions of the packages declared or updated in the PR. Once installed, if the workflow run is marked as required, PRs introducing known-vulnerable packages will be blocked from merging.
|
||||||
#
|
#
|
||||||
# Source repository: https://github.com/actions/dependency-review-action
|
# Source repository: https://github.com/actions/dependency-review-action
|
||||||
# Public documentation: https://docs.github.com/en/code-security/supply-chain-security/understanding-your-software-supply-chain/about-dependency-review#dependency-review-enforcement
|
# Public documentation: https://docs.github.com/en/code-security/supply-chain-security/understanding-your-software-supply-chain/about-dependency-review#dependency-review-enforcement
|
||||||
@@ -15,6 +15,6 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: 'Checkout Repository'
|
- name: 'Checkout Repository'
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
- name: 'Dependency Review'
|
- name: 'Dependency Review'
|
||||||
uses: actions/dependency-review-action@v3
|
uses: actions/dependency-review-action@v4
|
||||||
|
18
.github/workflows/e2e-applitools.yml
vendored
18
.github/workflows/e2e-applitools.yml
vendored
@@ -21,24 +21,24 @@ env:
|
|||||||
jobs:
|
jobs:
|
||||||
e2e-applitools:
|
e2e-applitools:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
container:
|
||||||
matrix:
|
image: cypress/browsers:node-20.11.0-chrome-121.0.6167.85-1-ff-120.0-edge-121.0.2277.83-1
|
||||||
node-version: [18.x]
|
options: --user 1001
|
||||||
steps:
|
steps:
|
||||||
- if: ${{ ! env.USE_APPLI }}
|
- if: ${{ ! env.USE_APPLI }}
|
||||||
name: Warn if not using Applitools
|
name: Warn if not using Applitools
|
||||||
run: |
|
run: |
|
||||||
echo "::error,title=Not using Applitols::APPLITOOLS_API_KEY is empty, disabling Applitools for this run."
|
echo "::error,title=Not using Applitools::APPLITOOLS_API_KEY is empty, disabling Applitools for this run."
|
||||||
|
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- uses: pnpm/action-setup@v2
|
- uses: pnpm/action-setup@v4
|
||||||
# uses version from "packageManager" field in package.json
|
# uses version from "packageManager" field in package.json
|
||||||
|
|
||||||
- name: Setup Node.js ${{ matrix.node-version }}
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v3
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: ${{ matrix.node-version }}
|
node-version-file: '.node-version'
|
||||||
|
|
||||||
- if: ${{ env.USE_APPLI }}
|
- if: ${{ env.USE_APPLI }}
|
||||||
name: Notify applitools of new batch
|
name: Notify applitools of new batch
|
||||||
|
118
.github/workflows/e2e.yml
vendored
118
.github/workflows/e2e.yml
vendored
@@ -2,52 +2,142 @@ name: E2E
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
|
branches-ignore:
|
||||||
|
- 'gh-readonly-queue/**'
|
||||||
pull_request:
|
pull_request:
|
||||||
merge_group:
|
merge_group:
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
|
|
||||||
|
env:
|
||||||
|
# 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_name == 'push' && github.ref == 'refs/heads/develop') ||
|
||||||
|
github.event.before == '0000000000000000000000000000000000000000'
|
||||||
|
) && 'develop'
|
||||||
|
) ||
|
||||||
|
github.event.before
|
||||||
|
}}
|
||||||
|
shouldRunParallel: ${{ secrets.CYPRESS_RECORD_KEY != '' && !(github.event_name == 'push' && github.ref == 'refs/heads/develop') }}
|
||||||
jobs:
|
jobs:
|
||||||
|
cache:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container:
|
||||||
|
image: cypress/browsers:node-20.11.0-chrome-121.0.6167.85-1-ff-120.0-edge-121.0.2277.83-1
|
||||||
|
options: --user 1001
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: pnpm/action-setup@v4
|
||||||
|
- name: Setup Node.js
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version-file: '.node-version'
|
||||||
|
- name: Cache snapshots
|
||||||
|
id: cache-snapshot
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
save-always: true
|
||||||
|
path: ./cypress/snapshots
|
||||||
|
key: ${{ runner.os }}-snapshots-${{ env.targetHash }}
|
||||||
|
|
||||||
|
# If a snapshot for a given Hash is not found, we checkout that commit, run the tests and cache the snapshots.
|
||||||
|
- name: Switch to base branch
|
||||||
|
if: ${{ steps.cache-snapshot.outputs.cache-hit != 'true' }}
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
ref: ${{ env.targetHash }}
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
if: ${{ steps.cache-snapshot.outputs.cache-hit != 'true' }}
|
||||||
|
uses: cypress-io/github-action@v6
|
||||||
|
with:
|
||||||
|
# just perform install
|
||||||
|
runTests: false
|
||||||
|
|
||||||
|
- 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
|
||||||
|
container:
|
||||||
|
image: cypress/browsers:node-20.11.0-chrome-121.0.6167.85-1-ff-120.0-edge-121.0.2277.83-1
|
||||||
|
options: --user 1001
|
||||||
|
needs: cache
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
node-version: [18.x]
|
|
||||||
containers: [1, 2, 3, 4]
|
containers: [1, 2, 3, 4]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- uses: pnpm/action-setup@v2
|
- uses: pnpm/action-setup@v4
|
||||||
# uses version from "packageManager" field in package.json
|
# uses version from "packageManager" field in package.json
|
||||||
|
|
||||||
- name: Setup Node.js ${{ matrix.node-version }}
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v3
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: ${{ matrix.node-version }}
|
node-version-file: '.node-version'
|
||||||
|
|
||||||
|
# These cached snapshots are downloaded, providing the reference snapshots.
|
||||||
|
- name: Cache snapshots
|
||||||
|
id: cache-snapshot
|
||||||
|
uses: actions/cache/restore@v4
|
||||||
|
with:
|
||||||
|
path: ./cypress/snapshots
|
||||||
|
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.shouldRunParallel == 'true' || ( 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
|
||||||
# Disable recording if we don't have an API key
|
# Disable recording if we don't have an API key
|
||||||
# e.g. if this action was run from a fork
|
# e.g. if this action was run from a fork
|
||||||
record: ${{ secrets.CYPRESS_RECORD_KEY != '' }}
|
record: ${{ env.shouldRunParallel == 'true' }}
|
||||||
parallel: ${{ secrets.CYPRESS_RECORD_KEY != '' }}
|
parallel: ${{ env.shouldRunParallel == 'true' }}
|
||||||
env:
|
env:
|
||||||
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: ${{ env.shouldRunParallel == 'true' }}
|
||||||
|
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:
|
||||||
@@ -57,9 +147,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
|
||||||
- name: Upload Artifacts
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
if: ${{ failure() && steps.cypress.conclusion == 'failure' }}
|
|
||||||
with:
|
|
||||||
name: error-snapshots
|
|
||||||
path: cypress/snapshots/**/__diff_output__/*
|
|
||||||
|
6
.github/workflows/link-checker.yml
vendored
6
.github/workflows/link-checker.yml
vendored
@@ -26,17 +26,17 @@ jobs:
|
|||||||
# lychee only uses the GITHUB_TOKEN to avoid rate-limiting
|
# lychee only uses the GITHUB_TOKEN to avoid rate-limiting
|
||||||
contents: read
|
contents: read
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- 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 }}
|
||||||
restore-keys: cache-lychee-
|
restore-keys: cache-lychee-
|
||||||
|
|
||||||
- name: Link Checker
|
- name: Link Checker
|
||||||
uses: lycheeverse/lychee-action@v1.8.0
|
uses: lycheeverse/lychee-action@v1.9.3
|
||||||
with:
|
with:
|
||||||
args: >-
|
args: >-
|
||||||
--config .github/lychee.toml
|
--config .github/lychee.toml
|
||||||
|
25
.github/workflows/lint.yml
vendored
25
.github/workflows/lint.yml
vendored
@@ -16,20 +16,17 @@ permissions:
|
|||||||
jobs:
|
jobs:
|
||||||
lint:
|
lint:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
node-version: [18.x]
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- uses: pnpm/action-setup@v2
|
- uses: pnpm/action-setup@v4
|
||||||
# uses version from "packageManager" field in package.json
|
# uses version from "packageManager" field in package.json
|
||||||
|
|
||||||
- name: Setup Node.js ${{ matrix.node-version }}
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v3
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
cache: pnpm
|
cache: pnpm
|
||||||
node-version: ${{ matrix.node-version }}
|
node-version-file: '.node-version'
|
||||||
|
|
||||||
- name: Install Packages
|
- name: Install Packages
|
||||||
run: |
|
run: |
|
||||||
@@ -85,15 +82,3 @@ jobs:
|
|||||||
working-directory: ./packages/mermaid
|
working-directory: ./packages/mermaid
|
||||||
continue-on-error: ${{ github.event_name == 'push' }}
|
continue-on-error: ${{ github.event_name == 'push' }}
|
||||||
run: pnpm run docs:verify
|
run: pnpm run docs:verify
|
||||||
|
|
||||||
- name: Rebuild Docs
|
|
||||||
if: ${{ steps.verifyDocs.outcome == 'failure' && github.event_name == 'push' }}
|
|
||||||
working-directory: ./packages/mermaid
|
|
||||||
run: pnpm run docs:build
|
|
||||||
|
|
||||||
- name: Commit changes
|
|
||||||
uses: EndBug/add-and-commit@v9
|
|
||||||
if: ${{ steps.verifyDocs.outcome == 'failure' && github.event_name == 'push' }}
|
|
||||||
with:
|
|
||||||
message: 'Update docs'
|
|
||||||
add: 'docs/*'
|
|
||||||
|
@@ -1,23 +0,0 @@
|
|||||||
name: Validate PR Labeler Configuration
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
paths:
|
|
||||||
- .github/workflows/pr-labeler-config-validator.yml
|
|
||||||
- .github/workflows/pr-labeler.yml
|
|
||||||
- .github/pr-labeler.yml
|
|
||||||
pull_request:
|
|
||||||
paths:
|
|
||||||
- .github/workflows/pr-labeler-config-validator.yml
|
|
||||||
- .github/workflows/pr-labeler.yml
|
|
||||||
- .github/pr-labeler.yml
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
pr-labeler:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout Repository
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
- name: Validate Configuration
|
|
||||||
uses: Yash-Singh1/pr-labeler-config-validator@releases/v0.0.3
|
|
||||||
with:
|
|
||||||
configuration-path: .github/pr-labeler.yml
|
|
22
.github/workflows/pr-labeler.yml
vendored
22
.github/workflows/pr-labeler.yml
vendored
@@ -1,13 +1,31 @@
|
|||||||
name: Apply labels to PR
|
name: Apply labels to PR
|
||||||
on:
|
on:
|
||||||
pull_request_target:
|
pull_request_target:
|
||||||
types: [opened]
|
# required for pr-labeler to support PRs from forks
|
||||||
|
# ===================== ⛔ ☢️ 🚫 ⚠️ Warning ⚠️ 🚫 ☢️ ⛔ =======================
|
||||||
|
# Be very careful what you put in this GitHub Action workflow file to avoid
|
||||||
|
# malicious PRs from getting access to the Mermaid-js repo.
|
||||||
|
#
|
||||||
|
# Please read the following first before reviewing/merging:
|
||||||
|
# - https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_target
|
||||||
|
# - https://securitylab.github.com/research/github-actions-preventing-pwn-requests/
|
||||||
|
types: [opened, reopened, synchronize]
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
pr-labeler:
|
pr-labeler:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: read # read permission is required to read config file
|
||||||
|
pull-requests: write # write permission is required to label PRs
|
||||||
steps:
|
steps:
|
||||||
- name: Label PR
|
- name: Label PR
|
||||||
uses: TimonVS/pr-labeler-action@v4
|
uses: release-drafter/release-drafter@v6
|
||||||
|
with:
|
||||||
|
config-name: pr-labeler.yml
|
||||||
|
disable-autolabeler: false
|
||||||
|
disable-releaser: true
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
14
.github/workflows/publish-docs.yml
vendored
14
.github/workflows/publish-docs.yml
vendored
@@ -23,27 +23,27 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- uses: pnpm/action-setup@v2
|
- uses: pnpm/action-setup@v4
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v3
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
cache: pnpm
|
cache: pnpm
|
||||||
node-version: 18
|
node-version-file: '.node-version'
|
||||||
|
|
||||||
- name: Install Packages
|
- name: Install Packages
|
||||||
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
|
||||||
|
13
.github/workflows/release-draft.yml
vendored
13
.github/workflows/release-draft.yml
vendored
@@ -3,13 +3,22 @@ name: Draft Release
|
|||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- develop
|
- master
|
||||||
|
- release/**
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
draft-release:
|
draft-release:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: write # write permission is required to create a GitHub release
|
||||||
|
pull-requests: read # required to read PR titles/labels
|
||||||
steps:
|
steps:
|
||||||
- name: Draft Release
|
- name: Draft Release
|
||||||
uses: toolmantim/release-drafter@v5
|
uses: release-drafter/release-drafter@v6
|
||||||
|
with:
|
||||||
|
disable-autolabeler: true
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
@@ -9,17 +9,17 @@ jobs:
|
|||||||
publish-preview:
|
publish-preview:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- uses: pnpm/action-setup@v2
|
- uses: pnpm/action-setup@v4
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v3
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
cache: pnpm
|
cache: pnpm
|
||||||
node-version: 18.x
|
node-version-file: '.node-version'
|
||||||
|
|
||||||
- name: Install Packages
|
- name: Install Packages
|
||||||
run: |
|
run: |
|
||||||
|
10
.github/workflows/release-publish.yml
vendored
10
.github/workflows/release-publish.yml
vendored
@@ -8,17 +8,17 @@ jobs:
|
|||||||
publish:
|
publish:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- uses: fregante/setup-git-user@v2
|
- uses: fregante/setup-git-user@v2
|
||||||
|
|
||||||
- uses: pnpm/action-setup@v2
|
- uses: pnpm/action-setup@v4
|
||||||
# uses version from "packageManager" field in package.json
|
# uses version from "packageManager" field in package.json
|
||||||
|
|
||||||
- name: Setup Node.js v18
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v3
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
cache: pnpm
|
cache: pnpm
|
||||||
node-version: 18.x
|
node-version-file: '.node-version'
|
||||||
|
|
||||||
- name: Install Packages
|
- name: Install Packages
|
||||||
run: |
|
run: |
|
||||||
|
15
.github/workflows/test.yml
vendored
15
.github/workflows/test.yml
vendored
@@ -8,20 +8,17 @@ permissions:
|
|||||||
jobs:
|
jobs:
|
||||||
unit-test:
|
unit-test:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
node-version: [18.x]
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- uses: pnpm/action-setup@v2
|
- uses: pnpm/action-setup@v4
|
||||||
# uses version from "packageManager" field in package.json
|
# uses version from "packageManager" field in package.json
|
||||||
|
|
||||||
- name: Setup Node.js ${{ matrix.node-version }}
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v3
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
cache: pnpm
|
cache: pnpm
|
||||||
node-version: ${{ matrix.node-version }}
|
node-version-file: '.node-version'
|
||||||
|
|
||||||
- name: Install Packages
|
- name: Install Packages
|
||||||
run: |
|
run: |
|
||||||
@@ -42,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:
|
||||||
|
11
.github/workflows/update-browserlist.yml
vendored
11
.github/workflows/update-browserlist.yml
vendored
@@ -8,11 +8,18 @@ jobs:
|
|||||||
update-browser-list:
|
update-browser-list:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- run: npx browserslist@latest --update-db
|
- uses: pnpm/action-setup@v4
|
||||||
|
- run: npx update-browserslist-db@latest
|
||||||
- name: Commit changes
|
- name: Commit changes
|
||||||
uses: EndBug/add-and-commit@v9
|
uses: EndBug/add-and-commit@v9
|
||||||
with:
|
with:
|
||||||
author_name: ${{ github.actor }}
|
author_name: ${{ github.actor }}
|
||||||
author_email: ${{ github.actor }}@users.noreply.github.com
|
author_email: ${{ github.actor }}@users.noreply.github.com
|
||||||
message: 'chore: update browsers list'
|
message: 'chore: update browsers list'
|
||||||
|
push: false
|
||||||
|
- name: Create Pull Request
|
||||||
|
uses: peter-evans/create-pull-request@v6
|
||||||
|
with:
|
||||||
|
branch: update-browserslist
|
||||||
|
title: Update Browserslist
|
||||||
|
8
.gitignore
vendored
8
.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,3 +46,9 @@ stats/
|
|||||||
|
|
||||||
demos/dev/**
|
demos/dev/**
|
||||||
!/demos/dev/example.html
|
!/demos/dev/example.html
|
||||||
|
!/demos/dev/reload.js
|
||||||
|
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
|
||||||
|
@@ -6,6 +6,6 @@ export default {
|
|||||||
// https://prettier.io/docs/en/cli.html#--cache
|
// https://prettier.io/docs/en/cli.html#--cache
|
||||||
'prettier --write',
|
'prettier --write',
|
||||||
],
|
],
|
||||||
'cSpell.json': ['ts-node-esm scripts/fixCSpell.ts'],
|
'.cspell/*.txt': ['tsx scripts/fixCSpell.ts'],
|
||||||
'**/*.jison': ['pnpm -w run lint:jison'],
|
'**/*.jison': ['pnpm -w run lint:jison'],
|
||||||
};
|
};
|
||||||
|
1
.node-version
Normal file
1
.node-version
Normal file
@@ -0,0 +1 @@
|
|||||||
|
20.12.2
|
2
.npmrc
2
.npmrc
@@ -1,2 +1,4 @@
|
|||||||
|
registry=https://registry.npmjs.org
|
||||||
auto-install-peers=true
|
auto-install-peers=true
|
||||||
strict-peer-dependencies=false
|
strict-peer-dependencies=false
|
||||||
|
package-import-method=clone-or-copy
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
dist
|
dist
|
||||||
cypress/platform/xss3.html
|
cypress/platform/xss3.html
|
||||||
.cache
|
.cache
|
||||||
|
.pnpm-store
|
||||||
coverage
|
coverage
|
||||||
# Autogenerated by PNPM
|
# Autogenerated by PNPM
|
||||||
pnpm-lock.yaml
|
pnpm-lock.yaml
|
||||||
@@ -10,3 +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
|
||||||
|
demos/dev/**
|
||||||
|
!/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: {
|
||||||
@@ -117,16 +76,18 @@ export const getBuildConfig = ({ minify, core, watch, entryName }: BuildOptions)
|
|||||||
output,
|
output,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
define: {
|
||||||
|
'import.meta.vitest': 'undefined',
|
||||||
|
},
|
||||||
resolve: {
|
resolve: {
|
||||||
extensions: [],
|
extensions: [],
|
||||||
},
|
},
|
||||||
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,
|
||||||
@@ -146,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,109 +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',
|
|
||||||
] 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.
|
||||||
@@ -120,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, {
|
return {
|
||||||
filename: idAsUrl.pathname,
|
code: idAsUrl.searchParams.get('only-defaults')
|
||||||
// only allow JSON types in our YAML doc (will probably be default in YAML 1.3)
|
? getDefaults(jsonSchema)
|
||||||
// e.g. `true` will be parsed a boolean `true`, `True` will be parsed as string `"True"`.
|
: getSchema(jsonSchema),
|
||||||
schema: JSON_SCHEMA,
|
map: null, // no source map
|
||||||
}) as JSONSchemaType<MermaidConfig>;
|
};
|
||||||
return {
|
|
||||||
code: `export default ${JSON.stringify(generateDefaults(jsonSchema), undefined, 2)};`,
|
|
||||||
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();
|
||||||
|
2
.vscode/extensions.json
vendored
2
.vscode/extensions.json
vendored
@@ -2,7 +2,7 @@
|
|||||||
"recommendations": [
|
"recommendations": [
|
||||||
"dbaeumer.vscode-eslint",
|
"dbaeumer.vscode-eslint",
|
||||||
"esbenp.prettier-vscode",
|
"esbenp.prettier-vscode",
|
||||||
"zixuanchen.vitest-explorer",
|
"vitest.explorer",
|
||||||
"luniclynx.bison"
|
"luniclynx.bison"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
3
.vscode/launch.json
vendored
3
.vscode/launch.json
vendored
@@ -18,7 +18,8 @@
|
|||||||
"type": "node",
|
"type": "node",
|
||||||
"request": "launch",
|
"request": "launch",
|
||||||
"args": ["scripts/docs.cli.mts"],
|
"args": ["scripts/docs.cli.mts"],
|
||||||
"runtimeArgs": ["--loader", "ts-node/esm"],
|
// we'll need to change this to --import in Node.JS v20.6.0 and up
|
||||||
|
"runtimeArgs": ["--loader", "tsx/esm"],
|
||||||
"cwd": "${workspaceRoot}/packages/mermaid",
|
"cwd": "${workspaceRoot}/packages/mermaid",
|
||||||
"skipFiles": ["<node_internals>/**", "**/node_modules/**"],
|
"skipFiles": ["<node_internals>/**", "**/node_modules/**"],
|
||||||
"smartStep": true,
|
"smartStep": true,
|
||||||
|
@@ -1,78 +0,0 @@
|
|||||||
# Contributing
|
|
||||||
|
|
||||||
Please read in detail about how to contribute documentation and code on the [Mermaid documentation site.](https://mermaid-js.github.io/mermaid/#/development)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
# Mermaid contribution cheat-sheet
|
|
||||||
|
|
||||||
## Requirements
|
|
||||||
|
|
||||||
- [volta](https://volta.sh/) to manage node versions.
|
|
||||||
- [Node.js](https://nodejs.org/en/). `volta install node`
|
|
||||||
- [pnpm](https://pnpm.io/) package manager. `volta install pnpm`
|
|
||||||
|
|
||||||
## Development Installation
|
|
||||||
|
|
||||||
If you don't have direct access to push to mermaid repositories, make a fork first. Then clone. Or clone directly from mermaid-js:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git clone git@github.com:mermaid-js/mermaid.git
|
|
||||||
cd mermaid
|
|
||||||
```
|
|
||||||
|
|
||||||
Install required packages:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# npx is required for first install as volta support for pnpm is not added yet.
|
|
||||||
npx pnpm install
|
|
||||||
pnpm test # run unit tests
|
|
||||||
pnpm dev # starts a dev server
|
|
||||||
```
|
|
||||||
|
|
||||||
Open <http://localhost:9000> in your browser after starting the dev server.
|
|
||||||
You can also duplicate the `example.html` file in `demos/dev`, rename it and add your own mermaid code to it.
|
|
||||||
That will be served at <http://localhost:9000/dev/your-file-name.html>.
|
|
||||||
|
|
||||||
### Docker
|
|
||||||
|
|
||||||
If you are using docker and docker-compose, you have self-documented `run` bash script, which is a convenient alias for docker-compose commands:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
./run install # npx pnpm install
|
|
||||||
./run test # pnpm test
|
|
||||||
```
|
|
||||||
|
|
||||||
## Testing
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Run unit test
|
|
||||||
pnpm test
|
|
||||||
# Run unit test in watch mode
|
|
||||||
pnpm test:watch
|
|
||||||
# Run E2E test
|
|
||||||
pnpm e2e
|
|
||||||
# Debug E2E tests
|
|
||||||
pnpm dev
|
|
||||||
pnpm cypress:open # in another terminal
|
|
||||||
```
|
|
||||||
|
|
||||||
## Branch name format:
|
|
||||||
|
|
||||||
```text
|
|
||||||
[feature | bug | chore | docs]/[issue number]_[short description using dashes ('-') or underscores ('_') instead of spaces]
|
|
||||||
```
|
|
||||||
|
|
||||||
eg: `feature/2945_state-diagram-new-arrow-florbs`, `bug/1123_fix_random_ugly_red_text`
|
|
||||||
|
|
||||||
## Documentation
|
|
||||||
|
|
||||||
Documentation is necessary for all non bugfix/refactoring changes.
|
|
||||||
|
|
||||||
Only make changes to files that are in [`/packages/mermaid/src/docs`](packages/mermaid/src/docs)
|
|
||||||
|
|
||||||
**_DO NOT CHANGE FILES IN `/docs` MANUALLY_**
|
|
||||||
|
|
||||||
The `/docs` folder will be rebuilt and committed as part of a pre-commit hook.
|
|
||||||
|
|
||||||
[Join our slack community if you want closer contact!](https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE)
|
|
1
CONTRIBUTING.md
Symbolic link
1
CONTRIBUTING.md
Symbolic link
@@ -0,0 +1 @@
|
|||||||
|
./packages/mermaid/src/docs/community/contributing.md
|
2
Dockerfile
Normal file
2
Dockerfile
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
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 -
|
7
FUNDING.json
Normal file
7
FUNDING.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"drips": {
|
||||||
|
"ethereum": {
|
||||||
|
"ownedBy": "0x0831DDFe60d009d9448CC976157b539089aB821E"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
57
README.md
57
README.md
@@ -15,7 +15,7 @@ Generate diagrams from markdown-like text.
|
|||||||
<a href="https://mermaid.live/"><b>Live Editor!</b></a>
|
<a href="https://mermaid.live/"><b>Live Editor!</b></a>
|
||||||
</p>
|
</p>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://mermaid.js.org">📖 Documentation</a> | <a href="https://mermaid.js.org/intro/">🚀 Getting Started</a> | <a href="https://www.jsdelivr.com/package/npm/mermaid">🌐 CDN</a> | <a href="https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE" title="Slack invite">🙌 Join Us</a>
|
<a href="https://mermaid.js.org">📖 Documentation</a> | <a href="https://mermaid.js.org/intro/">🚀 Getting Started</a> | <a href="https://www.jsdelivr.com/package/npm/mermaid">🌐 CDN</a> | <a href="https://discord.gg/AgrbSrBer3" title="Discord invite">🙌 Join Us</a>
|
||||||
</p>
|
</p>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="./README.zh-CN.md">简体中文</a>
|
<a href="./README.zh-CN.md">简体中文</a>
|
||||||
@@ -33,8 +33,9 @@ Try Live Editor previews of future releases: <a href="https://develop.git.mermai
|
|||||||
[](https://app.codecov.io/github/mermaid-js/mermaid/tree/develop)
|
[](https://app.codecov.io/github/mermaid-js/mermaid/tree/develop)
|
||||||
[](https://www.jsdelivr.com/package/npm/mermaid)
|
[](https://www.jsdelivr.com/package/npm/mermaid)
|
||||||
[](https://www.npmjs.com/package/mermaid)
|
[](https://www.npmjs.com/package/mermaid)
|
||||||
[](https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE)
|
[](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="" />
|
||||||
|
|
||||||
@@ -42,7 +43,23 @@ Try Live Editor previews of future releases: <a href="https://develop.git.mermai
|
|||||||
|
|
||||||
**Thanks to all involved, people committing pull requests, people answering questions! 🙏**
|
**Thanks to all involved, people committing pull requests, people answering questions! 🙏**
|
||||||
|
|
||||||
<a href="https://mermaid-js.github.io/mermaid/landing/"><img src="https://github.com/mermaid-js/mermaid/blob/master/docs/intro/img/book-banner-post-release.jpg" alt="Explore Mermaid.js in depth, with real-world examples, tips & tricks from the creator... The first official book on Mermaid is available for purchase. Check it out!"></a>
|
<a href="https://mermaid.js.org/landing/"><img src="https://github.com/mermaid-js/mermaid/blob/master/docs/intro/img/book-banner-post-release.jpg" alt="Explore Mermaid.js in depth, with real-world examples, tips & tricks from the creator... The first official book on Mermaid is available for purchase. Check it out!"></a>
|
||||||
|
|
||||||
|
## Table of content
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Expand contents</summary>
|
||||||
|
|
||||||
|
- [About](#about)
|
||||||
|
- [Examples](#examples)
|
||||||
|
- [Release](#release)
|
||||||
|
- [Related projects](#related-projects)
|
||||||
|
- [Contributors](#contributors---)
|
||||||
|
- [Security and safe diagrams](#security-and-safe-diagrams)
|
||||||
|
- [Reporting vulnerabilities](#reporting-vulnerabilities)
|
||||||
|
- [Appreciation](#appreciation)
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
## About
|
## About
|
||||||
|
|
||||||
@@ -58,12 +75,12 @@ Mermaid addresses this problem by enabling users to create easily modifiable dia
|
|||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
Mermaid allows even non-programmers to easily create detailed diagrams through the [Mermaid Live Editor](https://mermaid.live/).<br/>
|
Mermaid allows even non-programmers to easily create detailed diagrams through the [Mermaid Live Editor](https://mermaid.live/).<br/>
|
||||||
For video tutorials, visit our [Tutorials](./docs/config/Tutorials.md) page.
|
For video tutorials, visit our [Tutorials](https://mermaid.js.org/ecosystem/tutorials.html) page.
|
||||||
Use Mermaid with your favorite applications, check out the list of [Integrations and Usages of Mermaid](./docs/ecosystem/integrations-community.md).
|
Use Mermaid with your favorite applications, check out the list of [Integrations and Usages of Mermaid](https://mermaid.js.org/ecosystem/integrations-community.html).
|
||||||
|
|
||||||
You can also use Mermaid within [GitHub](https://github.blog/2022-02-14-include-diagrams-markdown-files-mermaid/) as well many of your other favorite applications—check out the list of [Integrations and Usages of Mermaid](./docs/ecosystem/integrations-community.md).
|
You can also use Mermaid within [GitHub](https://github.blog/2022-02-14-include-diagrams-markdown-files-mermaid/) as well many of your other favorite applications—check out the list of [Integrations and Usages of Mermaid](https://mermaid.js.org/ecosystem/integrations-community.html).
|
||||||
|
|
||||||
For a more detailed introduction to Mermaid and some of its more basic uses, look to the [Beginner's Guide](./docs/intro/getting-started.md), [Usage](./docs/config/usage.md) and [Tutorials](./docs/config/Tutorials.md).
|
For a more detailed introduction to Mermaid and some of its more basic uses, look to the [Beginner's Guide](https://mermaid.js.org/intro/getting-started.html), [Usage](https://mermaid.js.org/config/usage.html) and [Tutorials](https://mermaid.js.org/ecosystem/tutorials.html).
|
||||||
|
|
||||||
In our release process we rely heavily on visual regression tests using [applitools](https://applitools.com/). Applitools is a great service which has been easy to use and integrate with our tests.
|
In our release process we rely heavily on visual regression tests using [applitools](https://applitools.com/). Applitools is a great service which has been easy to use and integrate with our tests.
|
||||||
|
|
||||||
@@ -75,11 +92,11 @@ In our release process we rely heavily on visual regression tests using [applito
|
|||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
**The following are some examples of the diagrams, charts and graphs that can be made using Mermaid. Click here to jump into the [text syntax](https://mermaid-js.github.io/mermaid/#/n00b-syntaxReference).**
|
**The following are some examples of the diagrams, charts and graphs that can be made using Mermaid. Click here to jump into the [text syntax](https://mermaid.js.org/intro/syntax-reference.html).**
|
||||||
|
|
||||||
<!-- <Flowchart> -->
|
<!-- <Flowchart> -->
|
||||||
|
|
||||||
### Flowchart [<a href="https://mermaid-js.github.io/mermaid/#/flowchart">docs</a> - <a href="https://mermaid.live/edit#pako:eNpNkMtqwzAQRX9FzKqFJK7t1km8KDQP6KJQSLOLvZhIY1tgS0GWmgbb_165IaFaiXvOFTPqgGtBkEJR6zOv0Fj2scsU8-ft8I5G5Gw6fe339GN7tnrYaafE45WvRsLW3Ya4bKVWwzVe_xU-FfVsc9hR62rLwvw_2591z7Y3FuUwgYZMg1L4ObrRzMBW1FAGqb8KKtCLGWRq8Ko7CbS0FdJqA2mBdUsTQGf110VxSK1xdJM2EkuDzd2qNQrypQ7s5TQuXcrW-ie5VoUsx9yZ2seVtac2DYIRz0ppK3eccd0ErRTjD1XfyyRIomSBUUzJPMaXOBb8GC4XRfQcFmL-FEYIwzD8AggvcHE">live editor</a>]
|
### Flowchart [<a href="https://mermaid.js.org/syntax/flowchart.html">docs</a> - <a href="https://mermaid.live/edit#pako:eNpNkMtqwzAQRX9FzKqFJK7t1km8KDQP6KJQSLOLvZhIY1tgS0GWmgbb_165IaFaiXvOFTPqgGtBkEJR6zOv0Fj2scsU8-ft8I5G5Gw6fe339GN7tnrYaafE45WvRsLW3Ya4bKVWwzVe_xU-FfVsc9hR62rLwvw_2591z7Y3FuUwgYZMg1L4ObrRzMBW1FAGqb8KKtCLGWRq8Ko7CbS0FdJqA2mBdUsTQGf110VxSK1xdJM2EkuDzd2qNQrypQ7s5TQuXcrW-ie5VoUsx9yZ2seVtac2DYIRz0ppK3eccd0ErRTjD1XfyyRIomSBUUzJPMaXOBb8GC4XRfQcFmL-FEYIwzD8AggvcHE">live editor</a>]
|
||||||
|
|
||||||
```
|
```
|
||||||
flowchart LR
|
flowchart LR
|
||||||
@@ -99,12 +116,12 @@ C -->|One| D[Result 1]
|
|||||||
C -->|Two| E[Result 2]
|
C -->|Two| E[Result 2]
|
||||||
```
|
```
|
||||||
|
|
||||||
### Sequence diagram [<a href="https://mermaid-js.github.io/mermaid/#/sequenceDiagram">docs</a> - <a href="https://mermaid.live/edit#pako:eNo9kMluwjAQhl_F-AykQMuSA1WrbuLQQ3v1ZbAnsVXHkzrjVhHi3etQwKfRv4w-z0FqMihL2eF3wqDxyUEdoVHhwTuNk-12RzaU4g29JzHMY2HpV0BE0VO6V8ETtdkGz1Zb1F8qiPyG5LX84mrLAmpwoWNh-5a0pWCiAxUwGBXeiVHEU4oq8V_6AHYUwAu2lLLTjVQ4bc1rT2yleI0IfJG320faZ9ABbk-Jz3hZnFxBduR9L2oiM5Jj2WBswJn8-cMArSRbbFDJMo8GK0ielVThmKOpNcD4bBxTlGUFvsOxhMT02QctS44JL6HzAS-iJzCYOwfJfTscunYd542aQuXqQU_RZ9kyt11ZFIM9rR3btJ9qaorOGQuR7c9mWSznyzXMF7hcLeBusTB6P9usq_ntrDKrm9kc5PF4_AMJE56Z">live editor</a>]
|
### Sequence diagram [<a href="https://mermaid.js.org/syntax/sequenceDiagram.html">docs</a> - <a href="https://mermaid.live/edit#pako:eNo9kMluwjAQhl_F-AykQMuSA1WrbuLQQ3v1ZbAnsVXHkzrjVhHi3etQwKfRv4w-z0FqMihL2eF3wqDxyUEdoVHhwTuNk-12RzaU4g29JzHMY2HpV0BE0VO6V8ETtdkGz1Zb1F8qiPyG5LX84mrLAmpwoWNh-5a0pWCiAxUwGBXeiVHEU4oq8V_6AHYUwAu2lLLTjVQ4bc1rT2yleI0IfJG320faZ9ABbk-Jz3hZnFxBduR9L2oiM5Jj2WBswJn8-cMArSRbbFDJMo8GK0ielVThmKOpNcD4bBxTlGUFvsOxhMT02QctS44JL6HzAS-iJzCYOwfJfTscunYd542aQuXqQU_RZ9kyt11ZFIM9rR3btJ9qaorOGQuR7c9mWSznyzXMF7hcLeBusTB6P9usq_ntrDKrm9kc5PF4_AMJE56Z">live editor</a>]
|
||||||
|
|
||||||
```
|
```
|
||||||
sequenceDiagram
|
sequenceDiagram
|
||||||
Alice->>John: Hello John, how are you?
|
Alice->>John: Hello John, how are you?
|
||||||
loop Healthcheck
|
loop HealthCheck
|
||||||
John->>John: Fight against hypochondria
|
John->>John: Fight against hypochondria
|
||||||
end
|
end
|
||||||
Note right of John: Rational thoughts!
|
Note right of John: Rational thoughts!
|
||||||
@@ -116,7 +133,7 @@ Bob-->>John: Jolly good!
|
|||||||
```mermaid
|
```mermaid
|
||||||
sequenceDiagram
|
sequenceDiagram
|
||||||
Alice->>John: Hello John, how are you?
|
Alice->>John: Hello John, how are you?
|
||||||
loop Healthcheck
|
loop HealthCheck
|
||||||
John->>John: Fight against hypochondria
|
John->>John: Fight against hypochondria
|
||||||
end
|
end
|
||||||
Note right of John: Rational thoughts!
|
Note right of John: Rational thoughts!
|
||||||
@@ -125,7 +142,7 @@ John->>Bob: How about you?
|
|||||||
Bob-->>John: Jolly good!
|
Bob-->>John: Jolly good!
|
||||||
```
|
```
|
||||||
|
|
||||||
### Gantt chart [<a href="https://mermaid-js.github.io/mermaid/#/gantt">docs</a> - <a href="https://mermaid.live/edit#pako:eNp90cGOgyAQBuBXIZxtFbG29bbZ3fsmvXKZylhJEAyOTZrGd1_sto3xsHMBhu-HBO689hp5xS_giJQbsCbjHTv9jcp9-q63SKhZpb3DhMXSOIiE5ZkoNpnYZGXynh6U-4jBK7JnVfBYJo9QvgjtEya1cj8QwFq0TMz4lZqxTBg0hOF5m1jifI2Lf7Bc490CyxUu1rhc4GLGPOEdhg6Mjq92V44xxanFDhWv4lRjA6MlxZWbIh17DYTf2pAPvGrADphwGMmfbq7mFYURX-jLwCVA91bWg8YYunO69Y8vMgPFI2vvGnOZ-2Owsd0S9UOVpvP29mKoHc_b2nfpYHQLgdrrsUzLvDxALrHcS9hJqeuzOB6avBCN3mciBz5N0y_wxZ0J">live editor</a>]
|
### Gantt chart [<a href="https://mermaid.js.org/syntax/gantt.html">docs</a> - <a href="https://mermaid.live/edit#pako:eNp90cGOgyAQBuBXIZxtFbG29bbZ3fsmvXKZylhJEAyOTZrGd1_sto3xsHMBhu-HBO689hp5xS_giJQbsCbjHTv9jcp9-q63SKhZpb3DhMXSOIiE5ZkoNpnYZGXynh6U-4jBK7JnVfBYJo9QvgjtEya1cj8QwFq0TMz4lZqxTBg0hOF5m1jifI2Lf7Bc490CyxUu1rhc4GLGPOEdhg6Mjq92V44xxanFDhWv4lRjA6MlxZWbIh17DYTf2pAPvGrADphwGMmfbq7mFYURX-jLwCVA91bWg8YYunO69Y8vMgPFI2vvGnOZ-2Owsd0S9UOVpvP29mKoHc_b2nfpYHQLgdrrsUzLvDxALrHcS9hJqeuzOB6avBCN3mciBz5N0y_wxZ0J">live editor</a>]
|
||||||
|
|
||||||
```
|
```
|
||||||
gantt
|
gantt
|
||||||
@@ -149,7 +166,7 @@ gantt
|
|||||||
Parallel 4 : des6, after des4, 1d
|
Parallel 4 : des6, after des4, 1d
|
||||||
```
|
```
|
||||||
|
|
||||||
### Class diagram [<a href="https://mermaid-js.github.io/mermaid/#/classDiagram">docs</a> - <a href="https://mermaid.live/edit#pako:eNpdkTFPwzAQhf-K5QlQ2zQJJG1UBaGWDYmBgYEwXO1LYuTEwXYqlZL_jt02asXm--690zvfgTLFkWaUSTBmI6DS0BTt2lfzkKx-p1PytEO9f1FtdaQkI2ulZNGuVqK1qEtgmOfk7BitSzKdOhg59XuNGgk0RDxed-_IOr6uf8cZ6UhTZ8bvHqS5ub1mr9svZPbjk6DEBlu7AQuXyBkx4gcvDk9cUMJq0XT_YaW0kNK5j-ufAoRzcihaQvLcoN4Jv50vvVxw_xrnD3RCG9QNCO4-8OgpqK1dpoJm7smxhF7agp6kfcfB4jMXVmmalW4tnFDorXrbt4xmVvc4is53GKFUwNF5DtTuO3-sShjrJjLVlqLyvNfS4drazmRB4NuzSti6386YagIjeA3a1rtlEiRRsoAoxiSN4SGOOduGy0UZ3YclT-dhBHQYhj8dc6_I">live editor</a>]
|
### Class diagram [<a href="https://mermaid.js.org/syntax/classDiagram.html">docs</a> - <a href="https://mermaid.live/edit#pako:eNpdkTFPwzAQhf-K5QlQ2zQJJG1UBaGWDYmBgYEwXO1LYuTEwXYqlZL_jt02asXm--690zvfgTLFkWaUSTBmI6DS0BTt2lfzkKx-p1PytEO9f1FtdaQkI2ulZNGuVqK1qEtgmOfk7BitSzKdOhg59XuNGgk0RDxed-_IOr6uf8cZ6UhTZ8bvHqS5ub1mr9svZPbjk6DEBlu7AQuXyBkx4gcvDk9cUMJq0XT_YaW0kNK5j-ufAoRzcihaQvLcoN4Jv50vvVxw_xrnD3RCG9QNCO4-8OgpqK1dpoJm7smxhF7agp6kfcfB4jMXVmmalW4tnFDorXrbt4xmVvc4is53GKFUwNF5DtTuO3-sShjrJjLVlqLyvNfS4drazmRB4NuzSti6386YagIjeA3a1rtlEiRRsoAoxiSN4SGOOduGy0UZ3YclT-dhBHQYhj8dc6_I">live editor</a>]
|
||||||
|
|
||||||
```
|
```
|
||||||
classDiagram
|
classDiagram
|
||||||
@@ -191,7 +208,7 @@ class Class10 {
|
|||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### State diagram [<a href="https://mermaid-js.github.io/mermaid/#/stateDiagram">docs</a> - <a href="https://mermaid.live/edit#pako:eNpdkEFvgzAMhf8K8nEqpYSNthx22Xbcqcexg0sCiZQQlDhIFeK_L8A6TfXp6fOz9ewJGssFVOAJSbwr7ByadGR1n8T6evpO0vQ1uZDSekOrXGFsPqJPO6q-2-imH8f_0TeHXm50lfelsAMjnEHFY6xpMdRAUhhRQxUlFy0GTTXU_RytYeAx-AdXZB1ULWovdoCB7OXWN1CRC-Ju-r3uz6UtchGHJqDbsPygU57iysb2reoWHpyOWBINvsqypb3vFMlw3TfWZF5xiY7keC6zkpUnZIUojwW-FAVvrvn51LLnvOXHQ84Q5nn-AVtLcwk">live editor</a>]
|
### State diagram [<a href="https://mermaid.js.org/syntax/stateDiagram.html">docs</a> - <a href="https://mermaid.live/edit#pako:eNpdkEFvgzAMhf8K8nEqpYSNthx22Xbcqcexg0sCiZQQlDhIFeK_L8A6TfXp6fOz9ewJGssFVOAJSbwr7ByadGR1n8T6evpO0vQ1uZDSekOrXGFsPqJPO6q-2-imH8f_0TeHXm50lfelsAMjnEHFY6xpMdRAUhhRQxUlFy0GTTXU_RytYeAx-AdXZB1ULWovdoCB7OXWN1CRC-Ju-r3uz6UtchGHJqDbsPygU57iysb2reoWHpyOWBINvsqypb3vFMlw3TfWZF5xiY7keC6zkpUnZIUojwW-FAVvrvn51LLnvOXHQ84Q5nn-AVtLcwk">live editor</a>]
|
||||||
|
|
||||||
```
|
```
|
||||||
stateDiagram-v2
|
stateDiagram-v2
|
||||||
@@ -213,7 +230,7 @@ Moving --> Crash
|
|||||||
Crash --> [*]
|
Crash --> [*]
|
||||||
```
|
```
|
||||||
|
|
||||||
### Pie chart [<a href="https://mermaid-js.github.io/mermaid/#/pie">docs</a> - <a href="https://mermaid.live/edit#pako:eNo9jsFugzAMhl8F-VzBgEEh13Uv0F1zcYkTIpEEBadShXj3BU3dzf_n77e8wxQUgYDVkvQSbsFsEgpRtEN_5i_kvzx05XiC-xvUHVzAUXRoVe7v0heFBJ7JkQSRR0Ua08ISpD-ymlaFTN_KcoggNC4bXQATh5-Xn0BwTPSWbhZNRPdvLQEV5dIO_FrPZ43dOJ-cgtfWnDzFJeOZed1EVZ3r0lie06Ocgqs2q2aMPD_HvuqbfsCmpf7aYte2anrU46Cbz1qr60fdIBzH8QvW9lkl">live editor</a>]
|
### Pie chart [<a href="https://mermaid.js.org/syntax/pie.html">docs</a> - <a href="https://mermaid.live/edit#pako:eNo9jsFugzAMhl8F-VzBgEEh13Uv0F1zcYkTIpEEBadShXj3BU3dzf_n77e8wxQUgYDVkvQSbsFsEgpRtEN_5i_kvzx05XiC-xvUHVzAUXRoVe7v0heFBJ7JkQSRR0Ua08ISpD-ymlaFTN_KcoggNC4bXQATh5-Xn0BwTPSWbhZNRPdvLQEV5dIO_FrPZ43dOJ-cgtfWnDzFJeOZed1EVZ3r0lie06Ocgqs2q2aMPD_HvuqbfsCmpf7aYte2anrU46Cbz1qr60fdIBzH8QvW9lkl">live editor</a>]
|
||||||
|
|
||||||
```
|
```
|
||||||
pie
|
pie
|
||||||
@@ -231,7 +248,7 @@ pie
|
|||||||
|
|
||||||
### Git graph [experimental - <a href="https://mermaid.live/edit#pako:eNqNkMFugzAMhl8F-VyVAR1tOW_aA-zKxSSGRCMJCk6lCvHuNZPKZdM0n-zf3_8r8QIqaIIGMqnB8kfEybQ--y4VnLP8-9RF9Mpkmm40hmlnDKmvkPiH_kfS7nFo_VN0FAf6XwocQGgxa_nGsm1bYEOOWmik1dRjGrmF1q-Cpkkj07u2HCI0PY4zHQATh8-7V9BwTPSE3iwOEd1OjQE1iWkBvk_bzQY7s0Sq4Hs7bHqKo8iGeZqbPN_WR7mpSd1RHpvPVhuMbG7XOq_L-oJlRfW5wteq0qorrpe-PBW9Pr8UJcK6rg-BLYPQ">live editor</a>]
|
### Git graph [experimental - <a href="https://mermaid.live/edit#pako:eNqNkMFugzAMhl8F-VyVAR1tOW_aA-zKxSSGRCMJCk6lCvHuNZPKZdM0n-zf3_8r8QIqaIIGMqnB8kfEybQ--y4VnLP8-9RF9Mpkmm40hmlnDKmvkPiH_kfS7nFo_VN0FAf6XwocQGgxa_nGsm1bYEOOWmik1dRjGrmF1q-Cpkkj07u2HCI0PY4zHQATh8-7V9BwTPSE3iwOEd1OjQE1iWkBvk_bzQY7s0Sq4Hs7bHqKo8iGeZqbPN_WR7mpSd1RHpvPVhuMbG7XOq_L-oJlRfW5wteq0qorrpe-PBW9Pr8UJcK6rg-BLYPQ">live editor</a>]
|
||||||
|
|
||||||
### Bar chart (using gantt chart) [<a href="https://mermaid-js.github.io/mermaid/#/gantt">docs</a> - <a href="https://mermaid.live/edit#pako:eNptkU1vhCAQhv8KIenNugiI4rkf6bmXpvEyFVxJFDYyNt1u9r8X63Z7WQ9m5pknLzieaBeMpQ3dg0dsPUkPOhwteXZIXmJcbCT3xMAxkuh8Z8kIEclyMIB209fqKcwTICFvG4IvFy_oLrZ-g9F26ILfQgvNFN94VaRXQ1iWqpumZBcu1J8p1E1TXDx59eQNr5LyEqjJn6hv5QnGNlxevZJmdLLpy5xJSzut45biYCfb0iaVxvawjNjS1p-TCguG16PvaIPzYjO67e3BwX6GiTY9jPFKH43DMF_hGMDY1J4oHg-_f8hFTJFd8L3br3yZx4QHxENsdrt1nO8dDstH3oVpF50ZYMbhU6ud4qoGLqyqBJRCmO6j0HXPZdGbihUc6Pmc0QP49xD-b5X69ZQv2gjO81IwzWqhC1lKrjJ6pA3nVS7SMiVjrKirWlYp5fs3osgrWeo00lorLWvOzz8JVbXm">live editor</a>]
|
### Bar chart (using gantt chart) [<a href="https://mermaid.js.org/syntax/gantt.html">docs</a> - <a href="https://mermaid.live/edit#pako:eNptkU1vhCAQhv8KIenNugiI4rkf6bmXpvEyFVxJFDYyNt1u9r8X63Z7WQ9m5pknLzieaBeMpQ3dg0dsPUkPOhwteXZIXmJcbCT3xMAxkuh8Z8kIEclyMIB209fqKcwTICFvG4IvFy_oLrZ-g9F26ILfQgvNFN94VaRXQ1iWqpumZBcu1J8p1E1TXDx59eQNr5LyEqjJn6hv5QnGNlxevZJmdLLpy5xJSzut45biYCfb0iaVxvawjNjS1p-TCguG16PvaIPzYjO67e3BwX6GiTY9jPFKH43DMF_hGMDY1J4oHg-_f8hFTJFd8L3br3yZx4QHxENsdrt1nO8dDstH3oVpF50ZYMbhU6ud4qoGLqyqBJRCmO6j0HXPZdGbihUc6Pmc0QP49xD-b5X69ZQv2gjO81IwzWqhC1lKrjJ6pA3nVS7SMiVjrKirWlYp5fs3osgrWeo00lorLWvOzz8JVbXm">live editor</a>]
|
||||||
|
|
||||||
```
|
```
|
||||||
gantt
|
gantt
|
||||||
@@ -269,7 +286,7 @@ gantt
|
|||||||
5 : 0, 5
|
5 : 0, 5
|
||||||
```
|
```
|
||||||
|
|
||||||
### User Journey diagram [<a href="https://mermaid-js.github.io/mermaid/#/user-journey">docs</a> - <a href="https://mermaid.live/edit#pako:eNplkMFuwjAQRH9l5TMiTVIC-FqqnjhxzWWJN4khsSN7XRSh_HsdKBVt97R6Mzsj-yoqq0hIAXCywRkaSwNxWHNHsB_hYt1ZmwYUfiueKtbWwIcFtjf5zgH2eCZgQgkrCXt64GgMg2fUzkvIn5Xd_V5COtMFvCH_62ht_5yk7MU8sn61HDTfxD8VYiF6cj1qFd94nWkpuKWYKWRcFdUYOi5FaaZoDYNCpnel2Toha-w8LQQGtofRVEKyC_Qw7TQ2DvsfV2dRUTy6Ch6H-UMb7TlGVtbUupl5cF3ELfPgZZLM8rLR3IbjsrJ94rVq0XH7uS2SIis2mOVUrHNc5bmqjul2U2evaa3WL2mGYpqmL2BGiho">live editor</a>]
|
### User Journey diagram [<a href="https://mermaid.js.org/syntax/userJourney.html">docs</a> - <a href="https://mermaid.live/edit#pako:eNplkMFuwjAQRH9l5TMiTVIC-FqqnjhxzWWJN4khsSN7XRSh_HsdKBVt97R6Mzsj-yoqq0hIAXCywRkaSwNxWHNHsB_hYt1ZmwYUfiueKtbWwIcFtjf5zgH2eCZgQgkrCXt64GgMg2fUzkvIn5Xd_V5COtMFvCH_62ht_5yk7MU8sn61HDTfxD8VYiF6cj1qFd94nWkpuKWYKWRcFdUYOi5FaaZoDYNCpnel2Toha-w8LQQGtofRVEKyC_Qw7TQ2DvsfV2dRUTy6Ch6H-UMb7TlGVtbUupl5cF3ELfPgZZLM8rLR3IbjsrJ94rVq0XH7uS2SIis2mOVUrHNc5bmqjul2U2evaa3WL2mGYpqmL2BGiho">live editor</a>]
|
||||||
|
|
||||||
```
|
```
|
||||||
journey
|
journey
|
||||||
@@ -295,7 +312,7 @@ gantt
|
|||||||
Sit down: 3: Me
|
Sit down: 3: Me
|
||||||
```
|
```
|
||||||
|
|
||||||
### C4 diagram [<a href="https://mermaid-js.github.io/mermaid/#/c4c">docs</a>]
|
### C4 diagram [<a href="https://mermaid.js.org/syntax/c4.html">docs</a>]
|
||||||
|
|
||||||
```
|
```
|
||||||
C4Context
|
C4Context
|
||||||
@@ -389,7 +406,7 @@ The above command generates files into the `dist` folder and publishes them to <
|
|||||||
|
|
||||||
Mermaid is a growing community and is always accepting new contributors. There's a lot of different ways to help out and we're always looking for extra hands! Look at [this issue](https://github.com/mermaid-js/mermaid/issues/866) if you want to know where to start helping out.
|
Mermaid is a growing community and is always accepting new contributors. There's a lot of different ways to help out and we're always looking for extra hands! Look at [this issue](https://github.com/mermaid-js/mermaid/issues/866) if you want to know where to start helping out.
|
||||||
|
|
||||||
Detailed information about how to contribute can be found in the [contribution guide](CONTRIBUTING.md)
|
Detailed information about how to contribute can be found in the [contribution guide](https://mermaid.js.org/community/contributing.html)
|
||||||
|
|
||||||
## Security and safe diagrams
|
## Security and safe diagrams
|
||||||
|
|
||||||
|
@@ -15,7 +15,7 @@ Mermaid
|
|||||||
<a href="https://mermaid.live/"><b>实时编辑器!</b></a>
|
<a href="https://mermaid.live/"><b>实时编辑器!</b></a>
|
||||||
</p>
|
</p>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://mermaid.js.org">📖 文档</a> | <a href="https://mermaid.js.org/intro/">🚀 入门</a> | <a href="https://www.jsdelivr.com/package/npm/mermaid">🌐 CDN</a> | <a href="https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE" title="Slack invite">🙌 加入我们</a>
|
<a href="https://mermaid.js.org">📖 文档</a> | <a href="https://mermaid.js.org/intro/">🚀 入门</a> | <a href="https://www.jsdelivr.com/package/npm/mermaid">🌐 CDN</a> | <a href="https://discord.gg/AgrbSrBer3" title="Discord invite">🙌 加入我们</a>
|
||||||
</p>
|
</p>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="./README.md">English</a>
|
<a href="./README.md">English</a>
|
||||||
@@ -34,7 +34,7 @@ Mermaid
|
|||||||
[](https://app.codecov.io/github/mermaid-js/mermaid/tree/develop)
|
[](https://app.codecov.io/github/mermaid-js/mermaid/tree/develop)
|
||||||
[](https://www.jsdelivr.com/package/npm/mermaid)
|
[](https://www.jsdelivr.com/package/npm/mermaid)
|
||||||
[](https://www.npmjs.com/package/mermaid)
|
[](https://www.npmjs.com/package/mermaid)
|
||||||
[](https://join.slack.com/t/mermaid-talk/shared_invite/enQtNzc4NDIyNzk4OTAyLWVhYjQxOTI2OTg4YmE1ZmJkY2Y4MTU3ODliYmIwOTY3NDJlYjA0YjIyZTdkMDMyZTUwOGI0NjEzYmEwODcwOTE)
|
[](https://discord.gg/AgrbSrBer3)
|
||||||
[](https://twitter.com/mermaidjs_)
|
[](https://twitter.com/mermaidjs_)
|
||||||
|
|
||||||
<img src="./img/header.png" alt="" />
|
<img src="./img/header.png" alt="" />
|
||||||
@@ -43,7 +43,7 @@ Mermaid
|
|||||||
|
|
||||||
**感谢所有参与进来提交 PR,解答疑问的人们! 🙏**
|
**感谢所有参与进来提交 PR,解答疑问的人们! 🙏**
|
||||||
|
|
||||||
<a href="https://mermaid-js.github.io/mermaid/landing/"><img src="https://github.com/mermaid-js/mermaid/blob/master/docs/intro/img/book-banner-post-release.jpg" alt="Explore Mermaid.js in depth, with real-world examples, tips & tricks from the creator... The first official book on Mermaid is available for purchase. Check it out!"></a>
|
<a href="https://mermaid.js.org/landing/"><img src="https://github.com/mermaid-js/mermaid/blob/master/docs/intro/img/book-banner-post-release.jpg" alt="Explore Mermaid.js in depth, with real-world examples, tips & tricks from the creator... The first official book on Mermaid is available for purchase. Check it out!"></a>
|
||||||
|
|
||||||
## 关于 Mermaid
|
## 关于 Mermaid
|
||||||
|
|
||||||
@@ -57,20 +57,20 @@ Mermaid 是一个基于 Javascript 的图表绘制工具,通过解析类 Markd
|
|||||||
Mermaid 通过允许用户创建便于修改的图表来解决这一难题,它也可以作为生产脚本(或其他代码)的一部分。<br/>
|
Mermaid 通过允许用户创建便于修改的图表来解决这一难题,它也可以作为生产脚本(或其他代码)的一部分。<br/>
|
||||||
<br/>
|
<br/>
|
||||||
Mermaid 甚至能让非程序员也能通过 [Mermaid Live Editor](https://mermaid.live/) 轻松创建详细的图表。<br/>
|
Mermaid 甚至能让非程序员也能通过 [Mermaid Live Editor](https://mermaid.live/) 轻松创建详细的图表。<br/>
|
||||||
你可以访问 [教程](./docs/config/Tutorials.md) 来查看 Live Editor 的视频教程,也可以查看 [Mermaid 的集成和使用](./docs/ecosystem/integrations-community.md) 这个清单来检查你的文档工具是否已经集成了 Mermaid 支持。
|
你可以访问 [教程](https://mermaid.js.org/ecosystem/tutorials.html) 来查看 Live Editor 的视频教程,也可以查看 [Mermaid 的集成和使用](https://mermaid.js.org/ecosystem/integrations-community.html) 这个清单来检查你的文档工具是否已经集成了 Mermaid 支持。
|
||||||
|
|
||||||
如果想要查看关于 Mermaid 更详细的介绍及基础使用方式,可以查看 [入门指引](./docs/intro/getting-started.md), [用法](./docs/config/usage.md) 和 [教程](./docs/config/Tutorials.md).
|
如果想要查看关于 Mermaid 更详细的介绍及基础使用方式,可以查看 [入门指引](https://mermaid.js.org/intro/getting-started.html), [用法](https://mermaid.js.org/config/usage.html) 和 [教程](https://mermaid.js.org/ecosystem/tutorials.html).
|
||||||
|
|
||||||
<!-- </Main description> -->
|
<!-- </Main description> -->
|
||||||
|
|
||||||
## 示例
|
## 示例
|
||||||
|
|
||||||
**下面是一些可以使用 Mermaid 创建的图表示例。点击 [语法](https://mermaid-js.github.io/mermaid/#/n00b-syntaxReference) 查看详情。**
|
**下面是一些可以使用 Mermaid 创建的图表示例。点击 [语法](https://mermaid.js.org/intro/syntax-reference.html) 查看详情。**
|
||||||
|
|
||||||
<table>
|
<table>
|
||||||
<!-- <Flowchart> -->
|
<!-- <Flowchart> -->
|
||||||
|
|
||||||
### 流程图 [<a href="https://mermaid-js.github.io/mermaid/#/flowchart">文档</a> - <a href="https://mermaid.live/edit#base64:eyJjb2RlIjoiZ3JhcGggVERcbiAgICBBW0hhcmRdIC0tPnxUZXh0fCBCKFJvdW5kKVxuICAgIEIgLS0-IEN7RGVjaXNpb259XG4gICAgQyAtLT58T25lfCBEW1Jlc3VsdCAxXVxuICAgIEMgLS0-fFR3b3wgRVtSZXN1bHQgMl0iLCJtZXJtYWlkIjp7InRoZW1lIjoiZGVmYXVsdCJ9fQ">live editor</a>]
|
### 流程图 [<a href="https://mermaid.js.org/syntax/flowchart.html">文档</a> - <a href="https://mermaid.live/edit#base64:eyJjb2RlIjoiZ3JhcGggVERcbiAgICBBW0hhcmRdIC0tPnxUZXh0fCBCKFJvdW5kKVxuICAgIEIgLS0-IEN7RGVjaXNpb259XG4gICAgQyAtLT58T25lfCBEW1Jlc3VsdCAxXVxuICAgIEMgLS0-fFR3b3wgRVtSZXN1bHQgMl0iLCJtZXJtYWlkIjp7InRoZW1lIjoiZGVmYXVsdCJ9fQ">live editor</a>]
|
||||||
|
|
||||||
```
|
```
|
||||||
flowchart LR
|
flowchart LR
|
||||||
@@ -88,12 +88,12 @@ C -->|One| D[Result 1]
|
|||||||
C -->|Two| E[Result 2]
|
C -->|Two| E[Result 2]
|
||||||
```
|
```
|
||||||
|
|
||||||
### 时序图 [<a href="https://mermaid-js.github.io/mermaid/#/sequenceDiagram">文档</a> - <a href="https://mermaid.live/edit#base64:eyJjb2RlIjoic2VxdWVuY2VEaWFncmFtXG5BbGljZS0-PkpvaG46IEhlbGxvIEpvaG4sIGhvdyBhcmUgeW91P1xubG9vcCBIZWFsdGhjaGVja1xuICAgIEpvaG4tPj5Kb2huOiBGaWdodCBhZ2FpbnN0IGh5cG9jaG9uZHJpYVxuZW5kXG5Ob3RlIHJpZ2h0IG9mIEpvaG46IFJhdGlvbmFsIHRob3VnaHRzIVxuSm9obi0tPj5BbGljZTogR3JlYXQhXG5Kb2huLT4-Qm9iOiBIb3cgYWJvdXQgeW91P1xuQm9iLS0-PkpvaG46IEpvbGx5IGdvb2QhIiwibWVybWFpZCI6eyJ0aGVtZSI6ImRlZmF1bHQifX0">live editor</a>]
|
### 时序图 [<a href="https://mermaid.js.org/syntax/sequenceDiagram.html">文档</a> - <a href="https://mermaid.live/edit#base64:eyJjb2RlIjoic2VxdWVuY2VEaWFncmFtXG5BbGljZS0-PkpvaG46IEhlbGxvIEpvaG4sIGhvdyBhcmUgeW91P1xubG9vcCBIZWFsdGhjaGVja1xuICAgIEpvaG4tPj5Kb2huOiBGaWdodCBhZ2FpbnN0IGh5cG9jaG9uZHJpYVxuZW5kXG5Ob3RlIHJpZ2h0IG9mIEpvaG46IFJhdGlvbmFsIHRob3VnaHRzIVxuSm9obi0tPj5BbGljZTogR3JlYXQhXG5Kb2huLT4-Qm9iOiBIb3cgYWJvdXQgeW91P1xuQm9iLS0-PkpvaG46IEpvbGx5IGdvb2QhIiwibWVybWFpZCI6eyJ0aGVtZSI6ImRlZmF1bHQifX0">live editor</a>]
|
||||||
|
|
||||||
```
|
```
|
||||||
sequenceDiagram
|
sequenceDiagram
|
||||||
Alice->>John: Hello John, how are you?
|
Alice->>John: Hello John, how are you?
|
||||||
loop Healthcheck
|
loop HealthCheck
|
||||||
John->>John: Fight against hypochondria
|
John->>John: Fight against hypochondria
|
||||||
end
|
end
|
||||||
Note right of John: Rational thoughts!
|
Note right of John: Rational thoughts!
|
||||||
@@ -105,7 +105,7 @@ Bob-->>John: Jolly good!
|
|||||||
```mermaid
|
```mermaid
|
||||||
sequenceDiagram
|
sequenceDiagram
|
||||||
Alice->>John: Hello John, how are you?
|
Alice->>John: Hello John, how are you?
|
||||||
loop Healthcheck
|
loop HealthCheck
|
||||||
John->>John: Fight against hypochondria
|
John->>John: Fight against hypochondria
|
||||||
end
|
end
|
||||||
Note right of John: Rational thoughts!
|
Note right of John: Rational thoughts!
|
||||||
@@ -114,7 +114,7 @@ John->>Bob: How about you?
|
|||||||
Bob-->>John: Jolly good!
|
Bob-->>John: Jolly good!
|
||||||
```
|
```
|
||||||
|
|
||||||
### 甘特图 [<a href="https://mermaid-js.github.io/mermaid/#/gantt">文档</a> - <a href="https://mermaid.live/edit#base64:eyJjb2RlIjoiZ2FudHRcbnNlY3Rpb24gU2VjdGlvblxuQ29tcGxldGVkIDpkb25lLCAgICBkZXMxLCAyMDE0LTAxLTA2LDIwMTQtMDEtMDhcbkFjdGl2ZSAgICAgICAgOmFjdGl2ZSwgIGRlczIsIDIwMTQtMDEtMDcsIDNkXG5QYXJhbGxlbCAxICAgOiAgICAgICAgIGRlczMsIGFmdGVyIGRlczEsIDFkXG5QYXJhbGxlbCAyICAgOiAgICAgICAgIGRlczQsIGFmdGVyIGRlczEsIDFkXG5QYXJhbGxlbCAzICAgOiAgICAgICAgIGRlczUsIGFmdGVyIGRlczMsIDFkXG5QYXJhbGxlbCA0ICAgOiAgICAgICAgIGRlczYsIGFmdGVyIGRlczQsIDFkIiwibWVybWFpZCI6eyJ0aGVtZSI6ImRlZmF1bHQifX0">live editor</a>]
|
### 甘特图 [<a href="https://mermaid.js.org/syntax/gantt.html">文档</a> - <a href="https://mermaid.live/edit#base64:eyJjb2RlIjoiZ2FudHRcbnNlY3Rpb24gU2VjdGlvblxuQ29tcGxldGVkIDpkb25lLCAgICBkZXMxLCAyMDE0LTAxLTA2LDIwMTQtMDEtMDhcbkFjdGl2ZSAgICAgICAgOmFjdGl2ZSwgIGRlczIsIDIwMTQtMDEtMDcsIDNkXG5QYXJhbGxlbCAxICAgOiAgICAgICAgIGRlczMsIGFmdGVyIGRlczEsIDFkXG5QYXJhbGxlbCAyICAgOiAgICAgICAgIGRlczQsIGFmdGVyIGRlczEsIDFkXG5QYXJhbGxlbCAzICAgOiAgICAgICAgIGRlczUsIGFmdGVyIGRlczMsIDFkXG5QYXJhbGxlbCA0ICAgOiAgICAgICAgIGRlczYsIGFmdGVyIGRlczQsIDFkIiwibWVybWFpZCI6eyJ0aGVtZSI6ImRlZmF1bHQifX0">live editor</a>]
|
||||||
|
|
||||||
```
|
```
|
||||||
gantt
|
gantt
|
||||||
@@ -138,7 +138,7 @@ gantt
|
|||||||
Parallel 4 : des6, after des4, 1d
|
Parallel 4 : des6, after des4, 1d
|
||||||
```
|
```
|
||||||
|
|
||||||
### 类图 [<a href="https://mermaid-js.github.io/mermaid/#/classDiagram">文档</a> - <a href="https://mermaid.live/edit#base64:eyJjb2RlIjoiY2xhc3NEaWFncmFtXG5DbGFzczAxIDx8LS0gQXZlcnlMb25nQ2xhc3MgOiBDb29sXG48PGludGVyZmFjZT4-IENsYXNzMDFcbkNsYXNzMDkgLS0-IEMyIDogV2hlcmUgYW0gaT9cbkNsYXNzMDkgLS0qIEMzXG5DbGFzczA5IC0tfD4gQ2xhc3MwN1xuQ2xhc3MwNyA6IGVxdWFscygpXG5DbGFzczA3IDogT2JqZWN0W10gZWxlbWVudERhdGFcbkNsYXNzMDEgOiBzaXplKClcbkNsYXNzMDEgOiBpbnQgY2hpbXBcbkNsYXNzMDEgOiBpbnQgZ29yaWxsYVxuY2xhc3MgQ2xhc3MxMCB7XG4gID4-c2VydmljZT4-XG4gIGludCBpZFxuICBzaXplKClcbn0iLCJtZXJtYWlkIjp7InRoZW1lIjoiZGVmYXVsdCJ9fQ">live editor</a>]
|
### 类图 [<a href="https://mermaid.js.org/syntax/classDiagram.html">文档</a> - <a href="https://mermaid.live/edit#base64:eyJjb2RlIjoiY2xhc3NEaWFncmFtXG5DbGFzczAxIDx8LS0gQXZlcnlMb25nQ2xhc3MgOiBDb29sXG48PGludGVyZmFjZT4-IENsYXNzMDFcbkNsYXNzMDkgLS0-IEMyIDogV2hlcmUgYW0gaT9cbkNsYXNzMDkgLS0qIEMzXG5DbGFzczA5IC0tfD4gQ2xhc3MwN1xuQ2xhc3MwNyA6IGVxdWFscygpXG5DbGFzczA3IDogT2JqZWN0W10gZWxlbWVudERhdGFcbkNsYXNzMDEgOiBzaXplKClcbkNsYXNzMDEgOiBpbnQgY2hpbXBcbkNsYXNzMDEgOiBpbnQgZ29yaWxsYVxuY2xhc3MgQ2xhc3MxMCB7XG4gID4-c2VydmljZT4-XG4gIGludCBpZFxuICBzaXplKClcbn0iLCJtZXJtYWlkIjp7InRoZW1lIjoiZGVmYXVsdCJ9fQ">live editor</a>]
|
||||||
|
|
||||||
```
|
```
|
||||||
classDiagram
|
classDiagram
|
||||||
@@ -178,7 +178,7 @@ class Class10 {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### 状态图 [[<a href="https://mermaid-js.github.io/mermaid/#/stateDiagram">docs</a> - <a href="https://mermaid.live/edit#pako:eNpdkLsOwjAMRX-l8ojahTEDCzB26kgYrMYtkfJAqVMJVf13QiIKqqfr44d8vUDvFYGAiZHponEMaJv5KF2V4na4V01zqjrWxhSUZYapuEetn7UbCy16P_5HzwGnR6FZfpdCDZaCRa3SWcunQQI_yJIEkaSiAaNhCdKtqRUj--7lehAcItUQn-pnBMSAZtroVWn2YYOU07b4z29Y37gJVYk">live editor</a>]
|
### 状态图 [<a href="https://mermaid.js.org/syntax/stateDiagram.html">docs</a> - <a href="https://mermaid.live/edit#pako:eNpdkLsOwjAMRX-l8ojahTEDCzB26kgYrMYtkfJAqVMJVf13QiIKqqfr44d8vUDvFYGAiZHponEMaJv5KF2V4na4V01zqjrWxhSUZYapuEetn7UbCy16P_5HzwGnR6FZfpdCDZaCRa3SWcunQQI_yJIEkaSiAaNhCdKtqRUj--7lehAcItUQn-pnBMSAZtroVWn2YYOU07b4z29Y37gJVYk">live editor</a>]
|
||||||
|
|
||||||
```
|
```
|
||||||
stateDiagram-v2
|
stateDiagram-v2
|
||||||
@@ -200,7 +200,7 @@ Moving --> Crash
|
|||||||
Crash --> [*]
|
Crash --> [*]
|
||||||
```
|
```
|
||||||
|
|
||||||
### 饼图 [<a href="https://mermaid-js.github.io/mermaid/#/pie">文档</a> - <a href="https://mermaid.live/edit#base64:eyJjb2RlIjoicGllXG5cIkRvZ3NcIiA6IDQyLjk2XG5cIkNhdHNcIiA6IDUwLjA1XG5cIlJhdHNcIiA6IDEwLjAxIiwibWVybWFpZCI6eyJ0aGVtZSI6ImRlZmF1bHQifX0">live editor</a>]
|
### 饼图 [<a href="https://mermaid.js.org/syntax/pie.html">文档</a> - <a href="https://mermaid.live/edit#base64:eyJjb2RlIjoicGllXG5cIkRvZ3NcIiA6IDQyLjk2XG5cIkNhdHNcIiA6IDUwLjA1XG5cIlJhdHNcIiA6IDEwLjAxIiwibWVybWFpZCI6eyJ0aGVtZSI6ImRlZmF1bHQifX0">live editor</a>]
|
||||||
|
|
||||||
```
|
```
|
||||||
pie
|
pie
|
||||||
@@ -218,7 +218,7 @@ pie
|
|||||||
|
|
||||||
### Git 图 [实验特性 - <a href="https://mermaid.live/edit#base64:eyJjb2RlIjoiZ2l0R3JhcGg6XG5vcHRpb25zXG57XG4gICAgXCJub2RlU3BhY2luZ1wiOiAxNTAsXG4gICAgXCJub2RlUmFkaXVzXCI6IDEwXG59XG5lbmRcbmNvbW1pdFxuYnJhbmNoIG5ld2JyYW5jaFxuY2hlY2tvdXQgbmV3YnJhbmNoXG5jb21taXRcbmNvbW1pdFxuY2hlY2tvdXQgbWFzdGVyXG5jb21taXRcbmNvbW1pdFxubWVyZ2UgbmV3YnJhbmNoXG4iLCJtZXJtYWlkIjp7InRoZW1lIjoiZGVmYXVsdCJ9fQ">live editor</a>]
|
### Git 图 [实验特性 - <a href="https://mermaid.live/edit#base64:eyJjb2RlIjoiZ2l0R3JhcGg6XG5vcHRpb25zXG57XG4gICAgXCJub2RlU3BhY2luZ1wiOiAxNTAsXG4gICAgXCJub2RlUmFkaXVzXCI6IDEwXG59XG5lbmRcbmNvbW1pdFxuYnJhbmNoIG5ld2JyYW5jaFxuY2hlY2tvdXQgbmV3YnJhbmNoXG5jb21taXRcbmNvbW1pdFxuY2hlY2tvdXQgbWFzdGVyXG5jb21taXRcbmNvbW1pdFxubWVyZ2UgbmV3YnJhbmNoXG4iLCJtZXJtYWlkIjp7InRoZW1lIjoiZGVmYXVsdCJ9fQ">live editor</a>]
|
||||||
|
|
||||||
### 用户体验旅程图 [<a href="https://mermaid-js.github.io/mermaid/#/user-journey">文档</a> - <a href="https://mermaid.live/edit#pako:eNpljzEPgkAMhf9K05nFGJdbJXFiYmVpuKIncDVHL4QQ_ruHaILaqXnf63vpjLVYRoMAd4nB81R5SKNOO4ZiglFC6_wVLL3JwLU68XARUHnhTQcoqGVQJgMnAwV_5GSMj0HJhcHAcU_y7d7AYVUzOJP-ddyk3ydZGf0n66uldPqCPxWYYc-hJ2fTj_OqVqg3Tplo0mq5odhphZVfkpWiSjn5Go2GyBnGhyXl3NE1UI-moW7g5QkSoF5m">live editor</a>]
|
### 用户体验旅程图 [<a href="https://mermaid.js.org/syntax/userJourney.html">文档</a> - <a href="https://mermaid.live/edit#pako:eNpljzEPgkAMhf9K05nFGJdbJXFiYmVpuKIncDVHL4QQ_ruHaILaqXnf63vpjLVYRoMAd4nB81R5SKNOO4ZiglFC6_wVLL3JwLU68XARUHnhTQcoqGVQJgMnAwV_5GSMj0HJhcHAcU_y7d7AYVUzOJP-ddyk3ydZGf0n66uldPqCPxWYYc-hJ2fTj_OqVqg3Tplo0mq5odhphZVfkpWiSjn5Go2GyBnGhyXl3NE1UI-moW7g5QkSoF5m">live editor</a>]
|
||||||
|
|
||||||
```
|
```
|
||||||
journey
|
journey
|
||||||
@@ -244,7 +244,7 @@ pie
|
|||||||
Sit down: 3: Me
|
Sit down: 3: Me
|
||||||
```
|
```
|
||||||
|
|
||||||
### C4 图 [<a href="https://mermaid-js.github.io/mermaid/#/c4c">文档</a>]
|
### C4 图 [<a href="https://mermaid.js.org/syntax/c4.html">文档</a>]
|
||||||
|
|
||||||
```
|
```
|
||||||
C4Context
|
C4Context
|
||||||
@@ -338,7 +338,7 @@ npm publish
|
|||||||
|
|
||||||
Mermaid 是一个不断发展中的社区,并且还在接收新的贡献者。有很多不同的方式可以参与进来,而且我们还在寻找额外的帮助。如果你想知道如何开始贡献,请查看 [这个 issue](https://github.com/mermaid-js/mermaid/issues/866)。
|
Mermaid 是一个不断发展中的社区,并且还在接收新的贡献者。有很多不同的方式可以参与进来,而且我们还在寻找额外的帮助。如果你想知道如何开始贡献,请查看 [这个 issue](https://github.com/mermaid-js/mermaid/issues/866)。
|
||||||
|
|
||||||
关于如何贡献的详细信息可以在 [贡献指南](CONTRIBUTING.md) 中找到。
|
关于如何贡献的详细信息可以在 [贡献指南](https://mermaid.js.org/community/contributing.html) 中找到。
|
||||||
|
|
||||||
## 安全
|
## 安全
|
||||||
|
|
||||||
|
@@ -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,
|
|
||||||
};
|
|
@@ -1,19 +0,0 @@
|
|||||||
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
||||||
const { defineConfig } = require('cypress');
|
|
||||||
|
|
||||||
module.exports = defineConfig({
|
|
||||||
testConcurrency: 1,
|
|
||||||
browser: [
|
|
||||||
// Add browsers with different viewports
|
|
||||||
// { width: 800, height: 600, name: 'chrome' },
|
|
||||||
// { width: 700, height: 500, name: 'firefox' },
|
|
||||||
// { width: 1600, height: 1200, name: 'ie11' },
|
|
||||||
// { width: 1024, height: 768, name: 'edgechromium' },
|
|
||||||
// { width: 800, height: 600, name: 'safari' },
|
|
||||||
// // Add mobile emulation devices in Portrait mode
|
|
||||||
// { deviceName: 'iPhone X', screenOrientation: 'portrait' },
|
|
||||||
// { deviceName: 'Pixel 2', screenOrientation: 'portrait' },
|
|
||||||
],
|
|
||||||
// set batch name to the configuration
|
|
||||||
// batchName: `Mermaid ${process.env.APPLI_BRANCH ?? "'no APPLI_BRANCH set'"}`,
|
|
||||||
});
|
|
206
cSpell.json
206
cSpell.json
@@ -1,206 +0,0 @@
|
|||||||
{
|
|
||||||
"version": "0.2",
|
|
||||||
"language": "en",
|
|
||||||
"words": [
|
|
||||||
"acyclicer",
|
|
||||||
"adamiecki",
|
|
||||||
"alois",
|
|
||||||
"aloisklink",
|
|
||||||
"antiscript",
|
|
||||||
"antlr",
|
|
||||||
"appli",
|
|
||||||
"applitools",
|
|
||||||
"asciidoctor",
|
|
||||||
"ashish",
|
|
||||||
"ashishjain",
|
|
||||||
"astah",
|
|
||||||
"bbox",
|
|
||||||
"bilkent",
|
|
||||||
"bisheng",
|
|
||||||
"blrs",
|
|
||||||
"braintree",
|
|
||||||
"brkt",
|
|
||||||
"brolin",
|
|
||||||
"brotli",
|
|
||||||
"catmull",
|
|
||||||
"città",
|
|
||||||
"classdef",
|
|
||||||
"codedoc",
|
|
||||||
"colour",
|
|
||||||
"commitlint",
|
|
||||||
"cpettitt",
|
|
||||||
"customizability",
|
|
||||||
"cuzon",
|
|
||||||
"cytoscape",
|
|
||||||
"dagre",
|
|
||||||
"deepdwn",
|
|
||||||
"descr",
|
|
||||||
"docsify",
|
|
||||||
"docsy",
|
|
||||||
"doku",
|
|
||||||
"dompurify",
|
|
||||||
"dont",
|
|
||||||
"doublecircle",
|
|
||||||
"edgechromium",
|
|
||||||
"elems",
|
|
||||||
"elkjs",
|
|
||||||
"elle",
|
|
||||||
"faber",
|
|
||||||
"flatmap",
|
|
||||||
"foswiki",
|
|
||||||
"frontmatter",
|
|
||||||
"ftplugin",
|
|
||||||
"gantt",
|
|
||||||
"gitea",
|
|
||||||
"gitgraph",
|
|
||||||
"globby",
|
|
||||||
"graphlib",
|
|
||||||
"graphviz",
|
|
||||||
"grav",
|
|
||||||
"greywolf",
|
|
||||||
"gzipped",
|
|
||||||
"huynh",
|
|
||||||
"huynhicode",
|
|
||||||
"inkdrop",
|
|
||||||
"jaoude",
|
|
||||||
"jgreywolf",
|
|
||||||
"jison",
|
|
||||||
"jiti",
|
|
||||||
"kaufmann",
|
|
||||||
"khroma",
|
|
||||||
"klemm",
|
|
||||||
"klink",
|
|
||||||
"knsv",
|
|
||||||
"knut",
|
|
||||||
"knutsveidqvist",
|
|
||||||
"laganeckas",
|
|
||||||
"linetype",
|
|
||||||
"lintstagedrc",
|
|
||||||
"logmsg",
|
|
||||||
"lucida",
|
|
||||||
"markdownish",
|
|
||||||
"matthieu",
|
|
||||||
"matthieumorel",
|
|
||||||
"mdast",
|
|
||||||
"mdbook",
|
|
||||||
"mermaidjs",
|
|
||||||
"mermerd",
|
|
||||||
"mindaugas",
|
|
||||||
"mindmap",
|
|
||||||
"mindmaps",
|
|
||||||
"mitigations",
|
|
||||||
"mkdocs",
|
|
||||||
"mmorel",
|
|
||||||
"mult",
|
|
||||||
"neurodiverse",
|
|
||||||
"nextra",
|
|
||||||
"nikolay",
|
|
||||||
"nirname",
|
|
||||||
"npmjs",
|
|
||||||
"orlandoni",
|
|
||||||
"pathe",
|
|
||||||
"pbrolin",
|
|
||||||
"phpbb",
|
|
||||||
"plantuml",
|
|
||||||
"playfair",
|
|
||||||
"pnpm",
|
|
||||||
"podlite",
|
|
||||||
"quence",
|
|
||||||
"radious",
|
|
||||||
"ranksep",
|
|
||||||
"rect",
|
|
||||||
"rects",
|
|
||||||
"reda",
|
|
||||||
"redmine",
|
|
||||||
"regexes",
|
|
||||||
"rehype",
|
|
||||||
"roledescription",
|
|
||||||
"rozhkov",
|
|
||||||
"sandboxed",
|
|
||||||
"sankey",
|
|
||||||
"setupgraphviewbox",
|
|
||||||
"shiki",
|
|
||||||
"sidharth",
|
|
||||||
"sidharthv",
|
|
||||||
"sphinxcontrib",
|
|
||||||
"startx",
|
|
||||||
"starty",
|
|
||||||
"statediagram",
|
|
||||||
"steph",
|
|
||||||
"stopx",
|
|
||||||
"stopy",
|
|
||||||
"stylis",
|
|
||||||
"subhash-halder",
|
|
||||||
"substate",
|
|
||||||
"sulais",
|
|
||||||
"sveidqvist",
|
|
||||||
"swimm",
|
|
||||||
"techn",
|
|
||||||
"teststr",
|
|
||||||
"textlength",
|
|
||||||
"treemap",
|
|
||||||
"ts-nocheck",
|
|
||||||
"tsdoc",
|
|
||||||
"tuleap",
|
|
||||||
"tylerlong",
|
|
||||||
"typora",
|
|
||||||
"ugge",
|
|
||||||
"unist",
|
|
||||||
"unocss",
|
|
||||||
"upvoting",
|
|
||||||
"valign",
|
|
||||||
"verdana",
|
|
||||||
"viewports",
|
|
||||||
"vinod",
|
|
||||||
"visio",
|
|
||||||
"vitepress",
|
|
||||||
"vueuse",
|
|
||||||
"xlink",
|
|
||||||
"xychart",
|
|
||||||
"yash",
|
|
||||||
"yokozuna",
|
|
||||||
"zenuml",
|
|
||||||
"zune"
|
|
||||||
],
|
|
||||||
"patterns": [
|
|
||||||
{ "name": "Markdown links", "pattern": "\\((.*)\\)", "description": "" },
|
|
||||||
{
|
|
||||||
"name": "Markdown code blocks",
|
|
||||||
"pattern": "/^(\\s*`{3,}).*[\\s\\S]*?^\\1/gmx",
|
|
||||||
"description": "Taken from the cSpell example at https://cspell.org/configuration/patterns/#verbose-regular-expressions"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Inline code blocks",
|
|
||||||
"pattern": "\\`([^\\`\\r\\n]+?)\\`",
|
|
||||||
"description": "https://stackoverflow.com/questions/41274241/how-to-capture-inline-markdown-code-but-not-a-markdown-code-fence-with-regex"
|
|
||||||
},
|
|
||||||
{ "name": "Link contents", "pattern": "\\<a(.*)\\>", "description": "" },
|
|
||||||
{ "name": "Snippet references", "pattern": "-- snippet:(.*)", "description": "" },
|
|
||||||
{
|
|
||||||
"name": "Snippet references 2",
|
|
||||||
"pattern": "\\<\\[sample:(.*)",
|
|
||||||
"description": "another kind of snippet reference"
|
|
||||||
},
|
|
||||||
{ "name": "Multi-line code blocks", "pattern": "/^\\s*```[\\s\\S]*?^\\s*```/gm" },
|
|
||||||
{
|
|
||||||
"name": "HTML Tags",
|
|
||||||
"pattern": "<[^>]*>",
|
|
||||||
"description": "Reference: https://stackoverflow.com/questions/11229831/regular-expression-to-remove-html-tags-from-a-string"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"ignoreRegExpList": [
|
|
||||||
"Markdown links",
|
|
||||||
"Markdown code blocks",
|
|
||||||
"Inline code blocks",
|
|
||||||
"Link contents",
|
|
||||||
"Snippet references",
|
|
||||||
"Snippet references 2",
|
|
||||||
"Multi-line code blocks",
|
|
||||||
"HTML Tags"
|
|
||||||
],
|
|
||||||
"ignorePaths": [
|
|
||||||
"packages/mermaid/src/docs/CHANGELOG.md",
|
|
||||||
"packages/mermaid/src/docs/.vitepress/redirect.ts",
|
|
||||||
"packages/mermaid/src/docs/.vitepress/contributor-names.json"
|
|
||||||
]
|
|
||||||
}
|
|
45
cspell.config.yaml
Normal file
45
cspell.config.yaml
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
# yaml-language-server: $schema=https://raw.githubusercontent.com/streetsidesoftware/cspell/main/cspell.schema.json
|
||||||
|
|
||||||
|
$schema: https://raw.githubusercontent.com/streetsidesoftware/cspell/main/cspell.schema.json
|
||||||
|
version: '0.2'
|
||||||
|
language: en-US,en-GB
|
||||||
|
|
||||||
|
import:
|
||||||
|
- ./.cspell/cspell.config.yaml
|
||||||
|
|
||||||
|
ignoreRegExpList:
|
||||||
|
- character-set-cyrillic
|
||||||
|
- svg-block
|
||||||
|
ignorePaths:
|
||||||
|
- '*lock.{yaml,json}'
|
||||||
|
- dist
|
||||||
|
- CHANGELOG.md
|
||||||
|
- packages/mermaid/src/docs/.vitepress/redirect.ts
|
||||||
|
- packages/mermaid/src/docs/.vitepress/contributor-names.json
|
||||||
|
- backup
|
||||||
|
- '**/*.spec.{js,ts}' # checked by eslint
|
||||||
|
- 'tests/webpack/src/index.js' # checked by eslint
|
||||||
|
- 'cypress/**/*.js' # checked by eslint
|
||||||
|
- '*.csv'
|
||||||
|
- '*.patch'
|
||||||
|
- 'docs/**/*.html'
|
||||||
|
- 'cypress/platform/**'
|
||||||
|
dictionaries:
|
||||||
|
- misc-terms
|
||||||
|
overrides:
|
||||||
|
- filename:
|
||||||
|
- '**/*.{jison,ts,mts,cjs,mjs,js,json,yaml,yml,md,html}'
|
||||||
|
- 'run'
|
||||||
|
- Dockerfile
|
||||||
|
ignoreRegExpList:
|
||||||
|
- js-unicode-escape
|
||||||
|
dictionaries:
|
||||||
|
- code-terms
|
||||||
|
- 3rd-party-terms
|
||||||
|
- fonts
|
||||||
|
- html
|
||||||
|
- lorem-ipsum
|
||||||
|
- filename: '**/package.json'
|
||||||
|
ignoreRegExpList:
|
||||||
|
- json-property
|
||||||
|
# cspell:dictionaries code-terms
|
@@ -1,24 +0,0 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-var-requires */
|
|
||||||
|
|
||||||
const { defineConfig } = require('cypress');
|
|
||||||
const { addMatchImageSnapshotPlugin } = require('cypress-image-snapshot/plugin');
|
|
||||||
const coverage = require('@cypress/code-coverage/task');
|
|
||||||
|
|
||||||
module.exports = defineConfig({
|
|
||||||
projectId: 'n2sma2',
|
|
||||||
e2e: {
|
|
||||||
specPattern: 'cypress/integration/**/*.{js,jsx,ts,tsx}',
|
|
||||||
setupNodeEvents(on, config) {
|
|
||||||
coverage(on, config);
|
|
||||||
addMatchImageSnapshotPlugin(on, config);
|
|
||||||
// copy any needed variables from process.env to config.env
|
|
||||||
config.env.useAppli = process.env.USE_APPLI ? true : false;
|
|
||||||
|
|
||||||
// do not forget to return the changed config object!
|
|
||||||
return config;
|
|
||||||
},
|
|
||||||
},
|
|
||||||
video: false,
|
|
||||||
});
|
|
||||||
|
|
||||||
require('@applitools/eyes-cypress')(module);
|
|
39
cypress.config.ts
Normal file
39
cypress.config.ts
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
import { defineConfig } from 'cypress';
|
||||||
|
import { addMatchImageSnapshotPlugin } from 'cypress-image-snapshot/plugin';
|
||||||
|
import coverage from '@cypress/code-coverage/task';
|
||||||
|
import eyesPlugin from '@applitools/eyes-cypress';
|
||||||
|
import { registerArgosTask } from '@argos-ci/cypress/task';
|
||||||
|
|
||||||
|
export default eyesPlugin(
|
||||||
|
defineConfig({
|
||||||
|
projectId: 'n2sma2',
|
||||||
|
viewportWidth: 1440,
|
||||||
|
viewportHeight: 1024,
|
||||||
|
e2e: {
|
||||||
|
specPattern: 'cypress/integration/**/*.{js,ts}',
|
||||||
|
setupNodeEvents(on, config) {
|
||||||
|
coverage(on, config);
|
||||||
|
on('before:browser:launch', (browser, launchOptions) => {
|
||||||
|
if (browser.name === 'chrome' && browser.isHeadless) {
|
||||||
|
launchOptions.args.push('--window-size=1440,1024', '--force-device-scale-factor=1');
|
||||||
|
}
|
||||||
|
return launchOptions;
|
||||||
|
});
|
||||||
|
// copy any needed variables from process.env to config.env
|
||||||
|
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!
|
||||||
|
return config;
|
||||||
|
},
|
||||||
|
},
|
||||||
|
video: false,
|
||||||
|
})
|
||||||
|
);
|
@@ -10,7 +10,7 @@ interface CypressConfig {
|
|||||||
type CypressMermaidConfig = MermaidConfig & CypressConfig;
|
type CypressMermaidConfig = MermaidConfig & CypressConfig;
|
||||||
|
|
||||||
interface CodeObject {
|
interface CodeObject {
|
||||||
code: string;
|
code: string | string[];
|
||||||
mermaid: CypressMermaidConfig;
|
mermaid: CypressMermaidConfig;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -25,7 +25,7 @@ const batchId: string =
|
|||||||
: Cypress.env('CYPRESS_COMMIT') || Date.now().toString());
|
: Cypress.env('CYPRESS_COMMIT') || Date.now().toString());
|
||||||
|
|
||||||
export const mermaidUrl = (
|
export const mermaidUrl = (
|
||||||
graphStr: string,
|
graphStr: string | string[],
|
||||||
options: CypressMermaidConfig,
|
options: CypressMermaidConfig,
|
||||||
api: boolean
|
api: boolean
|
||||||
): string => {
|
): string => {
|
||||||
@@ -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,16 +54,15 @@ 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',
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@@ -82,7 +81,7 @@ export const urlSnapshotTest = (
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const renderGraph = (
|
export const renderGraph = (
|
||||||
graphStr: string,
|
graphStr: string | string[],
|
||||||
options: CypressMermaidConfig = {},
|
options: CypressMermaidConfig = {},
|
||||||
api = false
|
api = false
|
||||||
): void => {
|
): void => {
|
||||||
@@ -95,18 +94,7 @@ export const openURLAndVerifyRendering = (
|
|||||||
options: CypressMermaidConfig,
|
options: CypressMermaidConfig,
|
||||||
validation?: any
|
validation?: any
|
||||||
): void => {
|
): void => {
|
||||||
const useAppli: boolean = Cypress.env('useAppli');
|
const name: string = (options.name ?? cy.state('runnable').fullTitle()).replace(/\s+/g, '-');
|
||||||
const name: string = (options.name || cy.state('runnable').fullTitle()).replace(/\s+/g, '-');
|
|
||||||
|
|
||||||
if (useAppli) {
|
|
||||||
cy.log(`Opening eyes ${Cypress.spec.name} --- ${name}`);
|
|
||||||
cy.eyesOpen({
|
|
||||||
appName: 'Mermaid',
|
|
||||||
testName: name,
|
|
||||||
batchName: Cypress.spec.name,
|
|
||||||
batchId: batchId + Cypress.spec.name,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
cy.visit(url);
|
cy.visit(url);
|
||||||
cy.window().should('have.property', 'rendered', true);
|
cy.window().should('have.property', 'rendered', true);
|
||||||
@@ -116,11 +104,29 @@ export const openURLAndVerifyRendering = (
|
|||||||
cy.get('svg').should(validation);
|
cy.get('svg').should(validation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
verifyScreenshot(name);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const verifyScreenshot = (name: string): void => {
|
||||||
|
const useAppli: boolean = Cypress.env('useAppli');
|
||||||
|
const useArgos: boolean = Cypress.env('useArgos');
|
||||||
|
|
||||||
if (useAppli) {
|
if (useAppli) {
|
||||||
|
cy.log(`Opening eyes ${Cypress.spec.name} --- ${name}`);
|
||||||
|
cy.eyesOpen({
|
||||||
|
appName: 'Mermaid',
|
||||||
|
testName: name,
|
||||||
|
batchName: Cypress.spec.name,
|
||||||
|
batchId: batchId + Cypress.spec.name,
|
||||||
|
});
|
||||||
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, {
|
||||||
|
threshold: 0.01,
|
||||||
|
});
|
||||||
} 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', () => {
|
||||||
@@ -117,13 +117,53 @@ 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.viewport(1440, 1024);
|
|
||||||
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'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
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,14 +1,12 @@
|
|||||||
describe('Rerendering', () => {
|
describe('Rerendering', () => {
|
||||||
it('should be able to render after an error has occurred', () => {
|
it('should be able to render after an error has occurred', () => {
|
||||||
const url = 'http://localhost:9000/render-after-error.html';
|
const url = 'http://localhost:9000/render-after-error.html';
|
||||||
cy.viewport(1440, 1024);
|
|
||||||
cy.visit(url);
|
cy.visit(url);
|
||||||
cy.get('#graphDiv').should('exist');
|
cy.get('#graphDiv').should('exist');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should be able to render and rerender a graph via API', () => {
|
it('should be able to render and rerender a graph via API', () => {
|
||||||
const url = 'http://localhost:9000/rerender.html';
|
const url = 'http://localhost:9000/rerender.html';
|
||||||
cy.viewport(1440, 1024);
|
|
||||||
cy.visit(url);
|
cy.visit(url);
|
||||||
cy.get('#graph [id^=flowchart-A]').should('have.text', 'XMas');
|
cy.get('#graph [id^=flowchart-A]').should('have.text', 'XMas');
|
||||||
|
|
||||||
|
@@ -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.
|
||||||
|
387
cypress/integration/rendering/block.spec.js
Normal file
387
cypress/integration/rendering/block.spec.js
Normal file
@@ -0,0 +1,387 @@
|
|||||||
|
import { imgSnapshotTest } from '../../helpers/util';
|
||||||
|
/* eslint-disable no-useless-escape */
|
||||||
|
describe('Block diagram', () => {
|
||||||
|
it('BL1: should calculate the block widths', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`block-beta
|
||||||
|
columns 2
|
||||||
|
block
|
||||||
|
id2["I am a wide one"]
|
||||||
|
id1
|
||||||
|
end
|
||||||
|
id["Next row"]
|
||||||
|
`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('BL2: should handle colums statement in sub-blocks', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`block-beta
|
||||||
|
id1["Hello"]
|
||||||
|
block
|
||||||
|
columns 3
|
||||||
|
id2["to"]
|
||||||
|
id3["the"]
|
||||||
|
id4["World"]
|
||||||
|
id5["World"]
|
||||||
|
end
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('BL3: should align block widths and handle colums statement in sub-blocks', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`block-beta
|
||||||
|
block
|
||||||
|
columns 1
|
||||||
|
id1
|
||||||
|
id2
|
||||||
|
id2.1
|
||||||
|
end
|
||||||
|
id3
|
||||||
|
id4
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('BL4: should align block widths and handle colums statements in deeper sub-blocks then 1 level', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`block-beta
|
||||||
|
columns 1
|
||||||
|
block
|
||||||
|
columns 1
|
||||||
|
block
|
||||||
|
columns 3
|
||||||
|
id1
|
||||||
|
id2
|
||||||
|
id2.1(("XYZ"))
|
||||||
|
end
|
||||||
|
id48
|
||||||
|
end
|
||||||
|
id3
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('BL5: should align block widths and handle colums statements in deeper sub-blocks then 1 level (alt)', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`block-beta
|
||||||
|
columns 1
|
||||||
|
block
|
||||||
|
id1
|
||||||
|
id2
|
||||||
|
block
|
||||||
|
columns 1
|
||||||
|
id3("Wider then")
|
||||||
|
id5(("id5"))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
id4
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('BL6: should handle block arrows and spece statements', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`block-beta
|
||||||
|
columns 3
|
||||||
|
space:3
|
||||||
|
ida idb idc
|
||||||
|
id1 id2
|
||||||
|
blockArrowId<["Label"]>(right)
|
||||||
|
blockArrowId2<["Label"]>(left)
|
||||||
|
blockArrowId3<["Label"]>(up)
|
||||||
|
blockArrowId4<["Label"]>(down)
|
||||||
|
blockArrowId5<["Label"]>(x)
|
||||||
|
blockArrowId6<["Label"]>(y)
|
||||||
|
blockArrowId6<["Label"]>(x, down)
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('BL7: should handle different types of edges', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`block-beta
|
||||||
|
columns 3
|
||||||
|
A space:5
|
||||||
|
A --o B
|
||||||
|
A --> C
|
||||||
|
A --x D
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('BL8: should handle sub-blocks without columns statements', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`block-beta
|
||||||
|
columns 2
|
||||||
|
C A B
|
||||||
|
block
|
||||||
|
D
|
||||||
|
E
|
||||||
|
end
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('BL9: should handle edges from blocks in sub blocks to other blocks', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`block-beta
|
||||||
|
columns 3
|
||||||
|
B space
|
||||||
|
block
|
||||||
|
D
|
||||||
|
end
|
||||||
|
D --> B
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('BL10: should handle edges from composite blocks', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`block-beta
|
||||||
|
columns 3
|
||||||
|
B space
|
||||||
|
block BL
|
||||||
|
D
|
||||||
|
end
|
||||||
|
BL --> B
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('BL11: should handle edges to composite blocks', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`block-beta
|
||||||
|
columns 3
|
||||||
|
B space
|
||||||
|
block BL
|
||||||
|
D
|
||||||
|
end
|
||||||
|
B --> BL
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('BL12: edges should handle labels', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`block-beta
|
||||||
|
A
|
||||||
|
space
|
||||||
|
A -- "apa" --> E
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('BL13: should handle block arrows in different directions', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`block-beta
|
||||||
|
columns 3
|
||||||
|
space blockArrowId1<["down"]>(down) space
|
||||||
|
blockArrowId2<["right"]>(right) blockArrowId3<["Sync"]>(x, y) blockArrowId4<["left"]>(left)
|
||||||
|
space blockArrowId5<["up"]>(up) space
|
||||||
|
blockArrowId6<["x"]>(x) space blockArrowId7<["y"]>(y)
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('BL14: should style statements and class statements', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`block-beta
|
||||||
|
A
|
||||||
|
B
|
||||||
|
classDef blue fill:#66f,stroke:#333,stroke-width:2px;
|
||||||
|
class A blue
|
||||||
|
style B fill:#f9F,stroke:#333,stroke-width:4px
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('BL15: width alignment - D and E should share available space', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`block-beta
|
||||||
|
block
|
||||||
|
D
|
||||||
|
E
|
||||||
|
end
|
||||||
|
db("This is the text in the box")
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('BL16: width alignment - C should be as wide as the composite block', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`block-beta
|
||||||
|
block
|
||||||
|
A("This is the text")
|
||||||
|
B
|
||||||
|
end
|
||||||
|
C
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('BL17: width alignment - blocks shold be equal in width', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`block-beta
|
||||||
|
A("This is the text")
|
||||||
|
B
|
||||||
|
C
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('BL18: block types 1 - square, rounded and circle', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`block-beta
|
||||||
|
A["square"]
|
||||||
|
B("rounded")
|
||||||
|
C(("circle"))
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('BL19: block types 2 - odd, diamond and hexagon', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`block-beta
|
||||||
|
A>"rect_left_inv_arrow"]
|
||||||
|
B{"diamond"}
|
||||||
|
C{{"hexagon"}}
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('BL20: block types 3 - stadium', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`block-beta
|
||||||
|
A(["stadium"])
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('BL21: block types 4 - lean right, lean left, trapezoid and inv trapezoid', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`block-beta
|
||||||
|
A[/"lean right"/]
|
||||||
|
B[\"lean left"\]
|
||||||
|
C[/"trapezoid"\]
|
||||||
|
D[\"trapezoid alt"/]
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('BL22: block types 1 - square, rounded and circle', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`block-beta
|
||||||
|
A["square"]
|
||||||
|
B("rounded")
|
||||||
|
C(("circle"))
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('BL23: sizing - it should be possible to make a block wider', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`block-beta
|
||||||
|
A("rounded"):2
|
||||||
|
B:2
|
||||||
|
C
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('BL24: sizing - it should be possible to make a composite block wider', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`block-beta
|
||||||
|
block:2
|
||||||
|
A
|
||||||
|
end
|
||||||
|
B
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('BL25: block in the middle with space on each side', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`block-beta
|
||||||
|
columns 3
|
||||||
|
space
|
||||||
|
middle["In the middle"]
|
||||||
|
space
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('BL26: space and an edge', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`block-beta
|
||||||
|
columns 5
|
||||||
|
A space B
|
||||||
|
A --x B
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('BL27: block sizes for regular blocks', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`block-beta
|
||||||
|
columns 3
|
||||||
|
a["A wide one"] b:2 c:2 d
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('BL28: composite block with a set width - f should use the available space', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`block-beta
|
||||||
|
columns 3
|
||||||
|
a:3
|
||||||
|
block:e:3
|
||||||
|
f
|
||||||
|
end
|
||||||
|
g
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('BL29: composite block with a set width - f and g should split the available space', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`block-beta
|
||||||
|
columns 3
|
||||||
|
a:3
|
||||||
|
block:e:3
|
||||||
|
f
|
||||||
|
g
|
||||||
|
end
|
||||||
|
h
|
||||||
|
i
|
||||||
|
j
|
||||||
|
`,
|
||||||
|
{}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
@@ -1,7 +1,7 @@
|
|||||||
import { imgSnapshotTest, renderGraph } from '../../helpers/util.ts';
|
import { imgSnapshotTest, renderGraph } from '../../helpers/util.ts';
|
||||||
|
|
||||||
describe('C4 diagram', () => {
|
describe('C4 diagram', () => {
|
||||||
it('should render a simple C4Context diagram', () => {
|
it('C4.1 should render a simple C4Context diagram', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`
|
||||||
C4Context
|
C4Context
|
||||||
@@ -30,9 +30,8 @@ describe('C4 diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should render a simple C4Container diagram', () => {
|
it('C4.2 should render a simple C4Container diagram', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`
|
||||||
C4Container
|
C4Container
|
||||||
@@ -50,9 +49,8 @@ describe('C4 diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should render a simple C4Component diagram', () => {
|
it('C4.3 should render a simple C4Component diagram', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`
|
||||||
C4Component
|
C4Component
|
||||||
@@ -69,9 +67,8 @@ describe('C4 diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should render a simple C4Dynamic diagram', () => {
|
it('C4.4 should render a simple C4Dynamic diagram', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`
|
||||||
C4Dynamic
|
C4Dynamic
|
||||||
@@ -93,9 +90,8 @@ describe('C4 diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
it('should render a simple C4Deployment diagram', () => {
|
it('C4.5 should render a simple C4Deployment diagram', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`
|
||||||
C4Deployment
|
C4Deployment
|
||||||
@@ -117,6 +113,5 @@ describe('C4 diagram', () => {
|
|||||||
`,
|
`,
|
||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
cy.get('svg');
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@@ -76,7 +76,7 @@ describe('Class diagram V2', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should render a simple class diagram with different visibilities', () => {
|
it('2.1 should render a simple class diagram with different visibilities', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
`
|
`
|
||||||
classDiagram-v2
|
classDiagram-v2
|
||||||
@@ -93,7 +93,7 @@ describe('Class diagram V2', () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should render multiple class diagrams', () => {
|
it('3: should render multiple class diagrams', () => {
|
||||||
imgSnapshotTest(
|
imgSnapshotTest(
|
||||||
[
|
[
|
||||||
`
|
`
|
||||||
@@ -571,4 +571,14 @@ class C13["With Città foreign language"]
|
|||||||
{ logLevel: 1, flowchart: { htmlLabels: false } }
|
{ logLevel: 1, flowchart: { htmlLabels: false } }
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
it('should render a simple class diagram with style definition', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`
|
||||||
|
classDiagram-v2
|
||||||
|
class Class10
|
||||||
|
style Class10 fill:#f9f,stroke:#333,stroke-width:4px
|
||||||
|
`,
|
||||||
|
{ logLevel: 1, flowchart: { htmlLabels: false } }
|
||||||
|
);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@@ -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', () => {
|
||||||
@@ -501,4 +483,16 @@ describe('Class diagram', () => {
|
|||||||
B : -methods()
|
B : -methods()
|
||||||
`);
|
`);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should handle notes with anchor tag having target attribute', () => {
|
||||||
|
renderGraph(
|
||||||
|
`classDiagram
|
||||||
|
class test { }
|
||||||
|
note for test "<a href='https://mermaid.js.org/' target="_blank"><code>note about mermaid</code></a>"`
|
||||||
|
);
|
||||||
|
|
||||||
|
cy.get('svg').then((svg) => {
|
||||||
|
cy.get('a').should('have.attr', 'target', '_blank').should('have.attr', 'rel', 'noopener');
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
@@ -1,12 +0,0 @@
|
|||||||
import { imgSnapshotTest } from '../../helpers/util.ts';
|
|
||||||
|
|
||||||
describe('Flowchart', () => {
|
|
||||||
it('34: testing the label width in percy', () => {
|
|
||||||
imgSnapshotTest(
|
|
||||||
`graph TD
|
|
||||||
A[Christmas]
|
|
||||||
`,
|
|
||||||
{ theme: 'forest', fontFamily: '"Noto Sans SC", sans-serif' }
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
@@ -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', () => {
|
||||||
|
@@ -3,7 +3,7 @@ import { imgSnapshotTest } from '../../helpers/util';
|
|||||||
describe('Error Diagrams', () => {
|
describe('Error Diagrams', () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
cy.on('uncaught:exception', (err) => {
|
cy.on('uncaught:exception', (err) => {
|
||||||
expect(err.message).to.include('Parse error');
|
expect(err.message).to.include('error');
|
||||||
// return false to prevent the error from
|
// return false to prevent the error from
|
||||||
// failing this test
|
// failing this test
|
||||||
return false;
|
return false;
|
||||||
|
@@ -837,6 +837,26 @@ subgraph "\`**Two**\`"
|
|||||||
in the hat\`") -- "\`1o **ipa**\`" --> d("The dog in the hog")
|
in the hat\`") -- "\`1o **ipa**\`" --> d("The dog in the hog")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
`,
|
||||||
|
{ flowchart: { titleTopMargin: 0 } }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
it('Sub graphs and markdown strings', () => {
|
||||||
|
imgSnapshotTest(
|
||||||
|
`---
|
||||||
|
config:
|
||||||
|
layout: elk
|
||||||
|
---
|
||||||
|
|
||||||
|
flowchart LR
|
||||||
|
subgraph subgraph_ko6czgs5u["Untitled subgraph"]
|
||||||
|
D["Option 1"]
|
||||||
|
end
|
||||||
|
C{"Evaluate"} -- One --> D
|
||||||
|
C -- Two --> E(("Option 2"))
|
||||||
|
D --> E
|
||||||
|
A["A"]
|
||||||
|
|
||||||
`,
|
`,
|
||||||
{ flowchart: { titleTopMargin: 0 } }
|
{ flowchart: { titleTopMargin: 0 } }
|
||||||
);
|
);
|
||||||
@@ -844,3 +864,41 @@ 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`,
|
||||||
|
{ layout: '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`,
|
||||||
|
{ layout: 'elk' }
|
||||||
|
);
|
||||||
|
cy.get('svg').should((svg) => {
|
||||||
|
const edges = svg[0].querySelectorAll('.edges path');
|
||||||
|
expect(edges[0].getAttribute('class')).to.contain('edge-pattern-solid');
|
||||||
|
expect(edges[1].getAttribute('class')).to.contain('edge-pattern-dotted');
|
||||||
|
expect(edges[2].getAttribute('class')).to.contain('edge-thickness-thick');
|
||||||
|
expect(edges[3].getAttribute('class')).to.contain('edge-thickness-invisible');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
1060
cypress/integration/rendering/flowchart-handDrawn.spec.js
Normal file
1060
cypress/integration/rendering/flowchart-handDrawn.spec.js
Normal file
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user