mirror of
				https://github.com/mermaid-js/mermaid.git
				synced 2025-10-30 18:34:09 +01:00 
			
		
		
		
	Compare commits
	
		
			1356 Commits
		
	
	
		
			@mermaid-j
			...
			omkar/fix-
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 2a10143406 | ||
|   | a566353030 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | d396c6b760 | ||
|   | 8d9f027f40 | ||
|   | 560700eaf8 | ||
|   | 819843cf2a | ||
|   | 5e2870f6f2 | ||
|   | c364ff463a | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 8738288bc0 | ||
|   | 74ef4ce9c6 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 2b41bf083c | ||
|   | 249f22763b | ||
|   | 444d35b9b4 | ||
|   | 83543bc790 | ||
|   | 379559c992 | ||
|   | c61b879711 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 67806022b9 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 65f778d183 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | ed67c36440 | ||
|   | 908043183e | ||
|   | 97b79c3578 | ||
|   | 8d4c5d5278 | ||
|   | 9988a61ec5 | ||
|   | d4e737e451 | ||
|   | b821454927 | ||
|   | 475532a839 | ||
|   | cf8fc2a541 | ||
|   | 08b6524a35 | ||
|   | 221aa3ed19 | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | 640a65f9a7 | ||
|   | c17277e743 | ||
|   | 7b3fd044e8 | ||
|   | 566b3db15f | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 2483e6e434 | ||
|   | e7b39f3fa3 | ||
|   | 1c1d7d0300 | ||
|   | e8ee4bdb48 | ||
|   | 2afa96c2a8 | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | 7c42d08ef2 | ||
|   | d0520e6a50 | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | a703a195d4 | ||
|   | 05b5607265 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 2b28966f8d | ||
|   | 4077088f18 | ||
|   | 867484a2cc | ||
|   | 5ea7088e04 | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | 646230d603 | ||
|   | 5a7e734da4 | ||
|   | 2924b94fbc | ||
|   | f8c6ae5d17 | ||
|   | 8d7330aeb3 | ||
|   | 6a6c9f6254 | ||
|   | b0b76ef7a2 | ||
|   | 53e89d97a0 | ||
|   | 59b400652b | ||
|   | e8124d8828 | ||
|   | 26e3bea2fe | ||
|   | 1fda77db13 | ||
|   | 5b2227b3be | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 7a6f13707f | ||
|   | 9d838d4e7a | ||
|   | 24aec8c280 | ||
|   | 8c4fc3c6ff | ||
|   | d72ee5fc95 | ||
|   | b3ff80f211 | ||
|   | 8a34154efa | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | 79b47be35f | ||
|   | 054f5444d6 | ||
|   | beb80db25a | ||
|   | fbdbd9d0dd | ||
|   | 8ce1f70066 | ||
|   | 334294c6af | ||
|   | e0f3f2bd5a | ||
|   | 6dad2ab327 | ||
|   | 4d2e424c30 | ||
|   | ff217957fc | ||
|   | 866b29c050 | ||
|   | a463d11e57 | ||
|   | 5267f7c6ea | ||
|   | 2bdecc2842 | ||
|   | d8efe9a55d | ||
|   | ae564f30af | ||
|   | 2a6da19956 | ||
|   | de41669320 | ||
|   | 02b997f4e4 | ||
|   | 90c0908ed5 | ||
|   | a7d76b2695 | ||
|   | e46c7ae996 | ||
|   | af7a5fe77d | ||
|   | f9fbadbbe2 | ||
|   | dec82de586 | ||
|   | 598c72853f | ||
|   | b1e1a0c0d7 | ||
|   | a9f3b432ff | ||
|   | cd2ab38927 | ||
|   | 04448e3b6a | ||
|   | 2a12a64c06 | ||
|   | 586b528a16 | ||
|   | 36e6e6e1be | ||
|   | 1de7d31d90 | ||
|   | 34d91d0e88 | ||
|   | 101dc6d52c | ||
|   | 1fbe17e04c | ||
|   | 8fed1c86b0 | ||
|   | b808801347 | ||
|   | 58ec4ca39f | ||
|   | 7e3d547094 | ||
|   | 79f010143a | ||
|   | aa9df775cd | ||
|   | 2601ec89c8 | ||
|   | 566415c189 | ||
|   | cbabc7b709 | ||
|   | 873962c739 | ||
|   | 2aeb435f19 | ||
|   | e0818c9e47 | ||
|   | a3753d8f4d | ||
|   | 308e2cc107 | ||
|   | a578cb8def | ||
|   | a823bf043b | ||
|   | 3980c99c22 | ||
|   | c81f63b462 | ||
|   | 16167a64e5 | ||
|   | cba4d733f0 | ||
|   | 6a0fb67ab7 | ||
|   | 4bfd0f753d | ||
|   | bf83262d7c | ||
|   | ccdd0f0146 | ||
|   | 82646432a1 | ||
|   | c82579097c | ||
|   | 92132ad4f1 | ||
|   | 8564ebbdbd | ||
|   | 1ca6ff93ff | ||
|   | 20098b287b | ||
|   | 0474a8422b | ||
|   | 075f0f580f | ||
|   | 78ded6452f | ||
|   | 08085b8821 | ||
|   | 5f35d70ce2 | ||
|   | 08951dbbf0 | ||
|   | 7caf377963 | ||
|   | 0103da0179 | ||
|   | a6c9ab04dc | ||
|   | b9c472e091 | ||
|   | 4ed4756220 | ||
|   | 4b12ebee51 | ||
|   | d6e1541bc8 | ||
|   | 0507fe114e | ||
|   | 2bb77406fb | ||
|   | 2215bf6aaa | ||
|   | 206cc51578 | ||
|   | c4c55277cb | ||
|   | 0c2d222aa6 | ||
|   | fc3d4859db | ||
|   | c7714fd666 | ||
|   | e2bf95c922 | ||
|   | a79a50b77f | ||
|   | 9133fcb9a8 | ||
|   | 00e9ed2024 | ||
|   | 5919d39812 | ||
|   | f5fa0ae876 | ||
|   | de9eb67040 | ||
|   | cb7518a960 | ||
|   | 34bf5c8be1 | ||
|   | 7d1319f97c | ||
|   | 9c46e960e7 | ||
|   | cd956e1b60 | ||
|   | 78cf1706a9 | ||
|   | 607e9ab989 | ||
|   | 0cf0b684cf | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | cb0cb5dfc7 | ||
|   | 330c48fa3f | ||
|   | 2ff6de11dc | ||
|   | 385fab8c67 | ||
|   | e49911e748 | ||
|   | a3fed10d55 | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | 2a859f2739 | ||
|   | dbbe014c5b | ||
|   | c7fa906115 | ||
|   | 3c69bd34c7 | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | ceef0558be | ||
|   | 63b90e8b9b | ||
|   | f5d27bf7ef | ||
|   | 5a03f07853 | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | 8474cf43fe | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | f56895832f | ||
|   | 8975a1907a | ||
|   | 62b4228df4 | ||
|   | c552dc7551 | ||
|   | e425a45755 | ||
|   | d177211286 | ||
|   | a07d365c1c | ||
|   | 1f512e9671 | ||
|   | 12b6371abf | ||
|   | 5310d60e63 | ||
|   | 3ae87ca06a | ||
|   | 24f23efdad | ||
|   | e2520dde20 | ||
|   | 3e8204aa21 | ||
|   | 0b57984d27 | ||
|   | bcaa40f1d5 | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | 0107494b59 | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | 11c3ac58fd | ||
|   | af2eb13932 | ||
|   | 41e84b726a | ||
|   | a1ba65c0c0 | ||
|   | 5fe6e5dccc | ||
|   | 946452c7b4 | ||
|   | 4bb6351489 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 8c63a2e411 | ||
|   | 4467fd4363 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 7e567a8759 | ||
|   | edf062720d | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 3348eea6af | ||
|   | ae7ffab9ac | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | ecdbc676d2 | ||
|   | 6a01b04e3c | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | aafe8de3d3 | ||
|   | 24287637b5 | ||
|   | f69cc17795 | ||
|   | f5c99a2a4f | ||
|   | 244703a904 | ||
|   | 59a9e1b300 | ||
|   | 167a625413 | ||
|   | 296cb64fa5 | ||
|   | 934f4da507 | ||
|   | 6957f35782 | ||
|   | b00be59ea8 | ||
|   | dff00f2c4f | ||
|   | 2009177375 | ||
|   | eb9987435a | ||
|   | a300d0db94 | ||
|   | 7e7f3c56c2 | ||
|   | 81fa2a675f | ||
|   | 2203792164 | ||
|   | 5bbc9b4f5b | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | ea987861f3 | ||
|   | 178c7130c6 | ||
|   | f87d0dd88a | ||
|   | 2396f90269 | ||
|   | 97e35fd30a | ||
|   | 7a5f999f42 | ||
|   | cd8d74bb96 | ||
|   | 56c6853e05 | ||
|   | 01e2af0cfd | ||
|   | f55ff99f74 | ||
|   | d25770ee73 | ||
|   | 2b05d7e1ed | ||
|   | 30735266a4 | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | 926862c196 | ||
|   | 44e668e704 | ||
|   | 404216273a | ||
|   | 5a6831ae7e | ||
|   | 03119fea2c | ||
|   | 5351211256 | ||
|   | 92c0aa4331 | ||
|   | 7bd5c03d87 | ||
|   | de72e18a7f | ||
|   | 4fdb1d5906 | ||
|   | a2bf5103ce | ||
|   | 8b7a4db2ef | ||
|   | a43965ac2c | ||
|   | 8eb2000b98 | ||
|   | 73f8dee643 | ||
|   | 8bdd7ec719 | ||
|   | 7e1cec95ef | ||
|   | ec2c76a703 | ||
|   | 7facc8f50d | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | 52cd9e8e55 | ||
|   | 9208e7faaf | ||
|   | d0ee6079b3 | ||
|   | 2798e27b1e | ||
|   | f4c08a0c6f | ||
|   | c28c05780c | ||
|   | 6a538da07d | ||
|   | b2dfa74865 | ||
|   | 930e917215 | ||
|   | c8e87b113b | ||
|   | 8627fb0f62 | ||
|   | cdbd3e58a3 | ||
|   | 630c4d6954 | ||
|   | fd4493733f | ||
|   | e588743bf4 | ||
|   | 04d68e7f9a | ||
|   | 9795b6e089 | ||
|   | ceb8d4c7ef | ||
|   | 32c70a0f6a | ||
|   | af2632f14a | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 8f89ba1930 | ||
|   | c1db4f2ed0 | ||
|   | ad6f855f5e | ||
|   | f2f2a1d275 | ||
|   | 17fcf43cdb | ||
|   | 4fff67e4af | ||
|   | 350543a5e2 | ||
|   | 99a2dc7c1f | ||
|   | 34e756fde6 | ||
|   | f74fad057a | ||
|   | 32ea973b12 | ||
|   | 0104d19f66 | ||
|   | e8986eb546 | ||
|   | 936d1074b2 | ||
|   | 7b2083926d | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | bb9210c55e | ||
|   | 16d9b63457 | ||
|   | bf3370fa5b | ||
|   | 9f9091e5e4 | ||
|   | d1b1a67d99 | ||
|   | ac625bdc7f | ||
|   | 40b85c3bbf | ||
|   | f8e329f890 | ||
|   | 9b9cec9809 | ||
|   | ad653138e1 | ||
|   | a401a4ab49 | ||
|   | 2bc3a0f97c | ||
|   | f5f3b08f12 | ||
|   | f7e31a978b | ||
|   | 2d583b186d | ||
|   | b322392f97 | ||
|   | 573b6d9ba7 | ||
|   | ea39254556 | ||
|   | 044a3d9686 | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | f28f7b713d | ||
|   | cfbd05515e | ||
|   | 1125f5a283 | ||
|   | 20927a1c8e | ||
|   | b2ab34ca2b | ||
|   | 55e1dd0ead | ||
|   | a403f78168 | ||
|   | 6c45aa3602 | ||
|   | 85ce310884 | ||
|   | fac570cb8c | ||
|   | a7bcd7dee5 | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | 91bcd2da8c | ||
|   | ec2330875e | ||
|   | bb5a7a585e | ||
|   | 5d1b27132a | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | 288abd01e0 | ||
|   | 95d73bc3f0 | ||
|   | 0f5125b5e3 | ||
|   | 12c120368d | ||
|   | a7f2c0bc34 | ||
|   | 5e97b2f764 | ||
|   | d53c66dde5 | ||
|   | 1fb91d14c9 | ||
|   | d80cc38bb2 | ||
|   | d6022408a9 | ||
|   | 41a737f682 | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | 0c2e1bc3fe | ||
|   | f399561565 | ||
|   | 05bdf0e20e | ||
|   | 292cd83439 | ||
|   | 3848649bdd | ||
|   | 1341e3d156 | ||
|   | 1d6a55a311 | ||
|   | 4d25caba8e | ||
|   | f6335571cc | ||
|   | bb895d8cf4 | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | cdaea58096 | ||
|   | b3d8fa917f | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | ee5dc5ae80 | ||
|   | b7940b64cd | ||
|   | 1ddaf10b89 | ||
|   | 02b833f251 | ||
|   | 0ce0c3cd75 | ||
|   | 00ca7ac94f | ||
|   | 34cd280ae4 | ||
|   | d0986ace8c | ||
|   | a31adc63a9 | ||
|   | bc2bd3d769 | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | f047b81bb9 | ||
|   | 7db1d672a9 | ||
|   | 91e2c04e56 | ||
|   | a2f0d8e4d6 | ||
|   | 00a8dc47f5 | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | 5caaf36a3b | ||
|   | 4128197468 | ||
|   | 40494b16f5 | ||
|   | 840a197044 | ||
|   | ae0fcbfb8b | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | f60ecfc2c4 | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | a38a0ab869 | ||
|   | 06877dcc47 | ||
|   | 050fbd9da2 | ||
|   | 1b5672e73d | ||
|   | 1be1e34e72 | ||
|   | b22103b769 | ||
|   | 9e29fd0c4a | ||
|   | a2650adec2 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 33f9d8bdc9 | ||
|   | 446f6a7701 | ||
|   | 2ace92858f | ||
|   | b0c1460940 | ||
|   | 510fd0fe71 | ||
|   | 9268cc2e07 | ||
|   | 7c7fd4bc5e | ||
|   | baa261fdd1 | ||
|   | aaf15fccc1 | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | 3724d11255 | ||
|   | 5510f18d33 | ||
|   | edbf125c83 | ||
|   | ad6248147c | ||
|   | d47e4724cb | ||
|   | 4f592115e0 | ||
|   | d2d78a5576 | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | 5447a9f4f9 | ||
|   | dc698c0309 | ||
|   | 31665fbad8 | ||
|   | a5561b9be0 | ||
|   | e045e0b42d | ||
|   | 60db05b75c | ||
|   | 3be59a7b4d | ||
|   | ff00141a0a | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | 374ebbb087 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 9d06d8f31e | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 97b12e9718 | ||
|   | 50816a7f98 | ||
|   | a318ea3692 | ||
|   | 1424127127 | ||
|   | 9c27125f2d | ||
|   | 6140be24da | ||
|   | de40d80ef9 | ||
|   | c9b8f034d5 | ||
|   | 2fb7bc2806 | ||
|   | 162e9e50ad | ||
|   | 225e5dde60 | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | 726b42ba00 | ||
|   | c22b5701db | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | c6b715f737 | ||
|   | bc69180958 | ||
|   | 83a6e696c6 | ||
|   | a64b14dbfd | ||
|   | a89e001d01 | ||
|   | 6a81a907d1 | ||
|   | 1c8b996cbb | ||
|   | eb8e4da5f6 | ||
|   | 16573d97f5 | ||
|   | 2fdd24ab15 | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | c01aee842a | ||
|   | 2c22e80dba | ||
|   | 0518e9cfd7 | ||
|   | fe2e73ed94 | ||
|   | 4f5c4b8349 | ||
|   | ce99d968f4 | ||
|   | 877a7e288a | ||
|   | 4eeea1076c | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | f43e35039f | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | dbf885b077 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 78c1d97f0f | ||
|   | 5abda14809 | ||
|   | ad2f17205a | ||
|   | bb4b92a663 | ||
|   | 9bd599666b | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | 36894fe14a | ||
|   | efe834e772 | ||
|   | 98fe7a6e03 | ||
|   | 8857e77495 | ||
|   | 5857953d51 | ||
|   | 5dab86a067 | ||
|   | 9ef35549f4 | ||
|   | 4beed963b8 | ||
|   | 3122c3b75c | ||
|   | dffa689e2b | ||
|   | 5ed2278887 | ||
|   | d6376ca1ff | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | 99bd0c48fa | ||
|   | eb7289a65a | ||
|   | 80c6b945fa | ||
|   | 34a12103d0 | ||
|   | 46b8a75199 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 1dca45a76d | ||
|   | d1d5bd14f6 | ||
|   | 974867a089 | ||
|   | 52532a7801 | ||
|   | 6eb56b9363 | ||
|   | f7c91a72cb | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | c53e044559 | ||
|   | d846a8c65a | ||
|   | c3ba23a4e9 | ||
|   | c688c387a0 | ||
|   | 300fb85a73 | ||
|   | 9c6e554153 | ||
|   | b5c78b7225 | ||
|   | 26bd8cb53c | ||
|   | a81c3187ba | ||
|   | da6361f652 | ||
|   | 167fef5cff | ||
|   | 3233c63fc0 | ||
|   | 1182aaaf4d | ||
|   | b78c061a8f | ||
|   | 39a5abc714 | ||
|   | 6650efc1a6 | ||
|   | a4754ad195 | ||
|   | 91cbe5bc01 | ||
|   | d2996dd553 | ||
|   | 7a7836ad90 | ||
|   | 7ca9242b24 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | ebfcf3ea07 | ||
|   | 62edea6b33 | ||
|   | 72eda9ce52 | ||
|   | cfd84e54d5 | ||
|   | cfe710f42b | ||
|   | 438f388b5c | ||
|   | e89c77a5ca | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | 87e76bbcf5 | ||
|   | 0b4754ed60 | ||
|   | fe6f05eec9 | ||
|   | 31984acfe0 | ||
|   | 9badfe7489 | ||
|   | 548256507d | ||
|   | d8ebf7a136 | ||
|   | 27912bee8c | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | a758b24b75 | ||
|   | 3004d4d93a | ||
|   | 88abf46fc3 | ||
|   | 2eeba0e999 | ||
|   | 397684fe49 | ||
|   | bc1f769f13 | ||
|   | f6592235a2 | ||
|   | 57805dafa4 | ||
|   | 3b92f979e3 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 7a7e4b4e6f | ||
|   | c5843bee23 | ||
|   | 7aef182fbf | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | 2fb6ea7b77 | ||
|   | add48da4c8 | ||
|   | ada42b892c | ||
|   | 62f9261c4e | ||
|   | a19b42f3c2 | ||
|   | 9f90f4f23a | ||
|   | 451c886f50 | ||
|   | 0a1a112605 | ||
|   | d63d3bf1e7 | ||
|   | 33e5694a75 | ||
|   | 302ba725ae | ||
|   | 63cf7cbd94 | ||
|   | 8ab60c3a7a | ||
|   | 0342579b9c | ||
|   | 348401c4f4 | ||
|   | 8145199203 | ||
|   | f408e938d4 | ||
|   | 6471ae4d49 | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | af6e2b4cb6 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 7a4a52b50a | ||
|   | ee05d8588f | ||
|   | 58175f647e | ||
|   | 5f7c68def7 | ||
|   | 82d019234a | ||
|   | d618b8398e | ||
|   | ec0e3e4cd6 | ||
|   | db4ea020ba | ||
|   | 72cf84cb40 | ||
|   | 5366e8b692 | ||
|   | 6ca8f46d37 | ||
|   | b2dfbb6ffd | ||
|   | ffa7804af0 | ||
|   | f454865b97 | ||
|   | d83b1a5dbc | ||
|   | d07f85e6ac | ||
|   | a79c0f4c00 | ||
|   | 4a19740aea | ||
|   | fbac4c61bb | ||
|   | 4dbaa2b5d6 | ||
|   | 9cad3c7aea | ||
|   | 56d66cdabc | ||
|   | a0e5408850 | ||
|   | d155e414a0 | ||
|   | d81ddf246c | ||
|   | ffe1bb359f | ||
|   | 88a39f8e16 | ||
|   | 9fb46ae88f | ||
|   | 798fb98b2a | ||
|   | 7c0af381d1 | ||
|   | 384f59eee2 | ||
|   | 127390978a | ||
|   | baf3adf1c0 | ||
|   | d0768cbc37 | ||
|   | f00507449b | ||
|   | 509793d5c2 | ||
|   | 8dd0e7a794 | ||
|   | 8a8d169e27 | ||
|   | b53cf0a1fb | ||
|   | 58fa99787c | ||
|   | 1a9a9f43e6 | ||
|   | aeec4b7f77 | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | 40686f198c | ||
|   | 295af02744 | ||
|   | a3f35f6367 | ||
|   | 523286bbcb | ||
|   | c296f48ebe | ||
|   | 9609aced14 | ||
|   | 97788df7e3 | ||
|   | 47d4d56fa6 | ||
|   | 5e9c887385 | ||
|   | fdb8ae5b53 | ||
|   | 65ff22d94b | ||
|   | 5cf093ca9e | ||
|   | 03ff28e927 | ||
|   | 16a1a90705 | ||
|   | 3221cbfa0a | ||
|   | f0a8ccb177 | ||
|   | a30705cdcc | ||
|   | e2de55202f | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | b4043840ca | ||
|   | 8f3e17e386 | ||
|   | 4e950e7256 | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | de3e381ccf | ||
|   | b2fde76753 | ||
|   | b5587d8b87 | ||
|   | 9b75aeb224 | ||
|   | 993858cdc8 | ||
|   | f4e1f07412 | ||
|   | 09e0de6053 | ||
|   | 9a50bf5237 | ||
|   | 5747009c8f | ||
|   | dc513ec211 | ||
|   | 5f58d4f7b0 | ||
|   | 3536ceb5d3 | ||
|   | 7ed33a91c0 | ||
|   | f8bf03d365 | ||
|   | 4202ee521a | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 0e25fd42f9 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | feee5d1c8c | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | ab6d92c544 | ||
|   | d27d4abab7 | ||
|   | 3162cff7a9 | ||
|   | 74edf7a027 | ||
|   | 9681a27b31 | ||
|   | 22091f6182 | ||
|   | ba534985ec | ||
|   | edc1ae1e0c | ||
|   | c00f3fb090 | ||
|   | 23bc25ef94 | ||
|   | 42dfa20fd4 | ||
|   | cc2373ea89 | ||
|   | 22bc234ff3 | ||
|   | fa48f9580f | ||
|   | 38ca14da43 | ||
|   | 74a56fc58a | ||
|   | 08ffbb61e9 | ||
|   | 232e60c8cb | ||
|   | cd9ca76e39 | ||
|   | c13d988392 | ||
|   | 15ffe2021a | ||
|   | 4fbc19e0d7 | ||
|   | 02f661a103 | ||
|   | 130638f6e1 | ||
|   | 9ab2761c1d | ||
|   | 41d7a549b0 | ||
|   | 2b8998fdd1 | ||
|   | 202ef31071 | ||
|   | b09f2e836a | ||
|   | 6a814a0d91 | ||
|   | b07bb9b3ff | ||
|   | 5120ed09ab | ||
|   | 081681f05b | ||
|   | f7648e85d9 | ||
|   | fe833e6d16 | ||
|   | 809f4eb609 | ||
|   | 61f3fc5ede | ||
|   | 90bbf90a83 | ||
|   | 92efc24283 | ||
|   | 1c45df4567 | ||
|   | 1575a93136 | ||
|   | bde653b1c2 | ||
|   | e9e663ffa3 | ||
|   | 963efa64c7 | ||
|   | e2e5101005 | ||
|   | 6ea13cded3 | ||
|   | c063b92cc9 | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | 304f133227 | ||
|   | 54a0dd0af6 | ||
|   | 54ee6bd46d | ||
|   | f0e47f29fd | ||
|   | ab5b7694c6 | ||
|   | eb76dfb1ca | ||
|   | 28d7ec092c | ||
|   | 84b03f3a08 | ||
|   | f9ac9867c1 | ||
|   | ee6fb83265 | ||
|   | 46c16c963b | ||
|   | 32a68d489e | ||
|   | 7bbebff583 | ||
|   | c432aec2f6 | ||
|   | 64237fbaa7 | ||
|   | d90609b26c | ||
|   | adec6cd254 | ||
|   | 5ce60cacbf | ||
|   | 9ddedb0b49 | ||
|   | e977deaf11 | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | 85a7771b70 | ||
|   | 3778fef1a1 | ||
|   | 0bff720e20 | ||
|   | 7ba415dad1 | ||
|   | 7f47678862 | ||
|   | 127bac1147 | ||
|   | 9a90d795ca | ||
|   | f7fe8f2f59 | ||
|   | 1d9c2aab8d | ||
|   | 8fba9c1236 | ||
|   | 04800ff677 | ||
|   | 5d3d1047a4 | ||
|   | 0f08c3bc9c | ||
|   | 7809b5a93f | ||
|   | ef9bb53e67 | ||
|   | 3e32332814 | ||
|   | e1aab25144 | ||
|   | c8697301ee | ||
|   | fcb1de915b | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | e345294658 | ||
|   | 9936099e25 | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | 59352ad4d8 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | ba70f15de5 | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | e70b069576 | ||
|   | 28bab4a323 | ||
|   | 6cc31b7453 | ||
|   | 29ca1504dd | ||
|   | 16d2251e43 | ||
|   | bc2cc61240 | ||
|   | 6836e9c7a8 | ||
|   | 8dc016e7f9 | ||
|   | 3cad7984a3 | ||
|   | f5bae98098 | ||
|   | 0695893e30 | ||
|   | 9ef6090c8c | ||
|   | fa6f3e5fff | ||
|   | ec0d9c389a | ||
|   | 323b07a2e4 | ||
|   | c153d0455f | ||
|   | 9b00f1f2fb | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | a055ff7db3 | ||
|   | d032723a47 | ||
|   | daf83f596d | ||
|   | df636c6d0a | ||
|   | 64554a6c60 | ||
|   | becadf0a7d | ||
|   | 54d485f173 | ||
|   | b4f5b8ddaf | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | cb5c1ae367 | ||
|   | b29081d4e8 | ||
|   | 654097c438 | ||
|   | 1e672868c4 | ||
|   | bff32827b5 | ||
|   | 65f9b29b86 | ||
|   | 9868f3a4c3 | ||
|   | b4879d13b8 | ||
|   | 95964b5487 | ||
|   | 4e17da0a30 | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | d8bf155f0e | ||
|   | 0b4f85230a | ||
|   | 0dff4ca438 | ||
|   | cc29437ede | ||
|   | dfaaf361f3 | ||
|   | 37538310d3 | ||
|   | c7ae08abc3 | ||
|   | 69973eaa02 | ||
|   | d3b2c7ea18 | ||
|   | 68f41f685d | ||
|   | 255279eb22 | ||
|   | fe3cffbb67 | ||
|   | 2a91849a38 | ||
|   | 082de76eef | ||
|   | 570ae78b15 | ||
|   | 885ac6f947 | ||
|   | 8328f74751 | ||
|   | 01b5079562 | ||
|   | 6b23647bec | ||
|   | 193fdb225e | ||
|   | c8ce416aba | ||
|   | 1388662132 | ||
|   | 757627427b | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | 7cbd80af33 | ||
|   | 16c448b89b | ||
|   | c218e365bd | ||
|   | f507dbbe00 | ||
|   | 9966beb99b | ||
|   | f4713332c0 | ||
|   | 63ff5b1d98 | ||
|   | cb0a4703bd | ||
|   | 7e71b85668 | ||
|   | 1dd7bcb0a6 | ||
|   | bbf6ab1206 | ||
|   | 56f522ec50 | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | d4e5acc530 | ||
|   | ef9cbb61e5 | ||
|   | 8a0ecc1fe9 | ||
|   | c6e1271ef7 | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | b02294376a | ||
|   | 97c61d818c | ||
|   | 1c66237fa8 | ||
|   | 8ef5d324fd | ||
|   | c1ca3511c4 | ||
|   | 953d288957 | ||
|   | 143806b360 | ||
|   | a381ab6c41 | ||
|   | 93e20fdaa3 | ||
|   | ece3b254db | ||
|   | dd42305e8c | ||
|   | c34fd152d5 | ||
|   | 8f0e0b9c39 | ||
|   | fe8932e906 | ||
|   | 5a2a8f9bd4 | ||
|   | 9854748fc3 | ||
|   | 73bbde8476 | ||
|   | 01a41ef530 | ||
|   | 124d2f72dd | ||
|   | 34e8946c58 | ||
|   | 0197c08916 | ||
|   | ef30283fe9 | ||
|   | dffaf9fa8f | ||
|   | 9168d5d1f4 | ||
|   | f33ebfaf7a | ||
|   | 054f929150 | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | 8cb1c68166 | ||
|   | d752240efc | ||
|   | 8d0902de4c | ||
|   | f6c32b6da4 | ||
|   | bdf145ffe3 | ||
|   | 75ca802b62 | ||
|   | 3f85b6179d | ||
|   | 5ae5a0cea3 | ||
|   | b315d70af5 | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | 848be3d129 | ||
|   | 5fabd414fb | ||
|   | 17e2f9e0d4 | ||
|   | 7fa8b35bdc | ||
|   | e6ea4eae50 | ||
|   | 7401cb8f6a | ||
|   | e765007b21 | ||
|   | b5cd101d86 | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | da12ace593 | ||
|   | 2c676b6222 | ||
|   | 0af08276d2 | ||
|   | d790e353b0 | ||
|   | e07e9b9daf | ||
|   | 948ec4d1ce | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | e62d268c89 | ||
|   | 742ad7c130 | ||
|   | 56cc3728c5 | ||
|   | fb86e5c689 | ||
|   | 01e5346004 | ||
|   | 1b34077f55 | ||
|   | 87fa698c79 | ||
|   | b49afeefc2 | ||
|   | 8ace44b428 | ||
|   | 39a6c308fb | ||
|   | 2771b14f65 | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | 9ff09f28e7 | ||
|   | eddd8313c9 | ||
|   | f8746bee04 | ||
|   | bb97fdbd1e | ||
|   | e3ec6ed993 | ||
|   | 6df1fa1a03 | ||
|   | fd6b875f87 | ||
|   | be3da0b39d | ||
|   | 64bc7f4bd9 | ||
|   | 75e796f183 | ||
|   | 6cc0132e0a | ||
|   | 4bc70b7325 | ||
|   | bfdd0f244d | ||
|   | 0e819ae050 | ||
|   | 10f11e016f | ||
|   | b7d66bb975 | ||
|   | 74695d2e88 | ||
|   | 38eed7c988 | ||
|   | d16e46a386 | ||
|   | 97820a50c2 | ||
|   | df948bcf2c | ||
|   | cfd097b029 | ||
|   | ffc1fef599 | ||
|   | 1e8e4e4b73 | ||
|   | b67cdb171d | ||
|   | c789172b89 | ||
|   | 1d68c4f075 | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | 606ecf8990 | ||
|   | 16a5fc05d6 | ||
|   | 62fd359c0e | ||
|   | b0f4ace3a1 | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | 6f506c30eb | ||
|   | cf2c7f7f8c | ||
|   | 6041729ae2 | ||
|   | b7ef8b2b5a | ||
|   | bfea287b44 | ||
|   | 9afb181d06 | ||
|   | cfe7cce41d | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | 33029c8bd2 | ||
|   | e54d10c706 | ||
|   | df22fb5e00 | ||
|   | 5d2b0f74af | ||
|   | 86c7532f46 | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | 723b8f1d32 | ||
|   | 5be5aa3dfa | ||
|   | 69e12fd67d | ||
|   | 8aa87c7091 | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | e1024838e8 | ||
|   | 4cce43f0a1 | ||
|   | 49e23c74bc | ||
|   | 8b169f3796 | ||
|   | b5da91b29a | ||
|   | 1d4ea56740 | ||
|   | 0d664b1fd2 | ||
|   | 29c3293265 | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | c69ab34eac | ||
|   | 7353be3b16 | ||
|   | 02be63ed72 | ||
|   | 742531a2c2 | ||
|   | 991d403d7f | ||
|   | 290c678dc7 | ||
|   | 2c31a599af | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | 2655be0bad | ||
|   | 4f97c8c70e | ||
|   | f85977246c | ||
|   | a4fd42214b | ||
|   | ca885027d4 | ||
|   | 9f6f1e96e5 | ||
|   | 351ce30d8a | ||
|   | 2933eb5c28 | ||
|   | 09ecf76034 | ||
|   | 2b86750cb3 | ||
|   | b45224755e | ||
|   | 14524e1b0e | ||
|   | efa47e3176 | ||
|   | 1bc45405e0 | ||
|   | 3720e1a894 | ||
|   | 76138cf3b9 | ||
|   | 2506c29f6b | ||
|   | 463ba6ed6d | ||
|   | 17b783135f | ||
|   | 8df2729bd4 | ||
|   | a001619464 | ||
|   | 3c5a19d297 | ||
|   | a98290a6e2 | ||
|   | 9bac464442 | ||
|   | df110e5e11 | ||
|   | 6247bd5f89 | ||
|   | cba4752433 | ||
|   | d0dd4e6e5e | ||
|   | d2892ea249 | ||
|   | 983c28686f | ||
|   | f2f1ad4605 | ||
|   | 10562e72f4 | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | 11fb806992 | ||
|   | d424a4473a | ||
|   | 4062813d44 | ||
|   | 29b9d3069b | ||
|   | c38d9a6620 | ||
|   | 2f65429aa4 | ||
|   | c24028f2a4 | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | a20c292653 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 1c6304b3fb | ||
|   | 3ac93af80c | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | ce586e1b31 | ||
|   | 926f97124b | ||
|   | 0f2301f2d6 | ||
|   | 58e8f65135 | ||
|   | 1b51fbfcca | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 1296840696 | ||
|   | f99e2c9366 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | c71b56ebe3 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 9904afce64 | ||
|   | a827fb1202 | ||
|   | 51be99c9de | ||
|   | b83b778f2a | ||
|   | 86a91597f9 | ||
|   | 1b12ac133e | ||
|   | e55880a9c4 | ||
|   | 9cc309b69c | ||
|   | d3308232e8 | ||
|   | 0b8f27e1d2 | ||
|   | 93f2c241b8 | ||
|   | fb44e769f2 | ||
|   | fabdfd9ae8 | ||
|   | 72d60d2633 | ||
|   | 2d7686eb65 | ||
|   | d9a26ff193 | ||
|   | 2401eea725 | ||
|   | ddf18dd233 | ||
|   | 4b98dabc3f | ||
|   | 5a3e0ccc3d | ||
|   | 38a3ad3370 | ||
|   | b777c12094 | ||
|   | 8fc36d2684 | ||
|   | e2474049d8 | ||
|   | 6e0fe03552 | ||
|   | cda48a7143 | ||
|   | e5a28de26e | ||
|   | 0ae4f97036 | ||
|   | 218bfe1603 | ||
|   | 339c670839 | ||
|   | c5a19f6e85 | ||
|   | be57484573 | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | 0cb88c21dc | ||
|   | 0bc1f5296f | ||
|   | 4776f97f82 | ||
|   | 460db0aea7 | ||
|   | 02cf111995 | ||
|   | 14d9d92112 | ||
|   | fce77a19b0 | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | 719685b930 | ||
|   | 0cbc000bfa | ||
|   | ef8c0025fd | ||
|   | 16847ea06c | ||
|   | be0bbe9950 | ||
|   | b503c2c758 | ||
|   | 1d14f4658d | ||
|   | c7382af161 | ||
|   | f6adca902f | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | d50a6cf75c | ||
|   | 2cebf09cf2 | ||
|   | 46419f7bfe | ||
|   | 43e8f831c0 | ||
|   | 760ea1e020 | ||
|   | 07d7704ef4 | ||
|   | a4878d05f0 | ||
|   | c5bcd2f22c | ||
|   | df1fba7fc5 | ||
|   | bb521f7af8 | ||
|   | f9818b8bd7 | ||
|   | dfcb4af18b | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | 5c67e42a55 | ||
|   | 7441be09b5 | ||
|   | a75665c7bf | ||
|   | 4cb0f87b72 | ||
|   | 1e8cd63645 | ||
|   | 3860a99951 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 226b3bfa74 | ||
|   | a5559c6588 | ||
|   | de2c05cd54 | ||
|   | 6d916fb66f | ||
|   | 90b6df24a1 | ||
|   | 3e807e0131 | ||
|   | e2e2caa0e9 | ||
|   | b3dee343d1 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 608f7afa70 | ||
|   | 58ef0ee174 | ||
|   | 2a76dc6409 | ||
|   | 91e3da1293 | ||
|   | fa46267c14 | ||
|   | dc7e32eb10 | ||
|   | 10679297f9 | ||
|   | 3e697e2ea4 | ||
|   | 6a649d347d | ||
|   | fd372941c7 | ||
|   | 1c8c95367d | ||
|   | f031abcec2 | ||
|   | dd62322ae5 | ||
|   | 48e5dee963 | ||
|   | b3dfc60fff | ||
|   | bb3b95f0bd | ||
|   | 4fc9028dc1 | ||
|   | 02cadd87ff | ||
|   | 1c105154a6 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | daaeded0b5 | ||
|   | ed7d41a3cb | ||
|   | f052a3f686 | ||
|   | 11da07b735 | ||
|   | d01e180caf | ||
|   | 4c400966b4 | ||
|   | bd0a00d373 | ||
|   | 3b8bd6b979 | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | f849c36942 | ||
|   | c83fc753a1 | ||
|   | eeeb5fcdd9 | ||
|   | 41f22864b4 | ||
|   | 6a99a1a40a | ||
|   | 1fcebab9ed | ||
|   | bed301a485 | ||
|   | 31546b08ff | ||
|   | 25337dc453 | ||
|   | cb85d50f61 | ||
|   | a52949318a | ||
|   | 745495c2d5 | ||
|   | dd261a54df | ||
|   | 94d2a0ee89 | ||
|   | f035db2feb | ||
|   | b105c7b35e | ||
|   | 149f991c1d | ||
|   | a43ee60942 | ||
|   | 5f11cd417f | ||
|   | 3782b69744 | ||
|   | ca93280b17 | ||
|   | 2ec9f0af2e | ||
|   | 3eb338df04 | ||
|   | b7790ba6b5 | ||
|   | b67c931f18 | ||
|   | 97186504b5 | ||
|   | bd4ca9af1b | ||
|   | 9ac20a5cb8 | ||
|   | 20a58d6dbb | ||
|   | 191e4217fc | ||
|   | 8745daa701 | ||
|   | 27f7b615cc | ||
|   | e3c426de86 | ||
|   | c6410472c8 | ||
|   | d807466780 | ||
|   | c8b9c4cebc | ||
|   | 741072a126 | ||
|   | be9123ee2b | ||
|   | 3f5afe8daf | ||
|   | 522de3abd8 | ||
|   | d37d77cc1a | ||
|   | 4740be6562 | ||
|   | a07f1f3337 | ||
|   | 02851fd672 | ||
|   | 233e36c988 | ||
|   | 2b12a658f6 | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | b74842ceb3 | ||
|   | ca84f7d4a9 | ||
|   | 1892277273 | ||
|   | f12df395f8 | ||
|   | 89e82e4d97 | ||
|   | af2340d889 | ||
|   | 775a6381b4 | ||
|   | 38c6ad5ad6 | ||
|   | d63dc319c7 | ||
| ![github-actions[bot]](/assets/img/avatar_default.png)  | c5539e0aa0 | ||
|   | 14601b7871 | ||
|   | 7a86fd7b44 | ||
|   | 0b3522894a | ||
|   | aa0836aecc | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | 78f9238865 | ||
|   | 5ca4fccbb0 | ||
|   | 7f2044024b | ||
|   | d2de9702c5 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 92a8783d95 | ||
|   | 4bd1e5c524 | ||
|   | 10826055f3 | ||
| ![renovate[bot]](/assets/img/avatar_default.png)  | 6cf050e6e5 | ||
|   | 52e1a36ffe | ||
|   | e83a95d3ed | ||
|   | 44561f57d3 | ||
|   | 4c26fe224b | ||
|   | 61af74609a | ||
|   | 9f2f3bd780 | ||
|   | 38bcbcdd0a | ||
|   | d8c340d9c5 | ||
|   | 8456d7b100 | ||
|   | 2fa044d484 | ||
|   | 4162a25425 | ||
|   | e26a38b619 | ||
|   | 92aa2859a0 | ||
|   | 1d8f524913 | ||
|   | 59991b70a1 | ||
|   | a6b877676e | ||
|   | 3c49c00f2b | ||
|   | c97716e780 | ||
|   | 355e218837 | ||
|   | a3145a32e7 | ||
|   | 8b6fb94835 | ||
|   | 83ea81d975 | ||
|   | aae9db92ee | ||
|   | 6c5b7ce9f4 | ||
|   | 8bb70ea493 | ||
|   | bff9f65c88 | ||
|   | 88607e8aa0 | ||
|   | 17c6ed6303 | ||
|   | bfd8c63daa | ||
|   | 6de7f1b088 | ||
|   | 3359d87115 | ||
|   | e8fdc965a2 | ||
|   | 67bcd3e0d6 | ||
|   | 9421f63775 | ||
|   | 01bf7af360 | ||
|   | 4754ed01ab | ||
|   | a2c262f940 | ||
|   | 7963ad9b20 | ||
|   | 5e34810335 | ||
|   | e44eb5258b | ||
|   | e564c395ba | ||
|   | 3d1af09090 | ||
|   | 1cc2f323de | ||
|   | 194684e27b | ||
|   | ee17e020cf | ||
|   | 2b8ef765e7 | ||
|   | dbe965303b | ||
|   | 3d9e919545 | ||
|   | 30eb02510b | ||
|   | 06aa72ec16 | ||
|   | cf45a35971 | ||
|   | a601d3bccf | ||
|   | f46a135458 | ||
|   | 82cc473801 | ||
|   | e111965411 | ||
|   | 41cf1262b2 | ||
|   | e5532c3418 | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | a881d46178 | ||
|   | edb99c2842 | ||
|   | 4d04d1a8c3 | ||
|   | 1d1766b5c3 | ||
|   | 0ade03c4de | ||
|   | 2aa5089930 | ||
|   | 2259a59ac6 | ||
|   | d8d56df272 | ||
|   | ec29f749af | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | 9467735fab | ||
|   | 9e3aa705ae | ||
|   | 0f8cc48d03 | ||
|   | 95bd5dfdab | ||
|   | e6ce370cdd | ||
|   | 78346cbe84 | ||
|   | 9a953f7f80 | ||
|   | 14bb09a3db | ||
|   | 89fb65913d | ||
|   | 41a75005c8 | ||
|   | 54ecd7d423 | ||
|   | 352194c942 | ||
|   | 30e4ab99d9 | ||
|   | 5f0160c036 | ||
|   | 443c886050 | ||
|   | b7fd21e17a | ||
|   | 2f24f6271a | ||
|   | 6507624232 | ||
|   | e337331122 | ||
|   | 1d5f7ce08f | ||
|   | adedb5f803 | ||
|   | 9774c08336 | ||
|   | 525dcd4760 | ||
|   | d75661e49d | ||
|   | 52d6035c23 | ||
|   | 5a9221680f | ||
|   | 3a5fef3e50 | ||
|   | 8883008ca1 | ||
|   | 0eec89255f | ||
|   | 3d4c5d1a41 | ||
|   | 105b11fca2 | ||
|   | a259aeba27 | ||
|   | 8462f21c01 | ||
|   | 5d3a175ed6 | ||
|   | 69bec16080 | ||
|   | f7e4ee61c7 | ||
|   | 8e0bb994bb | ||
|   | 336c3127ed | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | 6209165b32 | ||
| ![autofix-ci[bot]](/assets/img/avatar_default.png)  | f3bb5c0c26 | ||
|   | 9cb09f1fb4 | ||
|   | cfeb794b34 | ||
|   | f4d4c784e4 | ||
|   | eb341bdfb6 | ||
|   | ee84ed4236 | ||
|   | f27feb268a | ||
|   | 56e9095619 | ||
|   | b3495219ae | ||
|   | 71753671e0 | ||
|   | 9746497673 | ||
|   | 882a2cc63e | ||
|   | f29f5eb207 | ||
|   | 600247df79 | ||
|   | 8fa1fed8b5 | ||
|   | 63e9194c5d | ||
|   | 06310faa32 | ||
|   | c9c821da5c | ||
|   | c2c65b4df2 | ||
|   | 9b7f5ed963 | ||
|   | 75f755b823 | ||
|   | 1cfe987fa1 | ||
|   | 4cf7c97b8f | ||
|   | 3715254a78 | ||
|   | ab44053ba4 | ||
|   | 5c6f3e66a6 | ||
|   | 5e5265c8b0 | ||
|   | 13719aa694 | ||
|   | 9d9109a68c | ||
|   | cb91c3f8a8 | ||
|   | c08fad6487 | ||
|   | 23329f1ee9 | ||
|   | e842b72aaa | ||
|   | 7c26148252 | ||
|   | 7d6a97e264 | ||
|   | 99f7d65f47 | ||
|   | db1db1ab0e | ||
|   | cec28464ec | ||
|   | a2fba0284e | ||
|   | f424a51133 | ||
|   | 46b8faddae | ||
|   | 19cce07ab5 | ||
|   | 439dcb10b2 | ||
|   | 98cb8b998e | ||
|   | 1654a4b01c | ||
|   | 8e72611922 | ||
|   | a857d3807f | ||
|   | 3dc0af3159 | ||
|   | abf7ecd2ca | ||
|   | 8d8b6c1c33 | ||
|   | 262790b22d | ||
|   | 4e8a7e0b4c | ||
|   | 121e27e850 | ||
|   | 0152ed7027 | ||
|   | f233bfd75e | ||
|   | 4298a57297 | ||
|   | 6e8ea148bc | ||
|   | 777522e8d5 | ||
|   | a4007ffb80 | ||
|   | de875c9e27 | ||
|   | 3cfcb2da41 | ||
|   | 4c3db653f5 | ||
|   | 90b7a3be63 | ||
|   | 0fbe5f2f10 | ||
|   | 36f2989249 | ||
|   | 99956b4283 | ||
|   | 9c5a8f7ef1 | ||
|   | e2f3041aa2 | ||
|   | 9926ae4e74 | ||
|   | 58463b5e80 | ||
|   | 7b51327b24 | ||
|   | 06dd350aab | ||
|   | 4f2085765d | ||
|   | eceae9b64c | ||
|   | 98754b9fc6 | ||
|   | f813870e7d | ||
|   | 763a0c0d83 | ||
|   | d30444dae7 | ||
|   | c983c0605e | ||
|   | 2fa03ea369 | ||
|   | 6c1ae90972 | ||
|   | a17e7d92d9 | ||
|   | b3a4e3f40e | ||
|   | b7acf94b41 | ||
|   | 9e5c3ec1b5 | ||
|   | 5550753193 | ||
|   | 394c6aea74 | ||
|   | 3febd7dfdf | ||
|   | ef895a3d8c | ||
|   | 8f5f7fc2a8 | ||
|   | c673cf22bd | ||
|   | 4d401c127d | ||
|   | 3c119e4a52 | ||
|   | 303a160359 | ||
|   | 3cd5244949 | ||
|   | 31b8707819 | ||
|   | a0893b8e6c | ||
|   | e1c8eb8a72 | ||
|   | bc546ef562 | ||
|   | 251b94647b | ||
|   | 4aeb2ae9a2 | ||
|   | 0f635ed344 | ||
|   | efe6affe64 | ||
|   | f140d1ab45 | ||
|   | 89e4de1dd0 | ||
|   | ac48f01e25 | ||
|   | 4c48b8cc54 | ||
|   | b807e330c8 | ||
|   | 04b15e7ece | ||
|   | 575c39e8a5 | ||
|   | 933f3f391c | ||
|   | cfb5b88ee6 | ||
|   | 9cd44eb92c | ||
|   | d0942d4897 | ||
|   | 3d789a0675 | ||
|   | 1d3f214109 | ||
|   | e51077c765 | ||
|   | 809fc1ce30 | ||
|   | f176b71c7c | ||
|   | 4d8e519298 | ||
|   | 958204e831 | ||
|   | 82c247bb11 | ||
|   | 2a56b640c0 | ||
|   | eae67a9696 | 
| @@ -1,3 +1,9 @@ | ||||
| export interface PackageOptions { | ||||
|   name: string; | ||||
|   packageName: string; | ||||
|   file: string; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Shared common options for both ESBuild and Vite | ||||
|  */ | ||||
| @@ -27,4 +33,4 @@ export const packageOptions = { | ||||
|     packageName: 'mermaid-layout-elk', | ||||
|     file: 'layouts.ts', | ||||
|   }, | ||||
| } as const; | ||||
| } as const satisfies Record<string, PackageOptions>; | ||||
|   | ||||
| @@ -19,6 +19,7 @@ const MERMAID_CONFIG_DIAGRAM_KEYS = [ | ||||
|   'xyChart', | ||||
|   'requirement', | ||||
|   'mindmap', | ||||
|   'kanban', | ||||
|   'timeline', | ||||
|   'gitGraph', | ||||
|   'c4', | ||||
| @@ -26,6 +27,7 @@ const MERMAID_CONFIG_DIAGRAM_KEYS = [ | ||||
|   'block', | ||||
|   'packet', | ||||
|   'architecture', | ||||
|   'radar', | ||||
| ] as const; | ||||
|  | ||||
| /** | ||||
|   | ||||
							
								
								
									
										5
									
								
								.changeset/add-vert-tag-bar-chart.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								.changeset/add-vert-tag-bar-chart.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| --- | ||||
| 'mermaid': minor | ||||
| --- | ||||
|  | ||||
| feat: Add Vertical Line To Gantt Plot At Specified Time | ||||
							
								
								
									
										5
									
								
								.changeset/eleven-wolves-deny.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								.changeset/eleven-wolves-deny.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| --- | ||||
| 'mermaid': patch | ||||
| --- | ||||
|  | ||||
| chore: Convert StateDB into TypeScript | ||||
							
								
								
									
										5
									
								
								.changeset/gold-shoes-camp.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								.changeset/gold-shoes-camp.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| --- | ||||
| 'mermaid': patch | ||||
| --- | ||||
|  | ||||
| fix: Remove incorrect `style="undefined;"` attributes in some Mermaid diagrams | ||||
							
								
								
									
										7
									
								
								.changeset/honest-trees-dress.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								.changeset/honest-trees-dress.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| --- | ||||
| '@mermaid-js/mermaid-zenuml': patch | ||||
| --- | ||||
|  | ||||
| chore: bump minimum ZenUML version to 3.23.28 | ||||
|  | ||||
| commit: 9d06d8f31e7f12af9e9e092214f907f2dc93ad75 | ||||
							
								
								
									
										5
									
								
								.changeset/neat-moose-compare.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								.changeset/neat-moose-compare.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| --- | ||||
| 'mermaid': minor | ||||
| --- | ||||
|  | ||||
| feat: Add support for styling Journey Diagram title (color, font-family, and font-size) | ||||
							
								
								
									
										5
									
								
								.changeset/proud-seahorses-wash.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								.changeset/proud-seahorses-wash.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| --- | ||||
| 'mermaid': patch | ||||
| --- | ||||
|  | ||||
| FontAwesome icons can now be embedded as SVGs in flowcharts if they are registered via `mermaid.registerIconPacks`. | ||||
							
								
								
									
										6
									
								
								.changeset/sad-mails-accept.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								.changeset/sad-mails-accept.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| --- | ||||
| 'mermaid': patch | ||||
| '@mermaid-js/parser': patch | ||||
| --- | ||||
|  | ||||
| Refactor grammar so that title don't break Architecture Diagrams | ||||
							
								
								
									
										5
									
								
								.changeset/sixty-deer-tell.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								.changeset/sixty-deer-tell.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| --- | ||||
| 'mermaid': major | ||||
| --- | ||||
|  | ||||
| fix: allow sequence diagram arrows with a trailing colon but no message | ||||
							
								
								
									
										5
									
								
								.changeset/soft-readers-tan.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								.changeset/soft-readers-tan.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| --- | ||||
| 'mermaid': minor | ||||
| --- | ||||
|  | ||||
| feat: Dynamically Render Data Labels Within Bar Charts | ||||
							
								
								
									
										5
									
								
								.changeset/ten-lamps-trade.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								.changeset/ten-lamps-trade.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| --- | ||||
| 'mermaid': patch | ||||
| --- | ||||
|  | ||||
| fix: allow colons in events | ||||
							
								
								
									
										7
									
								
								.changeset/yellow-mirrors-change.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								.changeset/yellow-mirrors-change.md
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| --- | ||||
| '@mermaid-js/mermaid-zenuml': patch | ||||
| --- | ||||
|  | ||||
| fix(zenuml): limit `peerDependencies` to Mermaid v10 and v11 | ||||
|  | ||||
| commit: 0ad44c12feead9d20c6a870a49327ada58d6e657 | ||||
| @@ -26,6 +26,7 @@ concat | ||||
| controlx | ||||
| controly | ||||
| CSSCLASS | ||||
| curv | ||||
| CYLINDEREND | ||||
| CYLINDERSTART | ||||
| DAGA | ||||
| @@ -52,7 +53,6 @@ frontmatter | ||||
| funs | ||||
| gantt | ||||
| GENERICTYPE | ||||
| getBoundarys | ||||
| grammr | ||||
| graphtype | ||||
| halign | ||||
|   | ||||
| @@ -28,6 +28,9 @@ dictionaryDefinitions: | ||||
|   - name: suggestions | ||||
|     words: | ||||
|       - none | ||||
|       - disp | ||||
|       - subproc | ||||
|       - tria | ||||
|     suggestWords: | ||||
|       - seperator:separator | ||||
|       - vertice:vertex | ||||
|   | ||||
| @@ -26,6 +26,8 @@ dompurify | ||||
| elkjs | ||||
| fcose | ||||
| fontawesome | ||||
| Fonticons | ||||
| Forgejo | ||||
| Foswiki | ||||
| Gitea | ||||
| graphlib | ||||
|   | ||||
| @@ -5,12 +5,14 @@ bmatrix | ||||
| braintree | ||||
| catmull | ||||
| compositTitleSize | ||||
| curv | ||||
| doublecircle | ||||
| elems | ||||
| gantt | ||||
| gitgraph | ||||
| gzipped | ||||
| handDrawn | ||||
| kanban | ||||
| knsv | ||||
| Knut | ||||
| marginx | ||||
| @@ -24,6 +26,7 @@ multigraph | ||||
| nodesep | ||||
| NOTEGROUP | ||||
| Pinterest | ||||
| procs | ||||
| rankdir | ||||
| ranksep | ||||
| rect | ||||
|   | ||||
| @@ -8,7 +8,10 @@ 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 commonOptions: MermaidBuildOptions = { | ||||
|     ...defaultOptions, | ||||
|     options: packageOptions[entryName], | ||||
|   } as const; | ||||
|   const buildConfigs: MermaidBuildOptions[] = [ | ||||
|     // package.mjs | ||||
|     { ...commonOptions }, | ||||
| @@ -31,6 +34,19 @@ const buildPackage = async (entryName: keyof typeof packageOptions) => { | ||||
|       { ...iifeOptions, minify: true, metafile: shouldVisualize } | ||||
|     ); | ||||
|   } | ||||
|   if (entryName === 'mermaid-zenuml') { | ||||
|     const iifeOptions: MermaidBuildOptions = { | ||||
|       ...commonOptions, | ||||
|       format: 'iife', | ||||
|       globalName: 'mermaid-zenuml', | ||||
|     }; | ||||
|     buildConfigs.push( | ||||
|       // mermaid-zenuml.js | ||||
|       { ...iifeOptions }, | ||||
|       // mermaid-zenuml.min.js | ||||
|       { ...iifeOptions, minify: true, metafile: shouldVisualize } | ||||
|     ); | ||||
|   } | ||||
|  | ||||
|   const results = await Promise.all(buildConfigs.map((option) => build(getBuildConfig(option)))); | ||||
|  | ||||
| @@ -40,7 +56,7 @@ const buildPackage = async (entryName: keyof typeof packageOptions) => { | ||||
|         continue; | ||||
|       } | ||||
|       const fileName = Object.keys(metafile.outputs) | ||||
|         .find((file) => !file.includes('chunks') && file.endsWith('js')) | ||||
|         .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)); | ||||
|   | ||||
| @@ -9,13 +9,18 @@ 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 }) | ||||
|   getBuildConfig({ | ||||
|     ...defaultOptions, | ||||
|     minify: false, | ||||
|     core: false, | ||||
|     options: packageOptions[packageName], | ||||
|   }) | ||||
| ); | ||||
| const mermaidIIFEConfig = getBuildConfig({ | ||||
|   ...defaultOptions, | ||||
|   minify: false, | ||||
|   core: false, | ||||
|   entryName: 'mermaid', | ||||
|   options: packageOptions.mermaid, | ||||
|   format: 'iife', | ||||
| }); | ||||
| configs.push(mermaidIIFEConfig); | ||||
|   | ||||
| @@ -3,7 +3,7 @@ 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 type { PackageOptions } from '../.build/common.js'; | ||||
| import { jisonPlugin } from './jisonPlugin.js'; | ||||
|  | ||||
| const __dirname = fileURLToPath(new URL('.', import.meta.url)); | ||||
| @@ -13,10 +13,10 @@ export interface MermaidBuildOptions extends BuildOptions { | ||||
|   core: boolean; | ||||
|   metafile: boolean; | ||||
|   format: 'esm' | 'iife'; | ||||
|   entryName: keyof typeof packageOptions; | ||||
|   options: PackageOptions; | ||||
| } | ||||
|  | ||||
| export const defaultOptions: Omit<MermaidBuildOptions, 'entryName'> = { | ||||
| export const defaultOptions: Omit<MermaidBuildOptions, 'entryName' | 'options'> = { | ||||
|   minify: false, | ||||
|   metafile: false, | ||||
|   core: false, | ||||
| @@ -52,9 +52,15 @@ const getFileName = (fileName: string, { core, format, minify }: MermaidBuildOpt | ||||
| }; | ||||
|  | ||||
| export const getBuildConfig = (options: MermaidBuildOptions): BuildOptions => { | ||||
|   const { core, entryName, metafile, format, minify } = options; | ||||
|   const { | ||||
|     core, | ||||
|     metafile, | ||||
|     format, | ||||
|     minify, | ||||
|     options: { name, file, packageName }, | ||||
|     globalName = 'mermaid', | ||||
|   } = 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}`), | ||||
| @@ -63,6 +69,7 @@ export const getBuildConfig = (options: MermaidBuildOptions): BuildOptions => { | ||||
|     }, | ||||
|     metafile, | ||||
|     minify, | ||||
|     globalName, | ||||
|     logLevel: 'info', | ||||
|     chunkNames: `chunks/${outFileName}/[name]-[hash]`, | ||||
|     define: { | ||||
| @@ -84,11 +91,12 @@ export const getBuildConfig = (options: MermaidBuildOptions): BuildOptions => { | ||||
|   if (format === 'iife') { | ||||
|     output.format = 'iife'; | ||||
|     output.splitting = false; | ||||
|     output.globalName = '__esbuild_esm_mermaid'; | ||||
|     const originalGlobalName = output.globalName ?? 'mermaid'; | ||||
|     output.globalName = `__esbuild_esm_mermaid_nm[${JSON.stringify(originalGlobalName)}]`; | ||||
|     // 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;', | ||||
|       js: `globalThis[${JSON.stringify(originalGlobalName)}] = globalThis.${output.globalName}.default;`, | ||||
|     }; | ||||
|     output.outExtension = { '.js': '.js' }; | ||||
|   } else { | ||||
|   | ||||
							
								
								
									
										2
									
								
								.github/ISSUE_TEMPLATE/config.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/ISSUE_TEMPLATE/config.yml
									
									
									
									
										vendored
									
									
								
							| @@ -4,7 +4,7 @@ contact_links: | ||||
|     url: https://github.com/mermaid-js/mermaid/discussions | ||||
|     about: Ask the Community questions or share your own graphs in our discussions. | ||||
|   - name: Discord | ||||
|     url: https://discord.gg/AgrbSrBer3 | ||||
|     url: https://discord.gg/sKeNQX4Wtj | ||||
|     about: Join our Community on Discord for Help and a casual chat. | ||||
|   - name: Documentation | ||||
|     url: https://mermaid.js.org | ||||
|   | ||||
							
								
								
									
										2
									
								
								.github/ISSUE_TEMPLATE/theme_proposal.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/ISSUE_TEMPLATE/theme_proposal.yml
									
									
									
									
										vendored
									
									
								
							| @@ -29,7 +29,7 @@ body: | ||||
|       label: Colors | ||||
|       description: |- | ||||
|         A detailed list of the different colour values to use. | ||||
|         A list of currently used variable names can be found [here](https://mermaid-js.github.io/mermaid/#/theming?id=theme-variables-reference-table) | ||||
|         See the [list of currently used variable names](https://mermaid-js.github.io/mermaid/#/theming?id=theme-variables-reference-table) | ||||
|       placeholder: |- | ||||
|         - background: #f4f4f4 | ||||
|         - primaryColor: #fff4dd | ||||
|   | ||||
							
								
								
									
										10
									
								
								.github/lychee.toml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								.github/lychee.toml
									
									
									
									
										vendored
									
									
								
							| @@ -44,7 +44,15 @@ exclude = [ | ||||
| "https://chromewebstore.google.com", | ||||
|  | ||||
| # Drupal 403 | ||||
| "https://(www.)?drupal.org" | ||||
| "https://(www.)?drupal.org", | ||||
|  | ||||
| # Swimm returns 404, even though the link is valid | ||||
| "https://docs.swimm.io", | ||||
|  | ||||
| # Timeout | ||||
| "https://huehive.co", | ||||
| "https://foswiki.org", | ||||
| "https://www.gnu.org", | ||||
| ] | ||||
|  | ||||
| # Exclude all private IPs from checking. | ||||
|   | ||||
							
								
								
									
										2
									
								
								.github/stale.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/stale.yml
									
									
									
									
										vendored
									
									
								
							| @@ -15,5 +15,5 @@ markComment: > | ||||
|   If you are still interested in this issue and it is still relevant you can comment to revive it. | ||||
| # Comment to post when closing a stale issue. Set to `false` to disable | ||||
| closeComment: > | ||||
|   This issue has been been automatically closed due to a lack of activity.  | ||||
|   This issue has been automatically closed due to a lack of activity.  | ||||
|   This is done to maintain a clean list of issues that the community is interested in developing. | ||||
|   | ||||
							
								
								
									
										8
									
								
								.github/workflows/autofix.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.github/workflows/autofix.yml
									
									
									
									
										vendored
									
									
								
							| @@ -13,13 +13,13 @@ jobs: | ||||
|   autofix: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 | ||||
|       - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | ||||
|  | ||||
|       - uses: pnpm/action-setup@fe02b34f77f8bc703788d5817da081398fad5dd2 # v4.0.0 | ||||
|       - uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 | ||||
|         # uses version from "packageManager" field in package.json | ||||
|  | ||||
|       - name: Setup Node.js | ||||
|         uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 | ||||
|         uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 | ||||
|         with: | ||||
|           cache: pnpm | ||||
|           node-version-file: '.node-version' | ||||
| @@ -42,4 +42,4 @@ jobs: | ||||
|         working-directory: ./packages/mermaid | ||||
|         run: pnpm run docs:build | ||||
|  | ||||
|       - uses: autofix-ci/action@ff86a557419858bb967097bfc916833f5647fa8c # main | ||||
|       - uses: autofix-ci/action@551dded8c6cc8a1054039c8bc0b8b48c51dfc6ef # main | ||||
|   | ||||
							
								
								
									
										6
									
								
								.github/workflows/build-docs.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.github/workflows/build-docs.yml
									
									
									
									
										vendored
									
									
								
							| @@ -18,12 +18,12 @@ jobs: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - name: Checkout | ||||
|         uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 | ||||
|         uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | ||||
|  | ||||
|       - uses: pnpm/action-setup@fe02b34f77f8bc703788d5817da081398fad5dd2 # v4.0.0 | ||||
|       - uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 | ||||
|  | ||||
|       - name: Setup Node.js | ||||
|         uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 | ||||
|         uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 | ||||
|         with: | ||||
|           cache: pnpm | ||||
|           node-version-file: '.node-version' | ||||
|   | ||||
							
								
								
									
										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 | ||||
|     steps: | ||||
|       - name: Checkout repository | ||||
|         uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 | ||||
|         uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | ||||
|  | ||||
|       - name: Check for difference in README.md and docs/README.md | ||||
|         run: | | ||||
|   | ||||
							
								
								
									
										8
									
								
								.github/workflows/codeql.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.github/workflows/codeql.yml
									
									
									
									
										vendored
									
									
								
							| @@ -32,11 +32,11 @@ jobs: | ||||
|  | ||||
|     steps: | ||||
|       - name: Checkout repository | ||||
|         uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 | ||||
|         uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | ||||
|  | ||||
|       # Initializes the CodeQL tools for scanning. | ||||
|       - name: Initialize CodeQL | ||||
|         uses: github/codeql-action/init@2c779ab0d087cd7fe7b826087247c2c81f27bfa6 # v3.26.5 | ||||
|         uses: github/codeql-action/init@b56ba49b26e50535fa1e7f7db0f4f7b4bf65d80d # v3.28.10 | ||||
|         with: | ||||
|           config-file: ./.github/codeql/codeql-config.yml | ||||
|           languages: ${{ matrix.language }} | ||||
| @@ -48,7 +48,7 @@ jobs: | ||||
|       # 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) | ||||
|       - name: Autobuild | ||||
|         uses: github/codeql-action/autobuild@2c779ab0d087cd7fe7b826087247c2c81f27bfa6 # v3.26.5 | ||||
|         uses: github/codeql-action/autobuild@b56ba49b26e50535fa1e7f7db0f4f7b4bf65d80d # v3.28.10 | ||||
|  | ||||
|       # ℹ️ 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 | ||||
| @@ -62,4 +62,4 @@ jobs: | ||||
|       #   make release | ||||
|  | ||||
|       - name: Perform CodeQL Analysis | ||||
|         uses: github/codeql-action/analyze@2c779ab0d087cd7fe7b826087247c2c81f27bfa6 # v3.26.5 | ||||
|         uses: github/codeql-action/analyze@b56ba49b26e50535fa1e7f7db0f4f7b4bf65d80d # v3.28.10 | ||||
|   | ||||
							
								
								
									
										4
									
								
								.github/workflows/dependency-review.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/workflows/dependency-review.yml
									
									
									
									
										vendored
									
									
								
							| @@ -15,6 +15,6 @@ jobs: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - name: 'Checkout Repository' | ||||
|         uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 | ||||
|         uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | ||||
|       - name: 'Dependency Review' | ||||
|         uses: actions/dependency-review-action@5a2ce3f5b92ee19cbb1541a4984c76d921601d7c # v4.3.4 | ||||
|         uses: actions/dependency-review-action@3b139cfc5fae8b618d3eae3675e383bb1769c019 # v4.5.0 | ||||
|   | ||||
							
								
								
									
										12
									
								
								.github/workflows/e2e-applitools.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								.github/workflows/e2e-applitools.yml
									
									
									
									
										vendored
									
									
								
							| @@ -32,29 +32,31 @@ jobs: | ||||
|         run: | | ||||
|           echo "::error,title=Not using Applitools::APPLITOOLS_API_KEY is empty, disabling Applitools for this run." | ||||
|  | ||||
|       - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 | ||||
|       - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | ||||
|  | ||||
|       - uses: pnpm/action-setup@fe02b34f77f8bc703788d5817da081398fad5dd2 # v4.0.0 | ||||
|       - uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 | ||||
|         # uses version from "packageManager" field in package.json | ||||
|  | ||||
|       - name: Setup Node.js | ||||
|         uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 | ||||
|         uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 | ||||
|         with: | ||||
|           node-version-file: '.node-version' | ||||
|  | ||||
|       - if: ${{ env.USE_APPLI }} | ||||
|         name: Notify applitools of new batch | ||||
|         # Copied from docs https://applitools.com/docs/topics/integrations/github-integration-ci-setup.html | ||||
|         run: curl -L -d '' -X POST "$APPLITOOLS_SERVER_URL/api/externals/github/push?apiKey=$APPLITOOLS_API_KEY&CommitSha=$GITHUB_SHA&BranchName=${APPLITOOLS_BRANCH}$&ParentBranchName=$APPLITOOLS_PARENT_BRANCH" | ||||
|         env: | ||||
|           # e.g. mermaid-js/mermaid/my-branch | ||||
|           APPLITOOLS_BRANCH: ${{ github.repository }}/${{ github.ref_name }} | ||||
|           APPLITOOLS_PARENT_BRANCH: ${{ github.event.inputs.parent_branch }} | ||||
|           APPLITOOLS_API_KEY: ${{ secrets.APPLITOOLS_API_KEY }} | ||||
|           APPLITOOLS_SERVER_URL: 'https://eyesapi.applitools.com' | ||||
|         uses: wei/curl@012398a392d02480afa2720780031f8621d5f94c | ||||
|         with: | ||||
|           args: -X POST "$APPLITOOLS_SERVER_URL/api/externals/github/push?apiKey=$APPLITOOLS_API_KEY&CommitSha=$GITHUB_SHA&BranchName=${APPLITOOLS_BRANCH}$&ParentBranchName=$APPLITOOLS_PARENT_BRANCH" | ||||
|  | ||||
|       - name: Cypress run | ||||
|         uses: cypress-io/github-action@d79d2d530a66e641eb4a5f227e13bc985c60b964 # v4.2.2 | ||||
|         uses: cypress-io/github-action@18a6541367f4580a515371905f499a27a44e8dbe # v6.7.12 | ||||
|         id: cypress | ||||
|         with: | ||||
|           start: pnpm run dev | ||||
|   | ||||
							
								
								
									
										70
									
								
								.github/workflows/e2e-timings.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								.github/workflows/e2e-timings.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,70 @@ | ||||
| name: E2E - Generate Timings | ||||
|  | ||||
| on: | ||||
|   # run this workflow every night at 3am | ||||
|   schedule: | ||||
|     - cron: '28 3 * * *' | ||||
|   # or when the user triggers it from GitHub Actions page | ||||
|   workflow_dispatch: | ||||
|  | ||||
| concurrency: ${{ github.workflow }}-${{ github.ref }} | ||||
|  | ||||
| permissions: | ||||
|   contents: write | ||||
|   pull-requests: write | ||||
|  | ||||
| jobs: | ||||
|   timings: | ||||
|     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@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | ||||
|       - uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 | ||||
|       - name: Setup Node.js | ||||
|         uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 | ||||
|         with: | ||||
|           node-version-file: '.node-version' | ||||
|       - name: Install dependencies | ||||
|         uses: cypress-io/github-action@18a6541367f4580a515371905f499a27a44e8dbe # v6.7.12 | ||||
|         with: | ||||
|           runTests: false | ||||
|  | ||||
|       - name: Cypress run | ||||
|         uses: cypress-io/github-action@18a6541367f4580a515371905f499a27a44e8dbe # v6.7.12 | ||||
|         id: cypress | ||||
|         with: | ||||
|           install: false | ||||
|           start: pnpm run dev:coverage | ||||
|           wait-on: 'http://localhost:9000' | ||||
|           browser: chrome | ||||
|           publish-summary: false | ||||
|         env: | ||||
|           VITEST_COVERAGE: true | ||||
|           CYPRESS_COMMIT: ${{ github.sha }} | ||||
|           SPLIT: 1 | ||||
|           SPLIT_INDEX: 0 | ||||
|           SPLIT_FILE: 'cypress/timings.json' | ||||
|  | ||||
|       - name: Compare timings | ||||
|         id: compare | ||||
|         run: | | ||||
|           OUTPUT=$(pnpm tsx scripts/compare-timings.ts) | ||||
|           echo "$OUTPUT" >> $GITHUB_STEP_SUMMARY | ||||
|  | ||||
|           echo "output<<EOF" >> $GITHUB_OUTPUT | ||||
|           echo "$OUTPUT" >> $GITHUB_OUTPUT | ||||
|           echo "EOF" >> $GITHUB_OUTPUT | ||||
|  | ||||
|       - name: Commit and create pull request | ||||
|         uses: peter-evans/create-pull-request@3b1f4bffdc97d7b055dd96732d7348e585ad2c4e | ||||
|         with: | ||||
|           add-paths: | | ||||
|             cypress/timings.json | ||||
|           commit-message: 'chore: update E2E timings' | ||||
|           branch: update-timings | ||||
|           title: Update E2E Timings | ||||
|           body: ${{ steps.compare.outputs.output }} | ||||
|           delete-branch: true | ||||
|           sign-commits: true | ||||
							
								
								
									
										52
									
								
								.github/workflows/e2e.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										52
									
								
								.github/workflows/e2e.yml
									
									
									
									
										vendored
									
									
								
							| @@ -28,7 +28,8 @@ env: | ||||
|       ) ||  | ||||
|       github.event.before | ||||
|     }} | ||||
|   shouldRunParallel: ${{ secrets.CYPRESS_RECORD_KEY != '' && !(github.event_name == 'push' && github.ref == 'refs/heads/develop') }} | ||||
|   RUN_VISUAL_TEST: >- | ||||
|     ${{ github.repository == 'mermaid-js/mermaid' && (github.event_name != 'pull_request' || !startsWith(github.head_ref, 'renovate/')) }} | ||||
| jobs: | ||||
|   cache: | ||||
|     runs-on: ubuntu-latest | ||||
| @@ -36,30 +37,29 @@ jobs: | ||||
|       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@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 | ||||
|       - uses: pnpm/action-setup@fe02b34f77f8bc703788d5817da081398fad5dd2 # v4.0.0 | ||||
|       - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | ||||
|       - uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 | ||||
|       - name: Setup Node.js | ||||
|         uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 | ||||
|         uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 | ||||
|         with: | ||||
|           node-version-file: '.node-version' | ||||
|       - name: Cache snapshots | ||||
|         id: cache-snapshot | ||||
|         uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 | ||||
|         uses: actions/cache@0c907a75c2c80ebcb7f088228285e798b750cf8f # v4.2.1 | ||||
|         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@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 | ||||
|         uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | ||||
|         with: | ||||
|           ref: ${{ env.targetHash }} | ||||
|  | ||||
|       - name: Install dependencies | ||||
|         if: ${{ steps.cache-snapshot.outputs.cache-hit != 'true' }} | ||||
|         uses: cypress-io/github-action@df7484c5ba85def7eef30db301afa688187bc378 # v6.7.2 | ||||
|         uses: cypress-io/github-action@18a6541367f4580a515371905f499a27a44e8dbe # v6.7.12 | ||||
|         with: | ||||
|           # just perform install | ||||
|           runTests: false | ||||
| @@ -80,28 +80,28 @@ jobs: | ||||
|     strategy: | ||||
|       fail-fast: false | ||||
|       matrix: | ||||
|         containers: [1, 2, 3, 4] | ||||
|         containers: [1, 2, 3, 4, 5] | ||||
|     steps: | ||||
|       - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 | ||||
|       - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | ||||
|  | ||||
|       - uses: pnpm/action-setup@fe02b34f77f8bc703788d5817da081398fad5dd2 # v4.0.0 | ||||
|       - uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 | ||||
|         # uses version from "packageManager" field in package.json | ||||
|  | ||||
|       - name: Setup Node.js | ||||
|         uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 | ||||
|         uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 | ||||
|         with: | ||||
|           node-version-file: '.node-version' | ||||
|  | ||||
|       # These cached snapshots are downloaded, providing the reference snapshots. | ||||
|       - name: Cache snapshots | ||||
|         id: cache-snapshot | ||||
|         uses: actions/cache/restore@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 | ||||
|         uses: actions/cache/restore@0c907a75c2c80ebcb7f088228285e798b750cf8f # v4.2.1 | ||||
|         with: | ||||
|           path: ./cypress/snapshots | ||||
|           key: ${{ runner.os }}-snapshots-${{ env.targetHash }} | ||||
|  | ||||
|       - name: Install dependencies | ||||
|         uses: cypress-io/github-action@df7484c5ba85def7eef30db301afa688187bc378 # v6.7.2 | ||||
|         uses: cypress-io/github-action@18a6541367f4580a515371905f499a27a44e8dbe # v6.7.12 | ||||
|         with: | ||||
|           runTests: false | ||||
|  | ||||
| @@ -117,11 +117,8 @@ jobs: | ||||
|       # Install NPM dependencies, cache them correctly | ||||
|       # and run all Cypress tests | ||||
|       - name: Cypress run | ||||
|         uses: cypress-io/github-action@df7484c5ba85def7eef30db301afa688187bc378 # v6.7.2 | ||||
|         uses: cypress-io/github-action@18a6541367f4580a515371905f499a27a44e8dbe # v6.7.12 | ||||
|         id: cypress | ||||
|         # 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 | ||||
|         if: ${{ env.shouldRunParallel == 'true' || ( matrix.containers == 1 ) }} | ||||
|         with: | ||||
|           install: false | ||||
|           start: pnpm run dev:coverage | ||||
| @@ -129,19 +126,20 @@ jobs: | ||||
|           browser: chrome | ||||
|           # Disable recording if we don't have an API key | ||||
|           # e.g. if this action was run from a fork | ||||
|           record: ${{ env.shouldRunParallel == 'true' }} | ||||
|           parallel: ${{ env.shouldRunParallel == 'true' }} | ||||
|           record: ${{ env.RUN_VISUAL_TEST == 'true' && secrets.CYPRESS_RECORD_KEY != '' }} | ||||
|         env: | ||||
|           CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }} | ||||
|           VITEST_COVERAGE: true | ||||
|           ARGOS_PARALLEL: ${{ env.RUN_VISUAL_TEST == 'true' }} | ||||
|           ARGOS_PARALLEL_TOTAL: ${{ env.RUN_VISUAL_TEST == 'true' && strategy.job-total || 1 }} | ||||
|           ARGOS_PARALLEL_INDEX: ${{ env.RUN_VISUAL_TEST == 'true' && matrix.containers || 1 }} | ||||
|           CYPRESS_COMMIT: ${{ github.sha }} | ||||
|           ARGOS_TOKEN: ${{ secrets.ARGOS_TOKEN }} | ||||
|           ARGOS_PARALLEL: ${{ env.shouldRunParallel == 'true' }} | ||||
|           ARGOS_PARALLEL_TOTAL: 4 | ||||
|           ARGOS_PARALLEL_INDEX: ${{ matrix.containers }} | ||||
|           CYPRESS_RECORD_KEY: ${{ env.RUN_VISUAL_TEST == 'true' && secrets.CYPRESS_RECORD_KEY || ''}} | ||||
|           SPLIT: ${{ strategy.job-total }} | ||||
|           SPLIT_INDEX: ${{ strategy.job-index }} | ||||
|           SPLIT_FILE: 'cypress/timings.json' | ||||
|           VITEST_COVERAGE: true | ||||
|  | ||||
|       - name: Upload Coverage to Codecov | ||||
|         uses: codecov/codecov-action@e28ff129e5465c2c0dcc6f003fc735cb6ae0c673 # v4.5.0 | ||||
|         uses: codecov/codecov-action@13ce06bfc6bbe3ecf90edbbf1bc32fe5978ca1d3 # v5.3.1 | ||||
|         # Run step only pushes to develop and pull_requests | ||||
|         if: ${{ steps.cypress.conclusion == 'success' && (github.event_name == 'pull_request' || github.ref == 'refs/heads/develop')}} | ||||
|         with: | ||||
|   | ||||
							
								
								
									
										6
									
								
								.github/workflows/link-checker.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.github/workflows/link-checker.yml
									
									
									
									
										vendored
									
									
								
							| @@ -29,17 +29,17 @@ jobs: | ||||
|       # lychee only uses the GITHUB_TOKEN to avoid rate-limiting | ||||
|       contents: read | ||||
|     steps: | ||||
|       - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 | ||||
|       - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | ||||
|  | ||||
|       - name: Restore lychee cache | ||||
|         uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 | ||||
|         uses: actions/cache@0c907a75c2c80ebcb7f088228285e798b750cf8f # v4.2.1 | ||||
|         with: | ||||
|           path: .lycheecache | ||||
|           key: cache-lychee-${{ github.sha }} | ||||
|           restore-keys: cache-lychee- | ||||
|  | ||||
|       - name: Link Checker | ||||
|         uses: lycheeverse/lychee-action@c053181aa0c3d17606addfe97a9075a32723548a # v1.9.3 | ||||
|         uses: lycheeverse/lychee-action@f613c4a64e50d792e0b31ec34bbcbba12263c6a6 # v2.3.0 | ||||
|         with: | ||||
|           args: >- | ||||
|             --config .github/lychee.toml | ||||
|   | ||||
							
								
								
									
										8
									
								
								.github/workflows/lint.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.github/workflows/lint.yml
									
									
									
									
										vendored
									
									
								
							| @@ -15,7 +15,7 @@ jobs: | ||||
|   docker-lint: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 | ||||
|       - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | ||||
|  | ||||
|       - uses: hadolint/hadolint-action@54c9adbab1582c2ef04b2016b760714a4bfde3cf # v3.1.0 | ||||
|         with: | ||||
| @@ -23,13 +23,13 @@ jobs: | ||||
|   lint: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 | ||||
|       - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | ||||
|  | ||||
|       - uses: pnpm/action-setup@fe02b34f77f8bc703788d5817da081398fad5dd2 # v4.0.0 | ||||
|       - uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 | ||||
|         # uses version from "packageManager" field in package.json | ||||
|  | ||||
|       - name: Setup Node.js | ||||
|         uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 | ||||
|         uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 | ||||
|         with: | ||||
|           cache: pnpm | ||||
|           node-version-file: '.node-version' | ||||
|   | ||||
							
								
								
									
										2
									
								
								.github/workflows/pr-labeler.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/pr-labeler.yml
									
									
									
									
										vendored
									
									
								
							| @@ -22,7 +22,7 @@ jobs: | ||||
|       pull-requests: write # write permission is required to label PRs | ||||
|     steps: | ||||
|       - name: Label PR | ||||
|         uses: release-drafter/release-drafter@3f0f87098bd6b5c5b9a36d49c41d998ea58f9348 # v6.0.0 | ||||
|         uses: release-drafter/release-drafter@b1476f6e6eb133afa41ed8589daba6dc69b4d3f5 # v6.1.0 | ||||
|         with: | ||||
|           config-name: pr-labeler.yml | ||||
|           disable-autolabeler: false | ||||
|   | ||||
							
								
								
									
										8
									
								
								.github/workflows/publish-docs.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.github/workflows/publish-docs.yml
									
									
									
									
										vendored
									
									
								
							| @@ -23,12 +23,12 @@ jobs: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - name: Checkout | ||||
|         uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 | ||||
|         uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | ||||
|  | ||||
|       - uses: pnpm/action-setup@fe02b34f77f8bc703788d5817da081398fad5dd2 # v4.0.0 | ||||
|       - uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 | ||||
|  | ||||
|       - name: Setup Node.js | ||||
|         uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 | ||||
|         uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 | ||||
|         with: | ||||
|           cache: pnpm | ||||
|           node-version-file: '.node-version' | ||||
| @@ -37,7 +37,7 @@ jobs: | ||||
|         run: pnpm install --frozen-lockfile | ||||
|  | ||||
|       - name: Setup Pages | ||||
|         uses: actions/configure-pages@1f0c5cde4bc74cd7e1254d0cb4de8d49e9068c7d # v4.0.0 | ||||
|         uses: actions/configure-pages@983d7736d9b0ae728b81ab479565c72886d7745b # v5.0.0 | ||||
|  | ||||
|       - name: Run Build | ||||
|         run: pnpm --filter mermaid run docs:build:vitepress | ||||
|   | ||||
| @@ -9,14 +9,14 @@ jobs: | ||||
|   publish-preview: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 | ||||
|       - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | ||||
|         with: | ||||
|           fetch-depth: 0 | ||||
|  | ||||
|       - uses: pnpm/action-setup@fe02b34f77f8bc703788d5817da081398fad5dd2 # v4.0.0 | ||||
|       - uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 | ||||
|  | ||||
|       - name: Setup Node.js | ||||
|         uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 | ||||
|         uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 | ||||
|         with: | ||||
|           cache: pnpm | ||||
|           node-version-file: '.node-version' | ||||
|   | ||||
							
								
								
									
										7
									
								
								.github/workflows/release-preview.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								.github/workflows/release-preview.yml
									
									
									
									
										vendored
									
									
								
							| @@ -3,6 +3,7 @@ name: Preview release | ||||
| on: | ||||
|   pull_request: | ||||
|     branches: [develop] | ||||
|     types: [opened, synchronize, labeled, ready_for_review] | ||||
|  | ||||
| concurrency: | ||||
|   group: ${{ github.workflow }}-${{ github.event.number }} | ||||
| @@ -25,12 +26,12 @@ jobs: | ||||
|     timeout-minutes: 5 | ||||
|     steps: | ||||
|       - name: Checkout Repo | ||||
|         uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0 | ||||
|         uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | ||||
|  | ||||
|       - uses: pnpm/action-setup@fe02b34f77f8bc703788d5817da081398fad5dd2 # v4.0.0 | ||||
|       - uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 | ||||
|  | ||||
|       - name: Setup Node.js | ||||
|         uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 | ||||
|         uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 | ||||
|         with: | ||||
|           cache: pnpm | ||||
|           node-version-file: '.node-version' | ||||
|   | ||||
							
								
								
									
										8
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.github/workflows/release.yml
									
									
									
									
										vendored
									
									
								
							| @@ -21,12 +21,12 @@ jobs: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - name: Checkout Repo | ||||
|         uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0 | ||||
|         uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | ||||
|  | ||||
|       - uses: pnpm/action-setup@fe02b34f77f8bc703788d5817da081398fad5dd2 # v4.0.0 | ||||
|       - uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 | ||||
|  | ||||
|       - name: Setup Node.js | ||||
|         uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 | ||||
|         uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 | ||||
|         with: | ||||
|           cache: pnpm | ||||
|           node-version-file: '.node-version' | ||||
| @@ -36,7 +36,7 @@ jobs: | ||||
|  | ||||
|       - name: Create Release Pull Request or Publish to npm | ||||
|         id: changesets | ||||
|         uses: changesets/action@aba318e9165b45b7948c60273e0b72fce0a64eb9 # v1.4.7 | ||||
|         uses: changesets/action@c8bada60c408975afd1a20b3db81d6eee6789308 # v1.4.9 | ||||
|         with: | ||||
|           version: pnpm changeset:version | ||||
|           publish: pnpm changeset:publish | ||||
|   | ||||
							
								
								
									
										8
									
								
								.github/workflows/scorecard.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.github/workflows/scorecard.yml
									
									
									
									
										vendored
									
									
								
							| @@ -16,22 +16,22 @@ jobs: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - name: Checkout code | ||||
|         uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 | ||||
|         uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | ||||
|         with: | ||||
|           persist-credentials: false | ||||
|       - name: Run analysis | ||||
|         uses: ossf/scorecard-action@0864cf19026789058feabb7e87baa5f140aac736 # v2.3.1 | ||||
|         uses: ossf/scorecard-action@f49aabe0b5af0936a0987cfb85d86b75731b0186 # v2.4.1 | ||||
|         with: | ||||
|           results_file: results.sarif | ||||
|           results_format: sarif | ||||
|           publish_results: true | ||||
|       - name: Upload artifact | ||||
|         uses: actions/upload-artifact@97a0fba1372883ab732affbe8f94b823f91727db # v3.pre.node20 | ||||
|         uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # v4.6.1 | ||||
|         with: | ||||
|           name: SARIF file | ||||
|           path: results.sarif | ||||
|           retention-days: 5 | ||||
|       - name: Upload to code-scanning | ||||
|         uses: github/codeql-action/upload-sarif@f0f3afee809481da311ca3a6ff1ff51d81dbeb24 # v3.26.4 | ||||
|         uses: github/codeql-action/upload-sarif@b56ba49b26e50535fa1e7f7db0f4f7b4bf65d80d # v3.28.10 | ||||
|         with: | ||||
|           sarif_file: results.sarif | ||||
|   | ||||
							
								
								
									
										8
									
								
								.github/workflows/test.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.github/workflows/test.yml
									
									
									
									
										vendored
									
									
								
							| @@ -9,13 +9,13 @@ jobs: | ||||
|   unit-test: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 | ||||
|       - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | ||||
|  | ||||
|       - uses: pnpm/action-setup@fe02b34f77f8bc703788d5817da081398fad5dd2 # v4.0.0 | ||||
|       - uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 | ||||
|         # uses version from "packageManager" field in package.json | ||||
|  | ||||
|       - name: Setup Node.js | ||||
|         uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 | ||||
|         uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 | ||||
|         with: | ||||
|           cache: pnpm | ||||
|           node-version-file: '.node-version' | ||||
| @@ -43,7 +43,7 @@ jobs: | ||||
|           pnpm test:check:tsc | ||||
|  | ||||
|       - name: Upload Coverage to Codecov | ||||
|         uses: codecov/codecov-action@e28ff129e5465c2c0dcc6f003fc735cb6ae0c673 # v4.5.0 | ||||
|         uses: codecov/codecov-action@13ce06bfc6bbe3ecf90edbbf1bc32fe5978ca1d3 # v5.3.1 | ||||
|         # Run step only pushes to develop and pull_requests | ||||
|         if: ${{ github.event_name == 'pull_request' || github.ref == 'refs/heads/develop' }} | ||||
|         with: | ||||
|   | ||||
							
								
								
									
										6
									
								
								.github/workflows/update-browserlist.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.github/workflows/update-browserlist.yml
									
									
									
									
										vendored
									
									
								
							| @@ -8,8 +8,8 @@ jobs: | ||||
|   update-browser-list: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 | ||||
|       - uses: pnpm/action-setup@fe02b34f77f8bc703788d5817da081398fad5dd2 # v4.0.0 | ||||
|       - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 | ||||
|       - uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0 | ||||
|       - run: npx update-browserslist-db@latest | ||||
|       - name: Commit changes | ||||
|         uses: EndBug/add-and-commit@a94899bca583c204427a224a7af87c02f9b325d5 # v9.1.4 | ||||
| @@ -19,7 +19,7 @@ jobs: | ||||
|           message: 'chore: update browsers list' | ||||
|           push: false | ||||
|       - name: Create Pull Request | ||||
|         uses: peter-evans/create-pull-request@c5a7806660adbe173f04e3e038b0ccdcd758773c # v6.1.0 | ||||
|         uses: peter-evans/create-pull-request@67ccf781d68cd99b580ae25a5c18a1cc84ffff1f # v7.0.6 | ||||
|         with: | ||||
|           branch: update-browserslist | ||||
|           title: Update Browserslist | ||||
|   | ||||
| @@ -1 +1 @@ | ||||
| 20.12.2 | ||||
| 22.14.0 | ||||
|   | ||||
| @@ -256,7 +256,7 @@ mermaid.run({ | ||||
| - Problem showing graph with php on localhost [\#502](https://github.com/knsv/mermaid/issues/502) | ||||
| - logLevel's option doesnt work at 7.0.0 [\#501](https://github.com/knsv/mermaid/issues/501) | ||||
| - How do I get the log for a render or parse attempt? [\#500](https://github.com/knsv/mermaid/issues/500) | ||||
| - Mermaid neutral style style to built in latest release [\#499](https://github.com/knsv/mermaid/issues/499) | ||||
| - Mermaid neutral style to built in latest release [\#499](https://github.com/knsv/mermaid/issues/499) | ||||
| - Any plans for adding a typescript definition file? [\#495](https://github.com/knsv/mermaid/issues/495) | ||||
| - Gantt diagrams too narrow [\#493](https://github.com/knsv/mermaid/issues/493) | ||||
| - Flowchart edge labels placement [\#490](https://github.com/knsv/mermaid/issues/490) | ||||
| @@ -833,7 +833,7 @@ mermaid.run({ | ||||
| - Merge pull request \#1 from knsv/master [\#96](https://github.com/knsv/mermaid/pull/96) ([gkchic](https://github.com/gkchic)) | ||||
| - Removed duplicated section in flowchart docs [\#94](https://github.com/knsv/mermaid/pull/94) ([kaime](https://github.com/kaime)) | ||||
| - Grammar changes to sequence page [\#93](https://github.com/knsv/mermaid/pull/93) ([gkchic](https://github.com/gkchic)) | ||||
| - Github buttons [\#89](https://github.com/knsv/mermaid/pull/89) ([gkchic](https://github.com/gkchic)) | ||||
| - GitHub buttons [\#89](https://github.com/knsv/mermaid/pull/89) ([gkchic](https://github.com/gkchic)) | ||||
| - Template change [\#88](https://github.com/knsv/mermaid/pull/88) ([gkchic](https://github.com/gkchic)) | ||||
|  | ||||
| ## [0.3.1](https://github.com/knsv/mermaid/tree/0.3.1) (2015-01-05) | ||||
| @@ -1002,4 +1002,4 @@ mermaid.run({ | ||||
|  | ||||
| ## [0.1.0](https://github.com/knsv/mermaid/tree/0.1.0) (2014-11-16) | ||||
|  | ||||
| \* _This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)_ | ||||
| \* _This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/GitHub-Changelog-Generator)_ | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| FROM node:20.12.2-alpine3.19@sha256:7a91aa397f2e2dfbfcdad2e2d72599f374e0b0172be1d86eeb73f1d33f36a4b2 | ||||
| FROM node:22.12.0-alpine3.19@sha256:40dc4b415c17b85bea9be05314b4a753f45a4e1716bb31c01182e6c53d51a654 | ||||
|  | ||||
| USER 0:0 | ||||
|  | ||||
|   | ||||
							
								
								
									
										42
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										42
									
								
								README.md
									
									
									
									
									
								
							| @@ -15,7 +15,7 @@ Generate diagrams from markdown-like text. | ||||
| <a href="https://mermaid.live/"><b>Live Editor!</b></a> | ||||
| </p> | ||||
| <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://discord.gg/AgrbSrBer3" title="Discord 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/sKeNQX4Wtj" title="Discord invite">🙌 Join Us</a> | ||||
| </p> | ||||
| <p align="center"> | ||||
| <a href="./README.zh-CN.md">简体中文</a> | ||||
| @@ -33,7 +33,7 @@ Try Live Editor previews of future releases: <a href="https://develop.git.mermai | ||||
| [](https://app.codecov.io/github/mermaid-js/mermaid/tree/develop) | ||||
| [](https://www.jsdelivr.com/package/npm/mermaid) | ||||
| [](https://www.npmjs.com/package/mermaid) | ||||
| [](https://discord.gg/AgrbSrBer3) | ||||
| [](https://discord.gg/sKeNQX4Wtj) | ||||
| [](https://twitter.com/mermaidjs_) | ||||
| [](https://argos-ci.com?utm_source=mermaid&utm_campaign=oss) | ||||
| [](https://securityscorecards.dev/viewer/?uri=github.com/mermaid-js/mermaid) | ||||
| @@ -44,7 +44,7 @@ Try Live Editor previews of future releases: <a href="https://develop.git.mermai | ||||
|  | ||||
| **Thanks to all involved, people committing pull requests, people answering questions! 🙏** | ||||
|  | ||||
| <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> | ||||
| <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='Banner for "The Official Guide to Mermaid.js" book'></a> | ||||
|  | ||||
| ## Table of content | ||||
|  | ||||
| @@ -95,6 +95,10 @@ In our release process we rely heavily on visual regression tests using [applito | ||||
|  | ||||
| <!-- </Main description> --> | ||||
|  | ||||
| ## Mermaid AI Bot | ||||
|  | ||||
| [Mermaid](https://codeparrot.ai/oracle?owner=mermaid-js&repo=mermaid) Bot will help you understand this repository better. You can ask for code examples, installation guide, debugging help and much more. | ||||
|  | ||||
| ## 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.org/intro/syntax-reference.html).** | ||||
| @@ -253,6 +257,34 @@ 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>] | ||||
|  | ||||
| ``` | ||||
| gitGraph | ||||
|   commit | ||||
|   commit | ||||
|   branch develop | ||||
|   checkout develop | ||||
|   commit | ||||
|   commit | ||||
|   checkout main | ||||
|   merge develop | ||||
|   commit | ||||
|   commit | ||||
| ``` | ||||
|  | ||||
| ```mermaid | ||||
| gitGraph | ||||
|   commit | ||||
|   commit | ||||
|   branch develop | ||||
|   checkout develop | ||||
|   commit | ||||
|   commit | ||||
|   checkout main | ||||
|   merge develop | ||||
|   commit | ||||
|   commit | ||||
| ``` | ||||
|  | ||||
| ### 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>] | ||||
|  | ||||
| ``` | ||||
| @@ -419,7 +451,7 @@ For public sites, it can be precarious to retrieve text from users on the intern | ||||
|  | ||||
| As an extra level of security for sites with external users we are happy to introduce a new security level in which the diagram is rendered in a sandboxed iframe preventing javascript in the code from being executed. This is a great step forward for better security. | ||||
|  | ||||
| _Unfortunately you can not have a cake and eat it at the same time which in this case means that some of the interactive functionality gets blocked along with the possible malicious code._ | ||||
| _Unfortunately you cannot have a cake and eat it at the same time which in this case means that some of the interactive functionality gets blocked along with the possible malicious code._ | ||||
|  | ||||
| ## Reporting vulnerabilities | ||||
|  | ||||
| @@ -435,7 +467,7 @@ A quick note from Knut Sveidqvist: | ||||
| > | ||||
| > _Thank you to [Tyler Long](https://github.com/tylerlong) who has been a collaborator since April 2017._ | ||||
| > | ||||
| > _Thank you to the ever-growing list of [contributors](https://github.com/knsv/mermaid/graphs/contributors) that brought the project this far!_ | ||||
| > _Thank you to the ever-growing list of [contributors](https://github.com/mermaid-js/mermaid/graphs/contributors) that brought the project this far!_ | ||||
|  | ||||
| --- | ||||
|  | ||||
|   | ||||
| @@ -15,7 +15,7 @@ Mermaid | ||||
| <a href="https://mermaid.live/"><b>实时编辑器!</b></a> | ||||
| </p> | ||||
| <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://discord.gg/AgrbSrBer3" title="Discord 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/sKeNQX4Wtj" title="Discord invite">🙌 加入我们</a> | ||||
| </p> | ||||
| <p align="center"> | ||||
| <a href="./README.md">English</a> | ||||
| @@ -34,7 +34,7 @@ Mermaid | ||||
| [](https://app.codecov.io/github/mermaid-js/mermaid/tree/develop) | ||||
| [](https://www.jsdelivr.com/package/npm/mermaid) | ||||
| [](https://www.npmjs.com/package/mermaid) | ||||
| [](https://discord.gg/AgrbSrBer3) | ||||
| [](https://discord.gg/sKeNQX4Wtj) | ||||
| [](https://twitter.com/mermaidjs_) | ||||
|  | ||||
| <img src="./img/header.png" alt="" /> | ||||
| @@ -43,13 +43,13 @@ Mermaid | ||||
|  | ||||
| **感谢所有参与进来提交 PR,解答疑问的人们! 🙏** | ||||
|  | ||||
| <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> | ||||
| <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='Banner for "The Official Guide to Mermaid.js" book'></a> | ||||
|  | ||||
| ## 关于 Mermaid | ||||
|  | ||||
| <!-- <Main description>   --> | ||||
|  | ||||
| Mermaid 是一个基于 Javascript 的图表绘制工具,通过解析类 Markdown 的文本语法来实现图表的创建和动态修改。Mermaid 诞生的主要目的是让文档的更新能够及时跟上开发进度。 | ||||
| Mermaid 是一个基于 JavaScript 的图表绘制工具,通过解析类 Markdown 的文本语法来实现图表的创建和动态修改。Mermaid 诞生的主要目的是让文档的更新能够及时跟上开发进度。 | ||||
|  | ||||
| > Doc-Rot 是 Mermaid 致力于解决的一个难题。 | ||||
|  | ||||
| @@ -358,7 +358,7 @@ _很不幸的是,鱼与熊掌不可兼得,在这个场景下它意味着在 | ||||
|  | ||||
| > _特别感谢 [d3](https://d3js.org/) 和 [dagre-d3](https://github.com/cpettitt/dagre-d3) 这两个优秀的项目,它们提供了图形布局和绘图工具库!_ > _同样感谢 [js-sequence-diagram](https://bramp.github.io/js-sequence-diagrams) 提供了时序图语法的使用。 感谢 Jessica Peter 提供了甘特图渲染的灵感。_ > _感谢 [Tyler Long](https://github.com/tylerlong) 从 2017 年四月开始成为了项目的合作者。_ | ||||
| > | ||||
| > _感谢越来越多的 [贡献者们](https://github.com/knsv/mermaid/graphs/contributors),没有你们,就没有这个项目的今天!_ | ||||
| > _感谢越来越多的 [贡献者们](https://github.com/mermaid-js/mermaid/graphs/contributors),没有你们,就没有这个项目的今天!_ | ||||
|  | ||||
| --- | ||||
|  | ||||
|   | ||||
| @@ -1,8 +1,9 @@ | ||||
| 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'; | ||||
| import coverage from '@cypress/code-coverage/task.js'; | ||||
| import { defineConfig } from 'cypress'; | ||||
| import { addMatchImageSnapshotPlugin } from 'cypress-image-snapshot/plugin.js'; | ||||
| import cypressSplit from 'cypress-split'; | ||||
|  | ||||
| export default eyesPlugin( | ||||
|   defineConfig({ | ||||
| @@ -13,6 +14,7 @@ export default eyesPlugin( | ||||
|       specPattern: 'cypress/integration/**/*.{js,ts}', | ||||
|       setupNodeEvents(on, config) { | ||||
|         coverage(on, config); | ||||
|         cypressSplit(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'); | ||||
| @@ -21,12 +23,10 @@ export default eyesPlugin( | ||||
|         }); | ||||
|         // 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; | ||||
|         config.env.useArgos = process.env.RUN_VISUAL_TEST === 'true'; | ||||
|  | ||||
|         if (config.env.useArgos) { | ||||
|           registerArgosTask(on, config, { | ||||
|             token: 'fc3a35cf5200db928d65b2047861582d9444032b', | ||||
|           }); | ||||
|           registerArgosTask(on, config); | ||||
|         } else { | ||||
|           addMatchImageSnapshotPlugin(on, config); | ||||
|         } | ||||
|   | ||||
| @@ -29,6 +29,7 @@ export const mermaidUrl = ( | ||||
|   options: CypressMermaidConfig, | ||||
|   api: boolean | ||||
| ): string => { | ||||
|   options.handDrawnSeed = 1; | ||||
|   const codeObject: CodeObject = { | ||||
|     code: graphStr, | ||||
|     mermaid: options, | ||||
| @@ -131,3 +132,10 @@ export const verifyScreenshot = (name: string): void => { | ||||
|     cy.matchImageSnapshot(name); | ||||
|   } | ||||
| }; | ||||
|  | ||||
| export const verifyNumber = (value: number, expected: number, deltaPercent = 10): void => { | ||||
|   expect(value).to.be.within( | ||||
|     expected * (1 - deltaPercent / 100), | ||||
|     expected * (1 + deltaPercent / 100) | ||||
|   ); | ||||
| }; | ||||
|   | ||||
| @@ -20,7 +20,7 @@ describe('Interaction', () => { | ||||
|     }); | ||||
|  | ||||
|     it('Graph: should handle a click on a node with a bound url', () => { | ||||
|       // When there is a URL, cy.contains selects the a tag instead of the span. The .node is a child of a, so we have to use find instead of parent. | ||||
|       // When there is a URL, `cy.contains()` selects the `a` tag instead of the `span` tag. The .node is a child of `a`, so we have to use `find()` instead of `parent`. | ||||
|       cy.contains('URLTest1').find('.node').click(); | ||||
|       cy.location().should(({ href }) => { | ||||
|         expect(href).to.eq('http://localhost:9000/empty.html'); | ||||
| @@ -146,7 +146,7 @@ describe('Interaction', () => { | ||||
|     }); | ||||
|   }); | ||||
|  | ||||
|   describe('Interaction - security level other, missspelling', () => { | ||||
|   describe('Interaction - security level other, misspelling', () => { | ||||
|     beforeEach(() => { | ||||
|       cy.visit('http://localhost:9000/click_security_other.html'); | ||||
|     }); | ||||
|   | ||||
| @@ -19,6 +19,25 @@ describe.skip('architecture diagram', () => { | ||||
|             ` | ||||
|     ); | ||||
|   }); | ||||
|   it('should render a simple architecture diagram with titleAndAccessibilities', () => { | ||||
|     imgSnapshotTest( | ||||
|       `architecture-beta | ||||
|           title Simple Architecture Diagram | ||||
|           accTitle: Accessibility Title | ||||
|           accDescr: Accessibility Description | ||||
|           group api(cloud)[API] | ||||
|  | ||||
|           service db(database)[Database] in api | ||||
|           service disk1(disk)[Storage] in api | ||||
|           service disk2(disk)[Storage] in api | ||||
|           service server(server)[Server] in api | ||||
|  | ||||
|           db:L -- R:server | ||||
|           disk1:T -- B:server | ||||
|           disk2:T -- B:db | ||||
|       ` | ||||
|     ); | ||||
|   }); | ||||
|   it('should render an architecture diagram with groups within groups', () => { | ||||
|     imgSnapshotTest( | ||||
|       `architecture-beta | ||||
| @@ -171,9 +190,62 @@ describe.skip('architecture diagram', () => { | ||||
|             ` | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   it('should render an architecture diagram with a reasonable height', () => { | ||||
|     imgSnapshotTest( | ||||
|       `architecture-beta | ||||
|               group federated(cloud)[Federated Environment] | ||||
|                   service server1(server)[System] in federated | ||||
|                   service edge(server)[Edge Device] in federated | ||||
|                   server1:R -- L:edge | ||||
|  | ||||
|               group on_prem(cloud)[Hub] | ||||
|                   service firewall(server)[Firewall Device] in on_prem | ||||
|                   service server(server)[Server] in on_prem | ||||
|                   firewall:R -- L:server | ||||
|  | ||||
|                   service db1(database)[db1] in on_prem | ||||
|                   service db2(database)[db2] in on_prem | ||||
|                   service db3(database)[db3] in on_prem | ||||
|                   service db4(database)[db4] in on_prem | ||||
|                   service db5(database)[db5] in on_prem | ||||
|                   service db6(database)[db6] in on_prem | ||||
|  | ||||
|                   junction mid in on_prem | ||||
|                   server:B -- T:mid | ||||
|  | ||||
|                   junction 1Leftofmid in on_prem | ||||
|                   1Leftofmid:R -- L:mid | ||||
|                   1Leftofmid:B -- T:db1 | ||||
|  | ||||
|                   junction 2Leftofmid in on_prem | ||||
|                   2Leftofmid:R -- L:1Leftofmid | ||||
|                   2Leftofmid:B -- T:db2 | ||||
|  | ||||
|                   junction 3Leftofmid in on_prem | ||||
|                   3Leftofmid:R -- L:2Leftofmid | ||||
|                   3Leftofmid:B -- T:db3 | ||||
|  | ||||
|                   junction 1RightOfMid in on_prem | ||||
|                   mid:R -- L:1RightOfMid | ||||
|                   1RightOfMid:B -- T:db4 | ||||
|                    | ||||
|                   junction 2RightOfMid in on_prem | ||||
|                   1RightOfMid:R -- L:2RightOfMid | ||||
|                   2RightOfMid:B -- T:db5         | ||||
|                    | ||||
|                   junction 3RightOfMid in on_prem | ||||
|                   2RightOfMid:R -- L:3RightOfMid | ||||
|                   3RightOfMid:B -- T:db6          | ||||
|  | ||||
|                   edge:R -- L:firewall | ||||
|       ` | ||||
|     ); | ||||
|   }); | ||||
| }); | ||||
|  | ||||
| describe('architecture - external', () => { | ||||
| // Skipped as the layout is not deterministic, and causes issues in E2E tests. | ||||
| describe.skip('architecture - external', () => { | ||||
|   it('should allow adding external icons', () => { | ||||
|     urlSnapshotTest('http://localhost:9000/architecture-external.html'); | ||||
|   }); | ||||
|   | ||||
| @@ -14,7 +14,7 @@ describe('Block diagram', () => { | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   it('BL2: should handle colums statement in sub-blocks', () => { | ||||
|   it('BL2: should handle columns statement in sub-blocks', () => { | ||||
|     imgSnapshotTest( | ||||
|       `block-beta | ||||
|   id1["Hello"] | ||||
| @@ -30,7 +30,7 @@ describe('Block diagram', () => { | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   it('BL3: should align block widths and handle colums statement in sub-blocks', () => { | ||||
|   it('BL3: should align block widths and handle columns statement in sub-blocks', () => { | ||||
|     imgSnapshotTest( | ||||
|       `block-beta | ||||
|   block | ||||
| @@ -46,7 +46,7 @@ describe('Block diagram', () => { | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   it('BL4: should align block widths and handle colums statements in deeper sub-blocks then 1 level', () => { | ||||
|   it('BL4: should align block widths and handle columns statements in deeper sub-blocks then 1 level', () => { | ||||
|     imgSnapshotTest( | ||||
|       `block-beta | ||||
|   columns 1 | ||||
| @@ -66,7 +66,7 @@ describe('Block diagram', () => { | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   it('BL5: should align block widths and handle colums statements in deeper sub-blocks then 1 level (alt)', () => { | ||||
|   it('BL5: should align block widths and handle columns statements in deeper sub-blocks then 1 level (alt)', () => { | ||||
|     imgSnapshotTest( | ||||
|       `block-beta | ||||
|   columns 1 | ||||
| @@ -236,7 +236,7 @@ describe('Block diagram', () => { | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   it('BL17: width alignment - blocks shold be equal in width', () => { | ||||
|   it('BL17: width alignment - blocks should be equal in width', () => { | ||||
|     imgSnapshotTest( | ||||
|       `block-beta | ||||
|     A("This is the text") | ||||
|   | ||||
							
								
								
									
										1037
									
								
								cypress/integration/rendering/classDiagram-elk-v3.spec.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1037
									
								
								cypress/integration/rendering/classDiagram-elk-v3.spec.js
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1041
									
								
								cypress/integration/rendering/classDiagram-handDrawn-v3.spec.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1041
									
								
								cypress/integration/rendering/classDiagram-handDrawn-v3.spec.js
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -581,4 +581,63 @@ class C13["With Città foreign language"] | ||||
|       { logLevel: 1, flowchart: { htmlLabels: false } } | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   it('renders a class diagram with a generic class in a namespace', () => { | ||||
|     const diagramDefinition = ` | ||||
|       classDiagram-v2 | ||||
|       namespace Company.Project.Module { | ||||
|         class GenericClass~T~ { | ||||
|           +addItem(item: T) | ||||
|           +getItem() T | ||||
|         } | ||||
|       } | ||||
|     `; | ||||
|  | ||||
|     imgSnapshotTest(diagramDefinition); | ||||
|   }); | ||||
|  | ||||
|   it('renders a class diagram with nested namespaces and relationships', () => { | ||||
|     const diagramDefinition = ` | ||||
|       classDiagram-v2 | ||||
|       namespace Company.Project.Module.SubModule { | ||||
|         class Report { | ||||
|           +generatePDF(data: List) | ||||
|           +generateCSV(data: List) | ||||
|         } | ||||
|       } | ||||
|       namespace Company.Project.Module { | ||||
|         class Admin { | ||||
|           +generateReport() | ||||
|         } | ||||
|       } | ||||
|       Admin --> Report : generates | ||||
|     `; | ||||
|  | ||||
|     imgSnapshotTest(diagramDefinition); | ||||
|   }); | ||||
|  | ||||
|   it('renders a class diagram with multiple classes and relationships in a namespace', () => { | ||||
|     const diagramDefinition = ` | ||||
|       classDiagram-v2 | ||||
|       namespace Company.Project.Module { | ||||
|         class User { | ||||
|           +login(username: String, password: String) | ||||
|           +logout() | ||||
|         } | ||||
|         class Admin { | ||||
|           +addUser(user: User) | ||||
|           +removeUser(user: User) | ||||
|           +generateReport() | ||||
|         } | ||||
|         class Report { | ||||
|           +generatePDF(reportData: List) | ||||
|           +generateCSV(reportData: List) | ||||
|         } | ||||
|       } | ||||
|       Admin --> User : manages | ||||
|       Admin --> Report : generates | ||||
|     `; | ||||
|  | ||||
|     imgSnapshotTest(diagramDefinition); | ||||
|   }); | ||||
| }); | ||||
|   | ||||
							
								
								
									
										1031
									
								
								cypress/integration/rendering/classDiagram-v3.spec.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1031
									
								
								cypress/integration/rendering/classDiagram-v3.spec.js
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -429,7 +429,7 @@ describe('Class diagram', () => { | ||||
|     classDiagram | ||||
|       class \`This\nTitle\nHas\nMany\nNewlines\` { | ||||
|         +String Also | ||||
|         -Stirng Many | ||||
|         -String Many | ||||
|         #int Members | ||||
|         +And() | ||||
|         -Many() | ||||
| @@ -443,7 +443,7 @@ describe('Class diagram', () => { | ||||
|     classDiagram | ||||
|       class \`This\nTitle\nHas\nMany\nNewlines\` { | ||||
|         +String Also | ||||
|         -Stirng Many | ||||
|         -String Many | ||||
|         #int Members | ||||
|         +And() | ||||
|         -Many() | ||||
| @@ -459,7 +459,7 @@ describe('Class diagram', () => { | ||||
|       namespace testingNamespace { | ||||
|       class \`This\nTitle\nHas\nMany\nNewlines\` { | ||||
|         +String Also | ||||
|         -Stirng Many | ||||
|         -String Many | ||||
|         #int Members | ||||
|         +And() | ||||
|         -Many() | ||||
|   | ||||
							
								
								
									
										652
									
								
								cypress/integration/rendering/erDiagram-unified.spec.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										652
									
								
								cypress/integration/rendering/erDiagram-unified.spec.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,652 @@ | ||||
| import { imgSnapshotTest, renderGraph } from '../../helpers/util.ts'; | ||||
|  | ||||
| const testOptions = [ | ||||
|   { description: '', options: { logLevel: 1 } }, | ||||
|   { description: 'ELK: ', options: { logLevel: 1, layout: 'elk' } }, | ||||
|   { description: 'HD: ', options: { logLevel: 1, look: 'handDrawn' } }, | ||||
| ]; | ||||
|  | ||||
| describe('Entity Relationship Diagram Unified', () => { | ||||
|   testOptions.forEach(({ description, options }) => { | ||||
|     it(`${description}should render a simple ER diagram`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|       erDiagram | ||||
|           CUSTOMER ||--o{ ORDER : places | ||||
|           ORDER ||--|{ LINE-ITEM : contains | ||||
|         `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render a simple ER diagram without htmlLabels`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|       erDiagram | ||||
|           CUSTOMER ||--o{ ORDER : places | ||||
|           ORDER ||--|{ LINE-ITEM : contains | ||||
|         `, | ||||
|         { ...options, htmlLabels: false } | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render an ER diagram with a recursive relationship`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|       erDiagram | ||||
|           CUSTOMER ||..o{ CUSTOMER : refers | ||||
|           CUSTOMER ||--o{ ORDER : places | ||||
|           ORDER ||--|{ LINE-ITEM : contains | ||||
|         `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render an ER diagram with multiple relationships between the same two entities`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|       erDiagram | ||||
|           CUSTOMER ||--|{ ADDRESS : "invoiced at" | ||||
|           CUSTOMER ||--|{ ADDRESS : "receives goods at" | ||||
|         `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render a cyclical ER diagram`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|       erDiagram | ||||
|           A ||--|{ B : likes | ||||
|           B ||--|{ C : likes | ||||
|           C ||--|{ A : likes | ||||
|         `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render a not-so-simple ER diagram`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|       erDiagram | ||||
|           CUSTOMER }|..|{ DELIVERY-ADDRESS : has | ||||
|           CUSTOMER ||--o{ ORDER : places | ||||
|           CUSTOMER ||--o{ INVOICE : "liable for" | ||||
|           DELIVERY-ADDRESS ||--o{ ORDER : receives | ||||
|           INVOICE ||--|{ ORDER : covers | ||||
|           ORDER ||--|{ ORDER-ITEM : includes | ||||
|           PRODUCT-CATEGORY ||--|{ PRODUCT : contains | ||||
|           PRODUCT ||--o{ ORDER-ITEM : "ordered in" | ||||
|         `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render a not-so-simple ER diagram without htmlLabels`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|       erDiagram | ||||
|           CUSTOMER }|..|{ DELIVERY-ADDRESS : has | ||||
|           CUSTOMER ||--o{ ORDER : places | ||||
|           CUSTOMER ||--o{ INVOICE : "liable for" | ||||
|           DELIVERY-ADDRESS ||--o{ ORDER : receives | ||||
|           INVOICE ||--|{ ORDER : covers | ||||
|           ORDER ||--|{ ORDER-ITEM : includes | ||||
|           PRODUCT-CATEGORY ||--|{ PRODUCT : contains | ||||
|           PRODUCT ||--o{ ORDER-ITEM : "ordered in" | ||||
|         `, | ||||
|         { ...options, htmlLabels: false } | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render multiple ER diagrams`, () => { | ||||
|       imgSnapshotTest( | ||||
|         [ | ||||
|           ` | ||||
|       erDiagram | ||||
|           CUSTOMER ||--o{ ORDER : places | ||||
|           ORDER ||--|{ LINE-ITEM : contains | ||||
|         `, | ||||
|           ` | ||||
|       erDiagram | ||||
|           CUSTOMER ||--o{ ORDER : places | ||||
|           ORDER ||--|{ LINE-ITEM : contains | ||||
|         `, | ||||
|         ], | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render an ER diagram with blank or empty labels`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|       erDiagram | ||||
|           BOOK }|..|{ AUTHOR : "" | ||||
|           BOOK }|..|{ GENRE : " " | ||||
|           AUTHOR }|..|{ GENRE : "  " | ||||
|         `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render entities that have no relationships`, () => { | ||||
|       renderGraph( | ||||
|         ` | ||||
|       erDiagram | ||||
|           DEAD_PARROT | ||||
|           HERMIT | ||||
|           RECLUSE | ||||
|           SOCIALITE }o--o{ SOCIALITE : "interacts with" | ||||
|           RECLUSE }o--o{ SOCIALITE : avoids | ||||
|         `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render entities with and without attributes`, () => { | ||||
|       renderGraph( | ||||
|         ` | ||||
|       erDiagram | ||||
|           BOOK { string title } | ||||
|           AUTHOR }|..|{ BOOK : writes | ||||
|           BOOK { float price } | ||||
|         `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render entities with generic and array attributes`, () => { | ||||
|       renderGraph( | ||||
|         ` | ||||
|       erDiagram | ||||
|           BOOK { | ||||
|             string title | ||||
|             string[] authors | ||||
|             type~T~ type | ||||
|           } | ||||
|         `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render entities with generic and array attributes without htmlLabels`, () => { | ||||
|       renderGraph( | ||||
|         ` | ||||
|       erDiagram | ||||
|           BOOK { | ||||
|             string title | ||||
|             string[] authors | ||||
|             type~T~ type | ||||
|           } | ||||
|         `, | ||||
|         { ...options, htmlLabels: false } | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render entities with length in attributes type`, () => { | ||||
|       renderGraph( | ||||
|         ` | ||||
|       erDiagram | ||||
|           CLUSTER { | ||||
|             varchar(99) name | ||||
|             string(255) description | ||||
|           } | ||||
|         `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render entities with length in attributes type without htmlLabels`, () => { | ||||
|       renderGraph( | ||||
|         ` | ||||
|       erDiagram | ||||
|           CLUSTER { | ||||
|             varchar(99) name | ||||
|             string(255) description | ||||
|           } | ||||
|         `, | ||||
|         { ...options, htmlLabels: false } | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render entities and attributes with big and small entity names`, () => { | ||||
|       renderGraph( | ||||
|         ` | ||||
|       erDiagram | ||||
|           PRIVATE_FINANCIAL_INSTITUTION { | ||||
|             string name | ||||
|             int    turnover | ||||
|           } | ||||
|           PRIVATE_FINANCIAL_INSTITUTION ||..|{ EMPLOYEE : employs | ||||
|           EMPLOYEE { bool officer_of_firm } | ||||
|         `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render entities and attributes with big and small entity names without htmlLabels`, () => { | ||||
|       renderGraph( | ||||
|         ` | ||||
|       erDiagram | ||||
|           PRIVATE_FINANCIAL_INSTITUTION { | ||||
|             string name | ||||
|             int    turnover | ||||
|           } | ||||
|           PRIVATE_FINANCIAL_INSTITUTION ||..|{ EMPLOYEE : employs | ||||
|           EMPLOYEE { bool officer_of_firm } | ||||
|         `, | ||||
|         { ...options, htmlLabels: false } | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render entities with attributes that begin with asterisk`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|       erDiagram | ||||
|           BOOK { | ||||
|             int         *id | ||||
|             string      name | ||||
|             varchar(99) summary | ||||
|           } | ||||
|           BOOK }o..o{ STORE : soldBy | ||||
|           STORE { | ||||
|             int         *id | ||||
|             string      name | ||||
|             varchar(50) address | ||||
|           } | ||||
|           `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render entities with attributes that begin with asterisk without htmlLabels`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|       erDiagram | ||||
|           BOOK { | ||||
|             int         *id | ||||
|             string      name | ||||
|             varchar(99) summary | ||||
|           } | ||||
|           BOOK }o..o{ STORE : soldBy | ||||
|           STORE { | ||||
|             int         *id | ||||
|             string      name | ||||
|             varchar(50) address | ||||
|           } | ||||
|           `, | ||||
|         { ...options, htmlLabels: false } | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render entities with keys`, () => { | ||||
|       renderGraph( | ||||
|         ` | ||||
|       erDiagram | ||||
|         AUTHOR_WITH_LONG_ENTITY_NAME { | ||||
|           string name PK | ||||
|         } | ||||
|         AUTHOR_WITH_LONG_ENTITY_NAME }|..|{ BOOK : writes | ||||
|         BOOK { | ||||
|             float price | ||||
|             string author FK | ||||
|             string title PK | ||||
|           } | ||||
|         `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render entities with keys without htmlLabels`, () => { | ||||
|       renderGraph( | ||||
|         ` | ||||
|       erDiagram | ||||
|         AUTHOR_WITH_LONG_ENTITY_NAME { | ||||
|           string name PK | ||||
|         } | ||||
|         AUTHOR_WITH_LONG_ENTITY_NAME }|..|{ BOOK : writes | ||||
|         BOOK { | ||||
|             float price | ||||
|             string author FK | ||||
|             string title PK | ||||
|           } | ||||
|         `, | ||||
|         { ...options, htmlLabels: false } | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render entities with comments`, () => { | ||||
|       renderGraph( | ||||
|         ` | ||||
|       erDiagram | ||||
|         AUTHOR_WITH_LONG_ENTITY_NAME { | ||||
|           string name "comment" | ||||
|         } | ||||
|         AUTHOR_WITH_LONG_ENTITY_NAME }|..|{ BOOK : writes | ||||
|         BOOK { | ||||
|             string author | ||||
|             string title "author comment" | ||||
|             float price "price comment" | ||||
|           } | ||||
|         `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render entities with comments without htmlLabels`, () => { | ||||
|       renderGraph( | ||||
|         ` | ||||
|       erDiagram | ||||
|         AUTHOR_WITH_LONG_ENTITY_NAME { | ||||
|           string name "comment" | ||||
|         } | ||||
|         AUTHOR_WITH_LONG_ENTITY_NAME }|..|{ BOOK : writes | ||||
|         BOOK { | ||||
|             string author | ||||
|             string title "author comment" | ||||
|             float price "price comment" | ||||
|           } | ||||
|         `, | ||||
|         { ...options, htmlLabels: false } | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render entities with keys and comments`, () => { | ||||
|       renderGraph( | ||||
|         ` | ||||
|       erDiagram | ||||
|         AUTHOR_WITH_LONG_ENTITY_NAME { | ||||
|           string name PK "comment" | ||||
|         } | ||||
|         AUTHOR_WITH_LONG_ENTITY_NAME }|..|{ BOOK : writes | ||||
|         BOOK { | ||||
|             string description | ||||
|             float price "price comment" | ||||
|             string title PK "title comment" | ||||
|             string author FK | ||||
|           } | ||||
|         `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render entities with keys and comments without htmlLabels`, () => { | ||||
|       renderGraph( | ||||
|         ` | ||||
|       erDiagram | ||||
|         AUTHOR_WITH_LONG_ENTITY_NAME { | ||||
|           string name PK "comment" | ||||
|         } | ||||
|         AUTHOR_WITH_LONG_ENTITY_NAME }|..|{ BOOK : writes | ||||
|         BOOK { | ||||
|             string description | ||||
|             float price "price comment" | ||||
|             string title PK "title comment" | ||||
|             string author FK | ||||
|           } | ||||
|         `, | ||||
|         { ...options, htmlLabels: false } | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render entities with aliases`, () => { | ||||
|       renderGraph( | ||||
|         ` | ||||
|       erDiagram | ||||
|         T1 one or zero to one or more T2 : test | ||||
|         T2 one or many optionally to zero or one T3 : test | ||||
|         T3 zero or more to zero or many T4 : test | ||||
|         T4 many(0) to many(1) T5 : test | ||||
|         T5 many optionally to one T6 : test | ||||
|         T6 only one optionally to only one T1 : test | ||||
|         T4 0+ to 1+ T6 : test | ||||
|         T1 1 to 1 T3 : test | ||||
|         `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render a simple ER diagram with a title`, () => { | ||||
|       imgSnapshotTest( | ||||
|         `--- | ||||
|   title: simple ER diagram | ||||
|   --- | ||||
|   erDiagram | ||||
|   CUSTOMER ||--o{ ORDER : places | ||||
|   ORDER ||--|{ LINE-ITEM : contains | ||||
|   `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render entities with entity name aliases`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|       erDiagram | ||||
|         p[Person] { | ||||
|           varchar(64) firstName | ||||
|           varchar(64) lastName | ||||
|         } | ||||
|         c["Customer Account"] { | ||||
|           varchar(128) email | ||||
|         } | ||||
|         p ||--o| c : has | ||||
|         `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render relationship labels with line breaks`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|       erDiagram | ||||
|         p[Person] { | ||||
|             string firstName | ||||
|             string lastName | ||||
|         } | ||||
|         a["Customer Account"] { | ||||
|             string email | ||||
|         } | ||||
|    | ||||
|         b["Customer Account Secondary"] { | ||||
|           string email | ||||
|         } | ||||
|          | ||||
|         c["Customer Account Tertiary"] { | ||||
|           string email | ||||
|         } | ||||
|          | ||||
|         d["Customer Account Nth"] { | ||||
|           string email | ||||
|         } | ||||
|    | ||||
|         p ||--o| a : "has<br />one" | ||||
|         p ||--o| b : "has<br />one<br />two" | ||||
|         p ||--o| c : "has<br />one<br/>two<br />three" | ||||
|         p ||--o| d : "has<br />one<br />two<br/>three<br />...<br/>Nth" | ||||
|         `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render an ER diagram with unicode text`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|       erDiagram | ||||
|           _**testẽζ➕Ø😀㌕ぼ**_ { | ||||
|               *__List~List~int~~sdfds__* **driversLicense** PK "***The l😀icense #***" | ||||
|               *string(99)~T~~~~~~* firstName "Only __99__ <br>characters are a<br>llowed dsfsdfsdfsdfs" | ||||
|               string last*Name* | ||||
|               string __phone__ UK | ||||
|               int _age_ | ||||
|           } | ||||
|         `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render an ER diagram with unicode text without htmlLabels`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|       erDiagram | ||||
|           _**testẽζ➕Ø😀㌕ぼ**_ { | ||||
|               *__List~List~int~~sdfds__* **driversLicense** PK "***The l😀icense #***" | ||||
|               *string(99)~T~~~~~~* firstName "Only __99__ <br>characters are a<br>llowed dsfsdfsdfsdfs" | ||||
|               string last*Name* | ||||
|               string __phone__ UK | ||||
|               int _age_ | ||||
|           } | ||||
|         `, | ||||
|         { ...options, htmlLabels: false } | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render an ER diagram with relationships with unicode text`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|           erDiagram | ||||
|             person[😀] { | ||||
|                 string *first*Name | ||||
|                 string _**last**Name_ | ||||
|             } | ||||
|             a["*Customer Account*"] { | ||||
|                 **string** ema*i*l | ||||
|             } | ||||
|             person ||--o| a : __hẽ😀__ | ||||
|         `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render an ER diagram with relationships with unicode text without htmlLabels`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|           erDiagram | ||||
|             person[😀] { | ||||
|                 string *first*Name | ||||
|                 string _**last**Name_ | ||||
|             } | ||||
|             a["*Customer Account*"] { | ||||
|                 **string** ema*i*l | ||||
|             } | ||||
|             person ||--o| a : __hẽ😀__ | ||||
|         `, | ||||
|         { ...options, htmlLabels: false } | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render an ER diagram with TB direction`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|           erDiagram | ||||
|           direction TB | ||||
|           CAR ||--|{ NAMED-DRIVER : allows | ||||
|           PERSON ||..o{ NAMED-DRIVER : is | ||||
|         `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render an ER diagram with BT direction`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|           erDiagram | ||||
|           direction BT | ||||
|           CAR ||--|{ NAMED-DRIVER : allows | ||||
|           PERSON ||..o{ NAMED-DRIVER : is | ||||
|         `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render an ER diagram with LR direction`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|           erDiagram | ||||
|           direction LR | ||||
|           CAR ||--|{ NAMED-DRIVER : allows | ||||
|           PERSON ||..o{ NAMED-DRIVER : is | ||||
|         `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render an ER diagram with RL direction`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|           erDiagram | ||||
|           direction RL | ||||
|           CAR ||--|{ NAMED-DRIVER : allows | ||||
|           PERSON ||..o{ NAMED-DRIVER : is | ||||
|         `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render entities with styles applied from style statement`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|             erDiagram | ||||
|               c[CUSTOMER] | ||||
|               p[PERSON] | ||||
|               style c,p fill:#f9f,stroke:blue, color:grey, font-size:24px,font-weight:bold | ||||
|         `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render entities with styles applied from style statement without htmlLabels`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|             erDiagram | ||||
|               c[CUSTOMER] | ||||
|               p[PERSON] | ||||
|               style c,p fill:#f9f,stroke:blue, color:grey, font-size:24px,font-weight:bold | ||||
|         `, | ||||
|         { ...options, htmlLabels: false } | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render entities with styles applied from class statement`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|             erDiagram | ||||
|               c[CUSTOMER] | ||||
|               p[PERSON]:::blue | ||||
|               classDef bold font-size:24px, font-weight: bold | ||||
|               classDef blue stroke:lightblue, color: #0000FF | ||||
|               class c,p bold | ||||
|         `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render entities with styles applied from class statement without htmlLabels`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|             erDiagram | ||||
|               c[CUSTOMER] | ||||
|               p[PERSON]:::blue | ||||
|               classDef bold font-size:24px, font-weight: bold | ||||
|               classDef blue stroke:lightblue, color: #0000FF | ||||
|               class c,p bold | ||||
|         `, | ||||
|         { ...options, htmlLabels: false } | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render entities with styles applied from the default class and other styles`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|             erDiagram | ||||
|               c[CUSTOMER] | ||||
|               p[PERSON]:::blue | ||||
|               classDef blue stroke:lightblue, color: #0000FF | ||||
|               classDef default fill:pink | ||||
|               style c color:green | ||||
|         `, | ||||
|         { ...options } | ||||
|       ); | ||||
|     }); | ||||
|   }); | ||||
| }); | ||||
| @@ -109,8 +109,8 @@ describe('Entity Relationship Diagram', () => { | ||||
|       const style = svg.attr('style'); | ||||
|       expect(style).to.match(/^max-width: [\d.]+px;$/); | ||||
|       const maxWidthValue = parseFloat(style.match(/[\d.]+/g).join('')); | ||||
|       // use within because the absolute value can be slightly different depending on the environment ±5% | ||||
|       expect(maxWidthValue).to.be.within(140 * 0.95, 140 * 1.05); | ||||
|       // use within because the absolute value can be slightly different depending on the environment ±6% | ||||
|       expect(maxWidthValue).to.be.within(140 * 0.96, 140 * 1.06); | ||||
|     }); | ||||
|   }); | ||||
|  | ||||
| @@ -125,8 +125,8 @@ describe('Entity Relationship Diagram', () => { | ||||
|     ); | ||||
|     cy.get('svg').should((svg) => { | ||||
|       const width = parseFloat(svg.attr('width')); | ||||
|       // use within because the absolute value can be slightly different depending on the environment ±5% | ||||
|       expect(width).to.be.within(140 * 0.95, 140 * 1.05); | ||||
|       // use within because the absolute value can be slightly different depending on the environment ±6% | ||||
|       expect(width).to.be.within(140 * 0.96, 140 * 1.06); | ||||
|       // expect(svg).to.have.attr('height', '465'); | ||||
|       expect(svg).to.not.have.attr('style'); | ||||
|     }); | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| import { imgSnapshotTest, renderGraph } from '../../helpers/util.ts'; | ||||
| import { imgSnapshotTest, renderGraph, verifyNumber } from '../../helpers/util.ts'; | ||||
|  | ||||
| describe.skip('Flowchart ELK', () => { | ||||
| describe('Flowchart ELK', () => { | ||||
|   it('1-elk: should render a simple flowchart', () => { | ||||
|     imgSnapshotTest( | ||||
|       `flowchart-elk TD | ||||
| @@ -109,7 +109,7 @@ describe.skip('Flowchart ELK', () => { | ||||
|       const style = svg.attr('style'); | ||||
|       expect(style).to.match(/^max-width: [\d.]+px;$/); | ||||
|       const maxWidthValue = parseFloat(style.match(/[\d.]+/g).join('')); | ||||
|       expect(maxWidthValue).to.be.within(230 * 0.95, 230 * 1.05); | ||||
|       verifyNumber(maxWidthValue, 380); | ||||
|     }); | ||||
|   }); | ||||
|   it('8-elk: should render a flowchart when useMaxWidth is false', () => { | ||||
| @@ -128,7 +128,7 @@ describe.skip('Flowchart ELK', () => { | ||||
|       const width = parseFloat(svg.attr('width')); | ||||
|       // use within because the absolute value can be slightly different depending on the environment ±5% | ||||
|       // expect(height).to.be.within(446 * 0.95, 446 * 1.05); | ||||
|       expect(width).to.be.within(230 * 0.95, 230 * 1.05); | ||||
|       verifyNumber(width, 380); | ||||
|       expect(svg).to.not.have.attr('style'); | ||||
|     }); | ||||
|   }); | ||||
| @@ -208,13 +208,13 @@ describe.skip('Flowchart ELK', () => { | ||||
|       `flowchart-elk TB | ||||
|   internet | ||||
|   nat | ||||
|   routeur | ||||
|   router | ||||
|   lb1 | ||||
|   lb2 | ||||
|   compute1 | ||||
|   compute2 | ||||
|   subgraph project | ||||
|   routeur | ||||
|   router | ||||
|   nat | ||||
|     subgraph subnet1 | ||||
|       compute1 | ||||
| @@ -225,8 +225,8 @@ describe.skip('Flowchart ELK', () => { | ||||
|       lb2 | ||||
|     end | ||||
|   end | ||||
|   internet --> routeur | ||||
|   routeur --> subnet1 & subnet2 | ||||
|   internet --> router | ||||
|   router --> subnet1 & subnet2 | ||||
|   subnet1 & subnet2 --> nat --> internet | ||||
|       `, | ||||
|       { htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' } | ||||
| @@ -443,7 +443,7 @@ flowchart-elk TD | ||||
|       { htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' } | ||||
|     ); | ||||
|   }); | ||||
|   it('63-elk: title on subgraphs should be themable', () => { | ||||
|   it('63-elk: title on subgraphs should be themeable', () => { | ||||
|     imgSnapshotTest( | ||||
|       ` | ||||
|       %%{init:{"theme":"base", "themeVariables": {"primaryColor":"#411d4e", "titleColor":"white", "darkMode":true}}}%% | ||||
| @@ -692,7 +692,7 @@ A --> B | ||||
|       {} | ||||
|     ); | ||||
|     cy.get('svg').should((svg) => { | ||||
|       const edges = svg.querySelectorAll('.edges > path'); | ||||
|       const edges = svg[0].querySelectorAll('.edges > path'); | ||||
|       edges.forEach((edge) => { | ||||
|         expect(edge).to.have.class('flowchart-link'); | ||||
|       }); | ||||
| @@ -739,7 +739,7 @@ NL\`") --"\`1o **bold**\`"--> c | ||||
|           { flowchart: { titleTopMargin: 0 } } | ||||
|         ); | ||||
|       }); | ||||
|       it('Wrapping long text with a new line', () => { | ||||
|       it.skip('Wrapping long text with a new line', () => { | ||||
|         imgSnapshotTest( | ||||
|           `%%{init: {"flowchart": {"htmlLabels": true}} }%% | ||||
| flowchart-elk LR | ||||
| @@ -841,7 +841,7 @@ end | ||||
|           { flowchart: { titleTopMargin: 0 } } | ||||
|         ); | ||||
|       }); | ||||
|       it('Sub graphs and markdown strings', () => { | ||||
|       it('Sub graphs', () => { | ||||
|         imgSnapshotTest( | ||||
|           `--- | ||||
| config: | ||||
| @@ -857,6 +857,196 @@ flowchart LR | ||||
|     D --> E | ||||
|       A["A"] | ||||
|  | ||||
| `, | ||||
|           { flowchart: { titleTopMargin: 0 } } | ||||
|         ); | ||||
|       }); | ||||
|       it('6080: should handle diamond shape intersections', () => { | ||||
|         imgSnapshotTest( | ||||
|           `--- | ||||
| config: | ||||
|   layout: elk | ||||
| --- | ||||
| flowchart LR | ||||
|  subgraph s1["Untitled subgraph"] | ||||
|         n1["Evaluate"] | ||||
|         n2["Option 1"] | ||||
|         n3["Option 2"] | ||||
|         n4["fa:fa-car Option 3"] | ||||
|   end | ||||
|  subgraph s2["Untitled subgraph"] | ||||
|         n5["Evaluate"] | ||||
|         n6["Option 1"] | ||||
|         n7["Option 2"] | ||||
|         n8["fa:fa-car Option 3"] | ||||
|   end | ||||
|     A["Start"] -- Some text --> B("Continue") | ||||
|     B --> C{"Evaluate"} | ||||
|     C -- One --> D["Option 1"] | ||||
|     C -- Two --> E["Option 2"] | ||||
|     C -- Three --> F["fa:fa-car Option 3"] | ||||
|     n1 -- One --> n2 | ||||
|     n1 -- Two --> n3 | ||||
|     n1 -- Three --> n4 | ||||
|     n5 -- One --> n6 | ||||
|     n5 -- Two --> n7 | ||||
|     n5 -- Three --> n8 | ||||
|     n1@{ shape: diam} | ||||
|     n2@{ shape: rect} | ||||
|     n3@{ shape: rect} | ||||
|     n4@{ shape: rect} | ||||
|     n5@{ shape: diam} | ||||
|     n6@{ shape: rect} | ||||
|     n7@{ shape: rect} | ||||
|     n8@{ shape: rect} | ||||
|  | ||||
| `, | ||||
|           { flowchart: { titleTopMargin: 0 } } | ||||
|         ); | ||||
|       }); | ||||
|  | ||||
|       it('6088-1: should handle diamond shape intersections', () => { | ||||
|         imgSnapshotTest( | ||||
|           `--- | ||||
| config: | ||||
|   layout: elk | ||||
| --- | ||||
|       flowchart LR | ||||
|       subgraph S2 | ||||
|       subgraph s1["APA"] | ||||
|       D{"Use the editor"} | ||||
|       end | ||||
|  | ||||
|  | ||||
|       D -- Mermaid js --> I{"fa:fa-code Text"} | ||||
|             D --> I | ||||
|             D --> I | ||||
|  | ||||
|       end | ||||
| `, | ||||
|           { flowchart: { titleTopMargin: 0 } } | ||||
|         ); | ||||
|       }); | ||||
|  | ||||
|       it('6088-2: should handle diamond shape intersections', () => { | ||||
|         imgSnapshotTest( | ||||
|           `--- | ||||
| config: | ||||
|   layout: elk | ||||
| --- | ||||
|       flowchart LR | ||||
|       a | ||||
|       subgraph s0["APA"] | ||||
|       subgraph s8["APA"] | ||||
|       subgraph s1["APA"] | ||||
|         D{"X"} | ||||
|         E[Q] | ||||
|       end | ||||
|       subgraph s3["BAPA"] | ||||
|         F[Q] | ||||
|         I | ||||
|       end | ||||
|             D --> I | ||||
|             D --> I | ||||
|             D --> I | ||||
|  | ||||
|       I{"X"} | ||||
|       end | ||||
|       end | ||||
|  | ||||
| `, | ||||
|           { flowchart: { titleTopMargin: 0 } } | ||||
|         ); | ||||
|       }); | ||||
|  | ||||
|       it('6088-3: should handle diamond shape intersections', () => { | ||||
|         imgSnapshotTest( | ||||
|           `--- | ||||
| config: | ||||
|   layout: elk | ||||
| --- | ||||
|       flowchart LR | ||||
|       a | ||||
|         D{"Use the editor"} | ||||
|  | ||||
|       D -- Mermaid js --> I{"fa:fa-code Text"} | ||||
|       D-->I | ||||
|       D-->I | ||||
|  | ||||
| `, | ||||
|           { flowchart: { titleTopMargin: 0 } } | ||||
|         ); | ||||
|       }); | ||||
|  | ||||
|       it('6088-4: should handle diamond shape intersections', () => { | ||||
|         imgSnapshotTest( | ||||
|           `--- | ||||
| config: | ||||
|   layout: elk | ||||
| --- | ||||
| flowchart LR | ||||
|  subgraph s1["Untitled subgraph"] | ||||
|         n1["Evaluate"] | ||||
|         n2["Option 1"] | ||||
|         n3["Option 2"] | ||||
|         n4["fa:fa-car Option 3"] | ||||
|   end | ||||
|  subgraph s2["Untitled subgraph"] | ||||
|         n5["Evaluate"] | ||||
|         n6["Option 1"] | ||||
|         n7["Option 2"] | ||||
|         n8["fa:fa-car Option 3"] | ||||
|   end | ||||
|     A["Start"] -- Some text --> B("Continue") | ||||
|     B --> C{"Evaluate"} | ||||
|     C -- One --> D["Option 1"] | ||||
|     C -- Two --> E["Option 2"] | ||||
|     C -- Three --> F["fa:fa-car Option 3"] | ||||
|     n1 -- One --> n2 | ||||
|     n1 -- Two --> n3 | ||||
|     n1 -- Three --> n4 | ||||
|     n5 -- One --> n6 | ||||
|     n5 -- Two --> n7 | ||||
|     n5 -- Three --> n8 | ||||
|     n1@{ shape: diam} | ||||
|     n2@{ shape: rect} | ||||
|     n3@{ shape: rect} | ||||
|     n4@{ shape: rect} | ||||
|     n5@{ shape: diam} | ||||
|     n6@{ shape: rect} | ||||
|     n7@{ shape: rect} | ||||
|     n8@{ shape: rect} | ||||
|  | ||||
| `, | ||||
|           { flowchart: { titleTopMargin: 0 } } | ||||
|         ); | ||||
|       }); | ||||
|  | ||||
|       it('6088-5: should handle diamond shape intersections', () => { | ||||
|         imgSnapshotTest( | ||||
|           `--- | ||||
| config: | ||||
|   layout: elk | ||||
| --- | ||||
| flowchart LR | ||||
|     A{A} --> B & C | ||||
|  | ||||
| `, | ||||
|           { flowchart: { titleTopMargin: 0 } } | ||||
|         ); | ||||
|       }); | ||||
|       it('6088-6: should handle diamond shape intersections', () => { | ||||
|         imgSnapshotTest( | ||||
|           `--- | ||||
| config: | ||||
|   layout: elk | ||||
| --- | ||||
| flowchart LR | ||||
|     A{A} --> B & C | ||||
|     subgraph "subbe" | ||||
|       A | ||||
|     end | ||||
|  | ||||
| `, | ||||
|           { flowchart: { titleTopMargin: 0 } } | ||||
|         ); | ||||
|   | ||||
| @@ -12,7 +12,6 @@ describe('Flowchart HandDrawn', () => { | ||||
|       `, | ||||
|       { | ||||
|         look: 'handDrawn', | ||||
|         handDrawnSeed: 1, | ||||
|         flowchart: { htmlLabels: false }, | ||||
|         fontFamily: 'courier', | ||||
|       } | ||||
| @@ -30,7 +29,6 @@ describe('Flowchart HandDrawn', () => { | ||||
|       `, | ||||
|       { | ||||
|         look: 'handDrawn', | ||||
|         handDrawnSeed: 1, | ||||
|         flowchart: { htmlLabels: true }, | ||||
|         fontFamily: 'courier', | ||||
|       } | ||||
| @@ -47,7 +45,7 @@ describe('Flowchart HandDrawn', () => { | ||||
|       C -->|Two| E[iPhone] | ||||
|       C -->|Three| F[Car] | ||||
|       `, | ||||
|       { look: 'handDrawn', handDrawnSeed: 1, fontFamily: 'courier' } | ||||
|       { look: 'handDrawn', fontFamily: 'courier' } | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
| @@ -62,7 +60,7 @@ describe('Flowchart HandDrawn', () => { | ||||
|       C -->|Two| E[\\iPhone\\] | ||||
|       C -->|Three| F[Car] | ||||
|       `, | ||||
|       { look: 'handDrawn', handDrawnSeed: 1, fontFamily: 'courier' } | ||||
|       { look: 'handDrawn', fontFamily: 'courier' } | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
| @@ -78,7 +76,7 @@ describe('Flowchart HandDrawn', () => { | ||||
|       classDef processHead fill:#888888,color:white,font-weight:bold,stroke-width:3px,stroke:#001f3f | ||||
|       class 1A,1B,D,E processHead | ||||
|       `, | ||||
|       { look: 'handDrawn', handDrawnSeed: 1, fontFamily: 'courier' } | ||||
|       { look: 'handDrawn', fontFamily: 'courier' } | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
| @@ -107,7 +105,7 @@ describe('Flowchart HandDrawn', () => { | ||||
|       35(SAM.CommonFA.PopulationFME)-->39(SAM.CommonFA.ChargeDetails) | ||||
|       36(SAM.CommonFA.PremetricCost)-->39(SAM.CommonFA.ChargeDetails) | ||||
|       `, | ||||
|       { look: 'handDrawn', handDrawnSeed: 1, fontFamily: 'courier' } | ||||
|       { look: 'handDrawn', fontFamily: 'courier' } | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
| @@ -178,7 +176,7 @@ describe('Flowchart HandDrawn', () => { | ||||
|       9a072290_1ec3_e711_8c5a_005056ad0002-->d6072290_1ec3_e711_8c5a_005056ad0002 | ||||
|       9a072290_1ec3_e711_8c5a_005056ad0002-->71082290_1ec3_e711_8c5a_005056ad0002 | ||||
|       `, | ||||
|       { look: 'handDrawn', handDrawnSeed: 1, fontFamily: 'courier' } | ||||
|       { look: 'handDrawn', fontFamily: 'courier' } | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
| @@ -187,7 +185,7 @@ describe('Flowchart HandDrawn', () => { | ||||
|       ` | ||||
|     graph TB;subgraph "number as labels";1;end; | ||||
|       `, | ||||
|       { look: 'handDrawn', handDrawnSeed: 1, fontFamily: 'courier' } | ||||
|       { look: 'handDrawn', fontFamily: 'courier' } | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
| @@ -199,7 +197,7 @@ describe('Flowchart HandDrawn', () => { | ||||
|         a1-->a2 | ||||
|       end | ||||
|       `, | ||||
|       { look: 'handDrawn', handDrawnSeed: 1, fontFamily: 'courier' } | ||||
|       { look: 'handDrawn', fontFamily: 'courier' } | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
| @@ -211,7 +209,7 @@ describe('Flowchart HandDrawn', () => { | ||||
|         a1-->a2 | ||||
|       end | ||||
|       `, | ||||
|       { look: 'handDrawn', handDrawnSeed: 1, fontFamily: 'courier' } | ||||
|       { look: 'handDrawn', fontFamily: 'courier' } | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
| @@ -246,7 +244,7 @@ describe('Flowchart HandDrawn', () => { | ||||
|       style foo fill:#F99,stroke-width:2px,stroke:#F0F,color:darkred | ||||
|       style bar fill:#999,stroke-width:10px,stroke:#0F0,color:blue | ||||
|       `, | ||||
|       { look: 'handDrawn', handDrawnSeed: 1, fontFamily: 'courier' } | ||||
|       { look: 'handDrawn', fontFamily: 'courier' } | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
| @@ -348,7 +346,7 @@ describe('Flowchart HandDrawn', () => { | ||||
|       sid-7CE72B24-E0C1-46D3-8132-8BA66BE05AA7-->sid-4DA958A0-26D9-4D47-93A7-70F39FD7D51A; | ||||
|       sid-7CE72B24-E0C1-46D3-8132-8BA66BE05AA7-->sid-4FC27B48-A6F9-460A-A675-021F5854FE22; | ||||
|       `, | ||||
|       { look: 'handDrawn', handDrawnSeed: 1, fontFamily: 'courier' } | ||||
|       { look: 'handDrawn', fontFamily: 'courier' } | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
| @@ -364,7 +362,6 @@ describe('Flowchart HandDrawn', () => { | ||||
|       `, | ||||
|       { | ||||
|         look: 'handDrawn', | ||||
|         handDrawnSeed: 1, | ||||
|         listUrl: false, | ||||
|         listId: 'color styling', | ||||
|         fontFamily: 'courier', | ||||
| @@ -390,7 +387,6 @@ describe('Flowchart HandDrawn', () => { | ||||
|       `, | ||||
|       { | ||||
|         look: 'handDrawn', | ||||
|         handDrawnSeed: 1, | ||||
|         listUrl: false, | ||||
|         listId: 'color styling', | ||||
|         fontFamily: 'courier', | ||||
| @@ -411,7 +407,6 @@ describe('Flowchart HandDrawn', () => { | ||||
|       `, | ||||
|       { | ||||
|         look: 'handDrawn', | ||||
|         handDrawnSeed: 1, | ||||
|         flowchart: { htmlLabels: false }, | ||||
|         fontFamily: 'courier', | ||||
|       } | ||||
| @@ -435,7 +430,6 @@ describe('Flowchart HandDrawn', () => { | ||||
|       `, | ||||
|       { | ||||
|         look: 'handDrawn', | ||||
|         handDrawnSeed: 1, | ||||
|         flowchart: { htmlLabels: false }, | ||||
|         fontFamily: 'courier', | ||||
|       } | ||||
| @@ -457,7 +451,6 @@ describe('Flowchart HandDrawn', () => { | ||||
|       `, | ||||
|       { | ||||
|         look: 'handDrawn', | ||||
|         handDrawnSeed: 1, | ||||
|         flowchart: { htmlLabels: false }, | ||||
|         fontFamily: 'courier', | ||||
|       } | ||||
| @@ -471,7 +464,6 @@ describe('Flowchart HandDrawn', () => { | ||||
|       `, | ||||
|       { | ||||
|         look: 'handDrawn', | ||||
|         handDrawnSeed: 1, | ||||
|         flowchart: { htmlLabels: false }, | ||||
|         fontFamily: 'courier', | ||||
|       } | ||||
| @@ -485,7 +477,6 @@ describe('Flowchart HandDrawn', () => { | ||||
|       `, | ||||
|       { | ||||
|         look: 'handDrawn', | ||||
|         handDrawnSeed: 1, | ||||
|         flowchart: { htmlLabels: false }, | ||||
|         fontFamily: 'courier', | ||||
|       } | ||||
| @@ -500,7 +491,6 @@ describe('Flowchart HandDrawn', () => { | ||||
|       `, | ||||
|       { | ||||
|         look: 'handDrawn', | ||||
|         handDrawnSeed: 1, | ||||
|         flowchart: { htmlLabels: false }, | ||||
|         fontFamily: 'courier', | ||||
|       } | ||||
| @@ -527,7 +517,6 @@ describe('Flowchart HandDrawn', () => { | ||||
|       class A someclass;`, | ||||
|       { | ||||
|         look: 'handDrawn', | ||||
|         handDrawnSeed: 1, | ||||
|         flowchart: { htmlLabels: false }, | ||||
|         fontFamily: 'courier', | ||||
|       } | ||||
| @@ -544,7 +533,7 @@ describe('Flowchart HandDrawn', () => { | ||||
|       C -->|Two| E[iPhone] | ||||
|       C -->|Three| F[fa:fa-car Car] | ||||
|       `, | ||||
|       { look: 'handDrawn', handDrawnSeed: 1, flowchart: { nodeSpacing: 50 }, fontFamily: 'courier' } | ||||
|       { look: 'handDrawn', flowchart: { nodeSpacing: 50 }, fontFamily: 'courier' } | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
| @@ -560,7 +549,6 @@ describe('Flowchart HandDrawn', () => { | ||||
|       `, | ||||
|       { | ||||
|         look: 'handDrawn', | ||||
|         handDrawnSeed: 1, | ||||
|         flowchart: { rankSpacing: '100' }, | ||||
|         fontFamily: 'courier', | ||||
|       } | ||||
| @@ -578,7 +566,6 @@ describe('Flowchart HandDrawn', () => { | ||||
|       `, | ||||
|       { | ||||
|         look: 'handDrawn', | ||||
|         handDrawnSeed: 1, | ||||
|         flowchart: { htmlLabels: false }, | ||||
|         fontFamily: 'courier', | ||||
|       } | ||||
| @@ -603,7 +590,7 @@ describe('Flowchart HandDrawn', () => { | ||||
|       click E "notes://do-your-thing/id" "other protocol test" | ||||
|       click F "javascript:alert('test')" "script test" | ||||
|       `, | ||||
|       { look: 'handDrawn', handDrawnSeed: 1, securityLevel: 'loose', fontFamily: 'courier' } | ||||
|       { look: 'handDrawn', securityLevel: 'loose', fontFamily: 'courier' } | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
| @@ -623,7 +610,7 @@ describe('Flowchart HandDrawn', () => { | ||||
|       click B "index.html#link-clicked" "link test" | ||||
|       click D testClick "click test" | ||||
|       `, | ||||
|       { look: 'handDrawn', handDrawnSeed: 1, flowchart: { htmlLabels: true } } | ||||
|       { look: 'handDrawn', flowchart: { htmlLabels: true } } | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
| @@ -645,7 +632,6 @@ describe('Flowchart HandDrawn', () => { | ||||
|       `, | ||||
|       { | ||||
|         look: 'handDrawn', | ||||
|         handDrawnSeed: 1, | ||||
|         flowchart: { htmlLabels: false }, | ||||
|         fontFamily: 'courier', | ||||
|       } | ||||
| @@ -664,7 +650,7 @@ describe('Flowchart HandDrawn', () => { | ||||
|       class A myClass1 | ||||
|       class D myClass2 | ||||
|       `, | ||||
|       { look: 'handDrawn', handDrawnSeed: 1, flowchart: { htmlLabels: true } } | ||||
|       { look: 'handDrawn', flowchart: { htmlLabels: true } } | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
| @@ -682,7 +668,6 @@ describe('Flowchart HandDrawn', () => { | ||||
|       `, | ||||
|       { | ||||
|         look: 'handDrawn', | ||||
|         handDrawnSeed: 1, | ||||
|         flowchart: { htmlLabels: false }, | ||||
|         fontFamily: 'courier', | ||||
|       } | ||||
| @@ -711,7 +696,6 @@ describe('Flowchart HandDrawn', () => { | ||||
|       `, | ||||
|       { | ||||
|         look: 'handDrawn', | ||||
|         handDrawnSeed: 1, | ||||
|         flowchart: { htmlLabels: false }, | ||||
|         fontFamily: 'courier', | ||||
|       } | ||||
| @@ -728,7 +712,6 @@ describe('Flowchart HandDrawn', () => { | ||||
|       `, | ||||
|       { | ||||
|         look: 'handDrawn', | ||||
|         handDrawnSeed: 1, | ||||
|         flowchart: { htmlLabels: false }, | ||||
|         fontFamily: 'courier', | ||||
|       } | ||||
| @@ -752,7 +735,6 @@ describe('Flowchart HandDrawn', () => { | ||||
|       `, | ||||
|       { | ||||
|         look: 'handDrawn', | ||||
|         handDrawnSeed: 1, | ||||
|         flowchart: { htmlLabels: false }, | ||||
|         fontFamily: 'courier', | ||||
|       } | ||||
| @@ -769,7 +751,7 @@ describe('Flowchart HandDrawn', () => { | ||||
|       C -->|Two| E[iPhone] | ||||
|       C -->|Three| F[fa:fa-car Car] | ||||
|       `, | ||||
|       { look: 'handDrawn', handDrawnSeed: 1, flowchart: { diagramPadding: 0 } } | ||||
|       { look: 'handDrawn', flowchart: { diagramPadding: 0 } } | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
| @@ -804,7 +786,7 @@ describe('Flowchart HandDrawn', () => { | ||||
|       `graph TD | ||||
|         a["<strong>Haiya</strong>"]-->b | ||||
|       `, | ||||
|       { look: 'handDrawn', handDrawnSeed: 1, htmlLabels: false, flowchart: { htmlLabels: false } } | ||||
|       { look: 'handDrawn', htmlLabels: false, flowchart: { htmlLabels: false } } | ||||
|     ); | ||||
|   }); | ||||
|   it('FDH37: should render non-escaped with html labels', () => { | ||||
| @@ -814,7 +796,6 @@ describe('Flowchart HandDrawn', () => { | ||||
|       `, | ||||
|       { | ||||
|         look: 'handDrawn', | ||||
|         handDrawnSeed: 1, | ||||
|         htmlLabels: true, | ||||
|         flowchart: { htmlLabels: true }, | ||||
|         securityLevel: 'loose', | ||||
| @@ -830,7 +811,7 @@ describe('Flowchart HandDrawn', () => { | ||||
|       C -->|Two| E[iPhone] | ||||
|       C -->|Three| F[fa:fa-car Car] | ||||
|       `, | ||||
|       { look: 'handDrawn', handDrawnSeed: 1, flowchart: { useMaxWidth: true } } | ||||
|       { look: 'handDrawn', flowchart: { useMaxWidth: true } } | ||||
|     ); | ||||
|     cy.get('svg').should((svg) => { | ||||
|       expect(svg).to.have.attr('width', '100%'); | ||||
| @@ -853,7 +834,7 @@ describe('Flowchart HandDrawn', () => { | ||||
|       C -->|Two| E[iPhone] | ||||
|       C -->|Three| F[fa:fa-car Car] | ||||
|       `, | ||||
|       { look: 'handDrawn', handDrawnSeed: 1, flowchart: { useMaxWidth: false } } | ||||
|       { look: 'handDrawn', flowchart: { useMaxWidth: false } } | ||||
|     ); | ||||
|     cy.get('svg').should((svg) => { | ||||
|       // const height = parseFloat(svg.attr('height')); | ||||
| @@ -874,7 +855,6 @@ describe('Flowchart HandDrawn', () => { | ||||
|       `, | ||||
|       { | ||||
|         look: 'handDrawn', | ||||
|         handDrawnSeed: 1, | ||||
|         htmlLabels: true, | ||||
|         flowchart: { htmlLabels: true }, | ||||
|         securityLevel: 'loose', | ||||
| @@ -904,7 +884,6 @@ describe('Flowchart HandDrawn', () => { | ||||
|       `, | ||||
|       { | ||||
|         look: 'handDrawn', | ||||
|         handDrawnSeed: 1, | ||||
|         htmlLabels: true, | ||||
|         flowchart: { htmlLabels: true }, | ||||
|         securityLevel: 'loose', | ||||
| @@ -919,7 +898,6 @@ graph TD | ||||
|       `, | ||||
|       { | ||||
|         look: 'handDrawn', | ||||
|         handDrawnSeed: 1, | ||||
|         htmlLabels: true, | ||||
|         flowchart: { htmlLabels: true }, | ||||
|         securityLevel: 'loose', | ||||
| @@ -937,7 +915,6 @@ graph TD | ||||
|       `, | ||||
|       { | ||||
|         look: 'handDrawn', | ||||
|         handDrawnSeed: 1, | ||||
|         htmlLabels: true, | ||||
|         flowchart: { htmlLabels: true }, | ||||
|         securityLevel: 'loose', | ||||
| @@ -977,7 +954,6 @@ graph TD | ||||
|       `, | ||||
|       { | ||||
|         look: 'handDrawn', | ||||
|         handDrawnSeed: 1, | ||||
|         htmlLabels: true, | ||||
|         flowchart: { htmlLabels: true }, | ||||
|         securityLevel: 'loose', | ||||
| @@ -999,7 +975,6 @@ graph TD | ||||
|       `, | ||||
|       { | ||||
|         look: 'handDrawn', | ||||
|         handDrawnSeed: 1, | ||||
|         htmlLabels: true, | ||||
|         flowchart: { htmlLabels: true }, | ||||
|         securityLevel: 'loose', | ||||
| @@ -1016,7 +991,6 @@ graph TD | ||||
|       `, | ||||
|       { | ||||
|         look: 'handDrawn', | ||||
|         handDrawnSeed: 1, | ||||
|         htmlLabels: true, | ||||
|         flowchart: { htmlLabels: true }, | ||||
|         securityLevel: 'loose', | ||||
| @@ -1032,7 +1006,6 @@ graph TD | ||||
|       `, | ||||
|       { | ||||
|         look: 'handDrawn', | ||||
|         handDrawnSeed: 1, | ||||
|         htmlLabels: true, | ||||
|         flowchart: { htmlLabels: true }, | ||||
|         securityLevel: 'loose', | ||||
| @@ -1051,7 +1024,6 @@ graph TD | ||||
|     `, | ||||
|       { | ||||
|         look: 'handDrawn', | ||||
|         handDrawnSeed: 1, | ||||
|         flowchart: { htmlLabels: true }, | ||||
|         securityLevel: 'loose', | ||||
|       } | ||||
|   | ||||
							
								
								
									
										28
									
								
								cypress/integration/rendering/flowchart-icon.spec.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								cypress/integration/rendering/flowchart-icon.spec.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | ||||
| import { imgSnapshotTest } from '../../helpers/util.ts'; | ||||
|  | ||||
| const themes = ['default', 'forest', 'dark', 'base', 'neutral']; | ||||
|  | ||||
| describe('when rendering flowchart with icons', () => { | ||||
|   for (const theme of themes) { | ||||
|     it(`should render icons from fontawesome library on theme ${theme}`, () => { | ||||
|       imgSnapshotTest( | ||||
|         `flowchart TD | ||||
|             A("fab:fa-twitter Twitter") --> B("fab:fa-facebook Facebook") | ||||
|             B --> C("fa:fa-coffee Coffee") | ||||
|             C --> D("fa:fa-car Car") | ||||
|             D --> E("fab:fa-github GitHub") | ||||
|         `, | ||||
|         { theme } | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`should render registered icons on theme ${theme}`, () => { | ||||
|       imgSnapshotTest( | ||||
|         `flowchart TD | ||||
|             A("fa:fa-bell Bell")  | ||||
|         `, | ||||
|         { theme } | ||||
|       ); | ||||
|     }); | ||||
|   } | ||||
| }); | ||||
							
								
								
									
										142
									
								
								cypress/integration/rendering/flowchart-shape-alias.spec.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										142
									
								
								cypress/integration/rendering/flowchart-shape-alias.spec.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,142 @@ | ||||
| import { imgSnapshotTest } from '../../helpers/util.ts'; | ||||
|  | ||||
| const aliasSet1 = ['process', 'rect', 'proc', 'rectangle'] as const; | ||||
|  | ||||
| const aliasSet2 = ['event', 'rounded'] as const; | ||||
|  | ||||
| const aliasSet3 = ['stadium', 'pill', 'terminal'] as const; | ||||
|  | ||||
| const aliasSet4 = ['fr-rect', 'subproc', 'subprocess', 'framed-rectangle', 'subroutine'] as const; | ||||
|  | ||||
| const aliasSet5 = ['db', 'database', 'cylinder', 'cyl'] as const; | ||||
|  | ||||
| const aliasSet6 = ['diam', 'decision', 'diamond'] as const; | ||||
|  | ||||
| const aliasSet7 = ['hex', 'hexagon', 'prepare'] as const; | ||||
|  | ||||
| const aliasSet8 = ['lean-r', 'lean-right', 'in-out'] as const; | ||||
|  | ||||
| const aliasSet9 = ['lean-l', 'lean-left', 'out-in'] as const; | ||||
|  | ||||
| const aliasSet10 = ['trap-b', 'trapezoid-bottom', 'priority'] as const; | ||||
|  | ||||
| const aliasSet11 = ['trap-t', 'trapezoid-top', 'manual'] as const; | ||||
|  | ||||
| const aliasSet12 = ['dbl-circ', 'double-circle'] as const; | ||||
|  | ||||
| const aliasSet13 = ['notched-rectangle', 'card', 'notch-rect'] as const; | ||||
|  | ||||
| const aliasSet14 = [ | ||||
|   'lin-rect', | ||||
|   'lined-rectangle', | ||||
|   'lin-proc', | ||||
|   'lined-process', | ||||
|   'shaded-process', | ||||
| ] as const; | ||||
|  | ||||
| const aliasSet15 = ['sm-circ', 'small-circle', 'start'] as const; | ||||
|  | ||||
| const aliasSet16 = ['fr-circ', 'framed-circle', 'stop'] as const; | ||||
|  | ||||
| const aliasSet17 = ['fork', 'join'] as const; | ||||
| // brace-r', 'braces' | ||||
| const aliasSet18 = ['comment', 'brace-l'] as const; | ||||
|  | ||||
| const aliasSet19 = ['bolt', 'com-link', 'lightning-bolt'] as const; | ||||
|  | ||||
| const aliasSet20 = ['doc', 'document'] as const; | ||||
|  | ||||
| const aliasSet21 = ['delay', 'half-rounded-rectangle'] as const; | ||||
|  | ||||
| const aliasSet22 = ['h-cyl', 'das', 'horizontal-cylinder'] as const; | ||||
|  | ||||
| const aliasSet23 = ['lin-cyl', 'disk', 'lined-cylinder'] as const; | ||||
|  | ||||
| const aliasSet24 = ['curv-trap', 'display', 'curved-trapezoid'] as const; | ||||
|  | ||||
| const aliasSet25 = ['div-rect', 'div-proc', 'divided-rectangle', 'divided-process'] as const; | ||||
|  | ||||
| const aliasSet26 = ['extract', 'tri', 'triangle'] as const; | ||||
|  | ||||
| const aliasSet27 = ['win-pane', 'internal-storage', 'window-pane'] as const; | ||||
|  | ||||
| const aliasSet28 = ['f-circ', 'junction', 'filled-circle'] as const; | ||||
|  | ||||
| const aliasSet29 = ['lin-doc', 'lined-document'] as const; | ||||
|  | ||||
| const aliasSet30 = ['notch-pent', 'loop-limit', 'notched-pentagon'] as const; | ||||
|  | ||||
| const aliasSet31 = ['flip-tri', 'manual-file', 'flipped-triangle'] as const; | ||||
|  | ||||
| const aliasSet32 = ['sl-rect', 'manual-input', 'sloped-rectangle'] as const; | ||||
|  | ||||
| const aliasSet33 = ['docs', 'documents', 'st-doc', 'stacked-document'] as const; | ||||
|  | ||||
| const aliasSet34 = ['procs', 'processes', 'st-rect', 'stacked-rectangle'] as const; | ||||
|  | ||||
| const aliasSet35 = ['flag', 'paper-tape'] as const; | ||||
|  | ||||
| const aliasSet36 = ['bow-rect', 'stored-data', 'bow-tie-rectangle'] as const; | ||||
|  | ||||
| const aliasSet37 = ['cross-circ', 'summary', 'crossed-circle'] as const; | ||||
|  | ||||
| const aliasSet38 = ['tag-doc', 'tagged-document'] as const; | ||||
|  | ||||
| const aliasSet39 = ['tag-rect', 'tag-proc', 'tagged-rectangle', 'tagged-process'] as const; | ||||
|  | ||||
| const aliasSet40 = ['collate', 'hourglass'] as const; | ||||
|  | ||||
| // Aggregate all alias sets into a single array | ||||
| const aliasSets = [ | ||||
|   aliasSet1, | ||||
|   aliasSet2, | ||||
|   aliasSet3, | ||||
|   aliasSet4, | ||||
|   aliasSet5, | ||||
|   aliasSet6, | ||||
|   aliasSet7, | ||||
|   aliasSet8, | ||||
|   aliasSet9, | ||||
|   aliasSet10, | ||||
|   aliasSet11, | ||||
|   aliasSet12, | ||||
|   aliasSet13, | ||||
|   aliasSet14, | ||||
|   aliasSet15, | ||||
|   aliasSet16, | ||||
|   aliasSet17, | ||||
|   aliasSet18, | ||||
|   aliasSet19, | ||||
|   aliasSet20, | ||||
|   aliasSet21, | ||||
|   aliasSet22, | ||||
|   aliasSet23, | ||||
|   aliasSet24, | ||||
|   aliasSet25, | ||||
|   aliasSet26, | ||||
|   aliasSet27, | ||||
|   aliasSet28, | ||||
|   aliasSet29, | ||||
|   aliasSet30, | ||||
|   aliasSet31, | ||||
|   aliasSet32, | ||||
|   aliasSet33, | ||||
|   aliasSet34, | ||||
|   aliasSet35, | ||||
|   aliasSet36, | ||||
|   aliasSet37, | ||||
|   aliasSet38, | ||||
|   aliasSet39, | ||||
| ] as const; | ||||
|  | ||||
| aliasSets.forEach((aliasSet) => { | ||||
|   describe(`Test ${aliasSet.join(',')} `, () => { | ||||
|     it(`All ${aliasSet.join(',')} should render same shape`, () => { | ||||
|       let flowchartCode = `flowchart \n`; | ||||
|       aliasSet.forEach((alias, index) => { | ||||
|         flowchartCode += ` n${index}@{ shape: ${alias}, label: "${alias}" }\n`; | ||||
|       }); | ||||
|       imgSnapshotTest(flowchartCode); | ||||
|     }); | ||||
|   }); | ||||
| }); | ||||
| @@ -99,7 +99,7 @@ describe('Flowchart v2', () => { | ||||
|       const style = svg.attr('style'); | ||||
|       expect(style).to.match(/^max-width: [\d.]+px;$/); | ||||
|       const maxWidthValue = parseFloat(style.match(/[\d.]+/g).join('')); | ||||
|       expect(maxWidthValue).to.be.within(417 * 0.95, 417 * 1.05); | ||||
|       expect(maxWidthValue).to.be.within(440 * 0.95, 440 * 1.05); | ||||
|     }); | ||||
|   }); | ||||
|   it('8: should render a flowchart when useMaxWidth is false', () => { | ||||
| @@ -118,7 +118,7 @@ describe('Flowchart v2', () => { | ||||
|       const width = parseFloat(svg.attr('width')); | ||||
|       // use within because the absolute value can be slightly different depending on the environment ±5% | ||||
|       // expect(height).to.be.within(446 * 0.95, 446 * 1.05); | ||||
|       expect(width).to.be.within(417 * 0.95, 417 * 1.05); | ||||
|       expect(width).to.be.within(440 * 0.95, 440 * 1.05); | ||||
|       expect(svg).to.not.have.attr('style'); | ||||
|     }); | ||||
|   }); | ||||
| @@ -198,13 +198,13 @@ describe('Flowchart v2', () => { | ||||
|       `flowchart TB | ||||
|   internet | ||||
|   nat | ||||
|   routeur | ||||
|   router | ||||
|   lb1 | ||||
|   lb2 | ||||
|   compute1 | ||||
|   compute2 | ||||
|   subgraph project | ||||
|   routeur | ||||
|   router | ||||
|   nat | ||||
|     subgraph subnet1 | ||||
|       compute1 | ||||
| @@ -215,8 +215,8 @@ describe('Flowchart v2', () => { | ||||
|       lb2 | ||||
|     end | ||||
|   end | ||||
|   internet --> routeur | ||||
|   routeur --> subnet1 & subnet2 | ||||
|   internet --> router | ||||
|   router --> subnet1 & subnet2 | ||||
|   subnet1 & subnet2 --> nat --> internet | ||||
|       `, | ||||
|       { htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' } | ||||
| @@ -433,7 +433,7 @@ flowchart TD | ||||
|       { htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' } | ||||
|     ); | ||||
|   }); | ||||
|   it('63: title on subgraphs should be themable', () => { | ||||
|   it('63: title on subgraphs should be themeable', () => { | ||||
|     imgSnapshotTest( | ||||
|       ` | ||||
|       %%{init:{"theme":"base", "themeVariables": {"primaryColor":"#411d4e", "titleColor":"white", "darkMode":true}}}%% | ||||
| @@ -699,7 +699,7 @@ A --> B | ||||
|       { flowchart: { titleTopMargin: 10 } } | ||||
|     ); | ||||
|   }); | ||||
|   it('3192: It should be possieble to render flowcharts with invisible edges', () => { | ||||
|   it('3192: It should be possible to render flowcharts with invisible edges', () => { | ||||
|     imgSnapshotTest( | ||||
|       `--- | ||||
| title: Simple flowchart with invisible edges | ||||
| @@ -1076,4 +1076,41 @@ end | ||||
|       ); | ||||
|     }); | ||||
|   }); | ||||
|   describe('New @ syntax for node metadata edge cases', () => { | ||||
|     it('should be possible to use @  syntax to add labels on multi nodes', () => { | ||||
|       imgSnapshotTest( | ||||
|         `flowchart TB | ||||
|        n2["label for n2"] &   n4@{ label: "label for n4"}   & n5@{ label: "label for n5"} | ||||
|         `, | ||||
|         {} | ||||
|       ); | ||||
|     }); | ||||
|     it('should be possible to use @  syntax to add labels with trail spaces and &', () => { | ||||
|       imgSnapshotTest( | ||||
|         `flowchart TB | ||||
|        n2["label for n2"] &   n4@{ label: "label for n4"}   & n5@{ label: "label for n5"}    | ||||
|         `, | ||||
|         {} | ||||
|       ); | ||||
|     }); | ||||
|     it('should be possible to use @  syntax to add labels with trail spaces', () => { | ||||
|       imgSnapshotTest( | ||||
|         `flowchart TB | ||||
|        n2["label for n2"] | ||||
|        n4@{ label: "label for n4"} | ||||
|        n5@{ label: "label for n5"}   | ||||
|         `, | ||||
|         {} | ||||
|       ); | ||||
|     }); | ||||
|     it('should be possible to use @  syntax to add labels with trail spaces and edge/link', () => { | ||||
|       imgSnapshotTest( | ||||
|         `flowchart TD | ||||
|     A["A"] --> B["for B"] &    C@{ label: "for c"} & E@{label : "for E"}   | ||||
|     D@{label: "for D"}      | ||||
|         `, | ||||
|         {} | ||||
|       ); | ||||
|     }); | ||||
|   }); | ||||
| }); | ||||
|   | ||||
| @@ -895,7 +895,7 @@ graph TD | ||||
|     imgSnapshotTest( | ||||
|       ` | ||||
|       graph TD | ||||
|         classDef default fill:#a34,stroke:#000,stroke-width:4px,color:#fff  | ||||
|         classDef default fill:#a34,stroke:#000,stroke-width:4px,color:#fff | ||||
|         hello --> default | ||||
|       `, | ||||
|       { htmlLabels: true, flowchart: { htmlLabels: true }, securityLevel: 'loose' } | ||||
| @@ -917,4 +917,21 @@ graph TD | ||||
|       } | ||||
|     ); | ||||
|   }); | ||||
|   it('#6369: edge color should affect arrow head', () => { | ||||
|     imgSnapshotTest( | ||||
|       ` | ||||
|     flowchart LR | ||||
|         A --> B | ||||
|         A --> C | ||||
|         C --> D | ||||
|  | ||||
|         linkStyle 0 stroke:#D50000 | ||||
|         linkStyle 2 stroke:#D50000 | ||||
|     `, | ||||
|       { | ||||
|         flowchart: { htmlLabels: true }, | ||||
|         securityLevel: 'loose', | ||||
|       } | ||||
|     ); | ||||
|   }); | ||||
| }); | ||||
|   | ||||
| @@ -117,7 +117,7 @@ describe('Gantt diagram', () => { | ||||
|       {} | ||||
|     ); | ||||
|   }); | ||||
|   it('should FAIL redering a gantt chart for issue #1060 with invalid date', () => { | ||||
|   it('should FAIL rendering a gantt chart for issue #1060 with invalid date', () => { | ||||
|     imgSnapshotTest( | ||||
|       ` | ||||
|       gantt | ||||
| @@ -358,6 +358,23 @@ describe('Gantt diagram', () => { | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   it('should render a gantt diagram with a vert tag', () => { | ||||
|     imgSnapshotTest( | ||||
|       ` | ||||
|       gantt | ||||
|         title A Gantt Diagram | ||||
|         dateFormat   ss | ||||
|         axisFormat   %Ss | ||||
|  | ||||
|         section Section | ||||
|         A task           : a1, 00, 6s | ||||
|         Milestone     : vert, 01, | ||||
|         section Another | ||||
|         Task in sec      : 06, 3s | ||||
|         another task     : 3s | ||||
|       ` | ||||
|     ); | ||||
|   }); | ||||
|   it('should render a gantt diagram with tick is 2 milliseconds', () => { | ||||
|     imgSnapshotTest( | ||||
|       ` | ||||
| @@ -573,7 +590,7 @@ describe('Gantt diagram', () => { | ||||
|       ` | ||||
|     ); | ||||
|   }); | ||||
|   it('should render a gantt diagram exculding friday and saturday', () => { | ||||
|   it('should render a gantt diagram excluding friday and saturday', () => { | ||||
|     imgSnapshotTest( | ||||
|       `gantt | ||||
|       title A Gantt Diagram | ||||
| @@ -584,7 +601,7 @@ describe('Gantt diagram', () => { | ||||
|       A task :a1, 2024-02-28, 10d` | ||||
|     ); | ||||
|   }); | ||||
|   it('should render a gantt diagram exculding saturday and sunday', () => { | ||||
|   it('should render a gantt diagram excluding saturday and sunday', () => { | ||||
|     imgSnapshotTest( | ||||
|       `gantt | ||||
|       title A Gantt Diagram | ||||
| @@ -671,7 +688,7 @@ describe('Gantt diagram', () => { | ||||
|       title Gantt Digram | ||||
|       dateFormat  YYYY-MM-DD | ||||
|       section Section | ||||
|       ;A task with a semiclon           :a1, 2014-01-01, 30d | ||||
|       ;A task with a semicolon           :a1, 2014-01-01, 30d | ||||
|       Another task     :after a1  , 20d | ||||
|       section Another | ||||
|       Task in sec      :2014-01-12  , 12d | ||||
|   | ||||
| @@ -11,7 +11,7 @@ describe('Git Graph diagram', () => { | ||||
|       {} | ||||
|     ); | ||||
|   }); | ||||
|   it('2: should render a simple gitgraph with commit on main branch with Id', () => { | ||||
|   it('2: should render a simple gitgraph with commit on main branch with id', () => { | ||||
|     imgSnapshotTest( | ||||
|       `gitGraph | ||||
|        commit id: "One" | ||||
| @@ -253,7 +253,7 @@ describe('Git Graph diagram', () => { | ||||
|       ` | ||||
|       gitGraph | ||||
|       checkout main | ||||
|       %% Make sure to manually set the ID of all commits, for consistent visual tests | ||||
|       %% Make sure to manually set the id of all commits, for consistent visual tests | ||||
|       commit id: "1-abcdefg" | ||||
|       checkout main | ||||
|       branch branch1 | ||||
| @@ -343,7 +343,7 @@ gitGraph | ||||
|       {} | ||||
|     ); | ||||
|   }); | ||||
|   it('16: should render a simple gitgraph with commit on main branch with Id | Vertical Branch', () => { | ||||
|   it('16: should render a simple gitgraph with commit on main branch with id | Vertical Branch', () => { | ||||
|     imgSnapshotTest( | ||||
|       `gitGraph TB: | ||||
|        commit id: "One" | ||||
| @@ -585,7 +585,7 @@ gitGraph | ||||
|       ` | ||||
|       gitGraph TB: | ||||
|       checkout main | ||||
|       %% Make sure to manually set the ID of all commits, for consistent visual tests | ||||
|       %% Make sure to manually set the id of all commits, for consistent visual tests | ||||
|       commit id: "1-abcdefg" | ||||
|       checkout main | ||||
|       branch branch1 | ||||
| @@ -1024,7 +1024,7 @@ gitGraph TB: | ||||
|         {} | ||||
|       ); | ||||
|     }); | ||||
|     it('51: should render a simple gitgraph with commit on main branch with Id | Vertical Branch - Bottom-to-top', () => { | ||||
|     it('51: should render a simple gitgraph with commit on main branch with id | Vertical Branch - Bottom-to-top', () => { | ||||
|       imgSnapshotTest( | ||||
|         `gitGraph BT: | ||||
|          commit id: "One" | ||||
| @@ -1266,7 +1266,7 @@ gitGraph TB: | ||||
|         ` | ||||
|         gitGraph BT: | ||||
|         checkout main | ||||
|         %% Make sure to manually set the ID of all commits, for consistent visual tests | ||||
|         %% Make sure to manually set the id of all commits, for consistent visual tests | ||||
|         commit id: "1-abcdefg" | ||||
|         checkout main | ||||
|         branch branch1 | ||||
| @@ -1491,7 +1491,7 @@ gitGraph TB: | ||||
|         ` | ||||
|         gitGraph | ||||
|         switch main | ||||
|         %% Make sure to manually set the ID of all commits, for consistent visual tests | ||||
|         %% Make sure to manually set the id of all commits, for consistent visual tests | ||||
|         commit id: "1-abcdefg" | ||||
|         switch main | ||||
|         branch branch1 | ||||
|   | ||||
							
								
								
									
										143
									
								
								cypress/integration/rendering/iconShape.spec.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										143
									
								
								cypress/integration/rendering/iconShape.spec.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,143 @@ | ||||
| import { imgSnapshotTest } from '../../helpers/util'; | ||||
|  | ||||
| const looks = ['classic', 'handDrawn'] as const; | ||||
| const directions = [ | ||||
|   'TB', | ||||
|   //'BT', | ||||
|   'LR', | ||||
|   //  'RL' | ||||
| ] as const; | ||||
| const forms = [undefined, 'square', 'circle', 'rounded'] as const; | ||||
| const labelPos = [undefined, 't', 'b'] as const; | ||||
|  | ||||
| looks.forEach((look) => { | ||||
|   directions.forEach((direction) => { | ||||
|     forms.forEach((form) => { | ||||
|       labelPos.forEach((pos) => { | ||||
|         describe(`Test iconShape in ${form ? `${form} form,` : ''} ${look} look and dir ${direction} with label position ${pos ? pos : 'not defined'}`, () => { | ||||
|           it(`without label`, () => { | ||||
|             let flowchartCode = `flowchart ${direction}\n`; | ||||
|             flowchartCode += `  nA --> nAA@{ icon: 'fa:bell'`; | ||||
|             if (form) { | ||||
|               flowchartCode += `, form: '${form}'`; | ||||
|             } | ||||
|             flowchartCode += ` }\n`; | ||||
|             imgSnapshotTest(flowchartCode, { look }); | ||||
|           }); | ||||
|  | ||||
|           it(`with label`, () => { | ||||
|             let flowchartCode = `flowchart ${direction}\n`; | ||||
|             flowchartCode += `  nA --> nAA@{ icon: 'fa:bell', label: 'This is a label for icon shape'`; | ||||
|             if (form) { | ||||
|               flowchartCode += `, form: '${form}'`; | ||||
|             } | ||||
|             if (pos) { | ||||
|               flowchartCode += `, pos: '${pos}'`; | ||||
|             } | ||||
|             flowchartCode += ` }\n`; | ||||
|             imgSnapshotTest(flowchartCode, { look }); | ||||
|           }); | ||||
|  | ||||
|           it(`with very long label`, () => { | ||||
|             let flowchartCode = `flowchart ${direction}\n`; | ||||
|             flowchartCode += `  nA --> nAA@{ icon: 'fa:bell', label: 'This is a very very very very very long long long label for icon shape'`; | ||||
|             if (form) { | ||||
|               flowchartCode += `, form: '${form}'`; | ||||
|             } | ||||
|             if (pos) { | ||||
|               flowchartCode += `, pos: '${pos}'`; | ||||
|             } | ||||
|             flowchartCode += ` }\n`; | ||||
|             imgSnapshotTest(flowchartCode, { look }); | ||||
|           }); | ||||
|  | ||||
|           it(`with markdown htmlLabels:true`, () => { | ||||
|             let flowchartCode = `flowchart ${direction}\n`; | ||||
|             flowchartCode += `  nA --> nAA@{ icon: 'fa:bell', label: 'This is **bold** </br>and <strong>strong</strong> for icon shape'`; | ||||
|             if (form) { | ||||
|               flowchartCode += `, form: '${form}'`; | ||||
|             } | ||||
|             if (pos) { | ||||
|               flowchartCode += `, pos: '${pos}'`; | ||||
|             } | ||||
|             flowchartCode += ` }\n`; | ||||
|             imgSnapshotTest(flowchartCode, { look }); | ||||
|           }); | ||||
|  | ||||
|           it(`with markdown htmlLabels:false`, () => { | ||||
|             let flowchartCode = `flowchart ${direction}\n`; | ||||
|             flowchartCode += `  nA --> nAA@{ icon: 'fa:bell', label: 'This is **bold** </br>and <strong>strong</strong> for icon shape'`; | ||||
|             if (form) { | ||||
|               flowchartCode += `, form: '${form}'`; | ||||
|             } | ||||
|             if (pos) { | ||||
|               flowchartCode += `, pos: '${pos}'`; | ||||
|             } | ||||
|             flowchartCode += ` }\n`; | ||||
|             imgSnapshotTest(flowchartCode, { | ||||
|               look, | ||||
|               htmlLabels: false, | ||||
|               flowchart: { htmlLabels: false }, | ||||
|             }); | ||||
|           }); | ||||
|  | ||||
|           it(`with styles`, () => { | ||||
|             let flowchartCode = `flowchart ${direction}\n`; | ||||
|             flowchartCode += `  nA --> nAA@{ icon: 'fa:bell', label: 'new icon shape'`; | ||||
|             if (form) { | ||||
|               flowchartCode += `, form: '${form}'`; | ||||
|             } | ||||
|             if (pos) { | ||||
|               flowchartCode += `, pos: '${pos}'`; | ||||
|             } | ||||
|             flowchartCode += ` }\n`; | ||||
|             flowchartCode += `  style nAA fill:#f9f,stroke:#333,stroke-width:4px \n`; | ||||
|             imgSnapshotTest(flowchartCode, { look }); | ||||
|           }); | ||||
|  | ||||
|           it(`with classDef`, () => { | ||||
|             let flowchartCode = `flowchart ${direction}\n`; | ||||
|             flowchartCode += `  classDef customClazz fill:#bbf,stroke:#f66,stroke-width:2px,color:#fff,stroke-dasharray: 5 5\n`; | ||||
|             flowchartCode += `  nA --> nAA@{ icon: 'fa:bell', label: 'new icon shape'`; | ||||
|             if (form) { | ||||
|               flowchartCode += `, form: '${form}'`; | ||||
|             } | ||||
|             if (pos) { | ||||
|               flowchartCode += `, pos: '${pos}'`; | ||||
|             } | ||||
|             flowchartCode += ` }\n`; | ||||
|             flowchartCode += `  nAA:::customClazz\n`; | ||||
|             imgSnapshotTest(flowchartCode, { look }); | ||||
|           }); | ||||
|         }); | ||||
|       }); | ||||
|     }); | ||||
|   }); | ||||
| }); | ||||
|  | ||||
| describe('Test iconShape with different h', () => { | ||||
|   it('with different h', () => { | ||||
|     let flowchartCode = `flowchart TB\n`; | ||||
|     const icon = 'fa:bell'; | ||||
|     const iconHeight = 64; | ||||
|     flowchartCode += `  nA --> nAA@{ icon: '${icon}', label: 'icon with different h', h: ${iconHeight} }\n`; | ||||
|     imgSnapshotTest(flowchartCode); | ||||
|   }); | ||||
| }); | ||||
|  | ||||
| describe('Test colored iconShape', () => { | ||||
|   it('with no styles', () => { | ||||
|     let flowchartCode = `flowchart TB\n`; | ||||
|     const icon = 'fluent-emoji:tropical-fish'; | ||||
|     flowchartCode += `  nA --> nAA@{ icon: '${icon}', form: 'square', label: 'icon with color' }\n`; | ||||
|     imgSnapshotTest(flowchartCode); | ||||
|   }); | ||||
|  | ||||
|   it('with styles', () => { | ||||
|     let flowchartCode = `flowchart TB\n`; | ||||
|     const icon = 'fluent-emoji:tropical-fish'; | ||||
|     flowchartCode += `  nA --> nAA@{ icon: '${icon}', form: 'square', label: 'icon with color' }\n`; | ||||
|     flowchartCode += `  style nAA fill:#f9f,stroke:#333,stroke-width:4px \n`; | ||||
|     imgSnapshotTest(flowchartCode); | ||||
|   }); | ||||
| }); | ||||
							
								
								
									
										103
									
								
								cypress/integration/rendering/imageShape.spec.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								cypress/integration/rendering/imageShape.spec.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,103 @@ | ||||
| import { imgSnapshotTest } from '../../helpers/util'; | ||||
|  | ||||
| const looks = ['classic', 'handDrawn'] as const; | ||||
| const directions = [ | ||||
|   'TB', | ||||
|   //'BT', | ||||
|   'LR', | ||||
|   //  'RL' | ||||
| ] as const; | ||||
| const labelPos = [undefined, 't', 'b'] as const; | ||||
|  | ||||
| looks.forEach((look) => { | ||||
|   directions.forEach((direction) => { | ||||
|     labelPos.forEach((pos) => { | ||||
|       describe(`Test imageShape in ${look} look and dir ${direction} with label position ${pos ? pos : 'not defined'}`, () => { | ||||
|         it(`without label`, () => { | ||||
|           let flowchartCode = `flowchart ${direction}\n`; | ||||
|           flowchartCode += `  nA --> A@{ img: 'https://cdn.pixabay.com/photo/2020/02/22/18/49/paper-4871356_1280.jpg', w: '100', h: '100' }\n`; | ||||
|           imgSnapshotTest(flowchartCode, { look }); | ||||
|         }); | ||||
|  | ||||
|         it(`with label`, () => { | ||||
|           let flowchartCode = `flowchart ${direction}\n`; | ||||
|           flowchartCode += `  nA --> A@{ img: 'https://cdn.pixabay.com/photo/2020/02/22/18/49/paper-4871356_1280.jpg', label: 'This is a label for image shape'`; | ||||
|  | ||||
|           flowchartCode += `, w: '100', h: '200'`; | ||||
|           if (pos) { | ||||
|             flowchartCode += `, pos: '${pos}'`; | ||||
|           } | ||||
|           flowchartCode += ` }\n`; | ||||
|           imgSnapshotTest(flowchartCode, { look }); | ||||
|         }); | ||||
|  | ||||
|         it(`with very long label`, () => { | ||||
|           let flowchartCode = `flowchart ${direction}\n`; | ||||
|           flowchartCode += `  nA --> A@{ img: 'https://cdn.pixabay.com/photo/2020/02/22/18/49/paper-4871356_1280.jpg', label: 'This is a very very very very very long long long label for image shape'`; | ||||
|  | ||||
|           flowchartCode += `, w: '100', h: '250'`; | ||||
|           if (pos) { | ||||
|             flowchartCode += `, pos: '${pos}'`; | ||||
|           } | ||||
|           flowchartCode += ` }\n`; | ||||
|           imgSnapshotTest(flowchartCode, { look }); | ||||
|         }); | ||||
|  | ||||
|         it(`with markdown htmlLabels:true`, () => { | ||||
|           let flowchartCode = `flowchart ${direction}\n`; | ||||
|           flowchartCode += `  nA --> A@{ img: 'https://cdn.pixabay.com/photo/2020/02/22/18/49/paper-4871356_1280.jpg', label: 'This is **bold** </br>and <strong>strong</strong> for image shape'`; | ||||
|  | ||||
|           flowchartCode += `, w: '550', h: '200'`; | ||||
|           if (pos) { | ||||
|             flowchartCode += `, pos: '${pos}'`; | ||||
|           } | ||||
|           flowchartCode += ` }\n`; | ||||
|           imgSnapshotTest(flowchartCode, { look, htmlLabels: true }); | ||||
|         }); | ||||
|  | ||||
|         it(`with markdown htmlLabels:false`, () => { | ||||
|           let flowchartCode = `flowchart ${direction}\n`; | ||||
|           flowchartCode += `  nA --> A@{ img: 'https://cdn.pixabay.com/photo/2020/02/22/18/49/paper-4871356_1280.jpg', label: 'This is **bold** </br>and <strong>strong</strong> for image shape'`; | ||||
|           flowchartCode += `, w: '250', h: '200'`; | ||||
|  | ||||
|           if (pos) { | ||||
|             flowchartCode += `, pos: '${pos}'`; | ||||
|           } | ||||
|           flowchartCode += ` }\n`; | ||||
|           imgSnapshotTest(flowchartCode, { | ||||
|             look, | ||||
|             htmlLabels: false, | ||||
|             flowchart: { htmlLabels: false }, | ||||
|           }); | ||||
|         }); | ||||
|  | ||||
|         it(`with styles`, () => { | ||||
|           let flowchartCode = `flowchart ${direction}\n`; | ||||
|           flowchartCode += `  nA --> A@{ img: 'https://cdn.pixabay.com/photo/2020/02/22/18/49/paper-4871356_1280.jpg', label: 'new image shape'`; | ||||
|           flowchartCode += `, w: '550', h: '200'`; | ||||
|  | ||||
|           if (pos) { | ||||
|             flowchartCode += `, pos: '${pos}'`; | ||||
|           } | ||||
|           flowchartCode += ` }\n`; | ||||
|           flowchartCode += `  style A fill:#f9f,stroke:#333,stroke-width:4px \n`; | ||||
|           imgSnapshotTest(flowchartCode, { look }); | ||||
|         }); | ||||
|  | ||||
|         it(`with classDef`, () => { | ||||
|           let flowchartCode = `flowchart ${direction}\n`; | ||||
|           flowchartCode += `  classDef customClazz fill:#bbf,stroke:#f66,stroke-width:2px,color:#000000,stroke-dasharray: 5 5\n`; | ||||
|           flowchartCode += `  nA --> A@{ img: 'https://cdn.pixabay.com/photo/2020/02/22/18/49/paper-4871356_1280.jpg', label: 'new image shape'`; | ||||
|  | ||||
|           flowchartCode += `, w: '500', h: '550'`; | ||||
|           if (pos) { | ||||
|             flowchartCode += `, pos: '${pos}'`; | ||||
|           } | ||||
|           flowchartCode += ` }\n`; | ||||
|           flowchartCode += `  A:::customClazz\n`; | ||||
|           imgSnapshotTest(flowchartCode, { look }); | ||||
|         }); | ||||
|       }); | ||||
|     }); | ||||
|   }); | ||||
| }); | ||||
| @@ -63,4 +63,199 @@ section Checkout from website | ||||
|       { journey: { useMaxWidth: false } } | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   it('should initialize with a left margin of 150px for user journeys', () => { | ||||
|     renderGraph( | ||||
|       ` | ||||
|       --- | ||||
|       config: | ||||
|         journey: | ||||
|           maxLabelWidth: 320 | ||||
|       --- | ||||
|       journey | ||||
|         title User Journey Example | ||||
|         section Onboarding | ||||
|             Sign Up: 5: | ||||
|             Browse Features: 3: | ||||
|             Use Core Functionality: 4: | ||||
|         section Engagement | ||||
|             Browse Features: 3 | ||||
|             Use Core Functionality: 4 | ||||
|       `, | ||||
|       { journey: { useMaxWidth: true } } | ||||
|     ); | ||||
|  | ||||
|     let diagramStartX; | ||||
|  | ||||
|     cy.contains('foreignobject', 'Sign Up').then(($diagram) => { | ||||
|       diagramStartX = parseFloat($diagram.attr('x')); | ||||
|       expect(diagramStartX).to.be.closeTo(150, 2); | ||||
|     }); | ||||
|   }); | ||||
|  | ||||
|   it('should maintain sufficient space between legend and diagram when legend labels are longer', () => { | ||||
|     renderGraph( | ||||
|       `journey | ||||
|       title  Web hook life cycle | ||||
|       section Darkoob | ||||
|         Make preBuilt:5: Darkoob user | ||||
|         register slug : 5: Darkoob userf deliberately increasing the size of this label to check if distance between legend and diagram is  maintained | ||||
|         Map slug to a Prebuilt Job:5: Darkoob user | ||||
|       section External Service | ||||
|         set Darkoob slug as hook for an Event : 5 : admin Exjjjnjjjj qwerty | ||||
|         listen to the events : 5 :  External Service | ||||
|         call darkoob endpoint : 5 : External Service | ||||
|       section Darkoob | ||||
|         check for inputs : 5 : DarkoobAPI | ||||
|         run the prebuilt job : 5 : DarkoobAPI | ||||
|         `, | ||||
|       { journey: { useMaxWidth: true } } | ||||
|     ); | ||||
|  | ||||
|     let LabelEndX, diagramStartX; | ||||
|  | ||||
|     // Get right edge of the legend | ||||
|     cy.contains('tspan', 'Darkoob userf').then((textBox) => { | ||||
|       const bbox = textBox[0].getBBox(); | ||||
|       LabelEndX = bbox.x + bbox.width; | ||||
|     }); | ||||
|  | ||||
|     // Get left edge of the diagram | ||||
|     cy.contains('foreignobject', 'Make preBuilt').then((rect) => { | ||||
|       diagramStartX = parseFloat(rect.attr('x')); | ||||
|     }); | ||||
|  | ||||
|     // Assert right edge of the diagram is greater than or equal to the right edge of the label | ||||
|     cy.then(() => { | ||||
|       expect(diagramStartX).to.be.gte(LabelEndX); | ||||
|     }); | ||||
|   }); | ||||
|  | ||||
|   it('should wrap a single long word with hyphenation', () => { | ||||
|     renderGraph( | ||||
|       ` | ||||
|       --- | ||||
|       config: | ||||
|         journey: | ||||
|           maxLabelWidth: 100 | ||||
|       --- | ||||
|       journey | ||||
|         title Long Word Test | ||||
|         section Test | ||||
|           VeryLongWord: 5: Supercalifragilisticexpialidocious | ||||
|       `, | ||||
|       { journey: { useMaxWidth: true } } | ||||
|     ); | ||||
|  | ||||
|     // Verify that the line ends with a hyphen, indicating proper hyphenation for words exceeding maxLabelWidth. | ||||
|     cy.get('tspan').then((tspans) => { | ||||
|       const hasHyphen = [...tspans].some((t) => t.textContent.trim().endsWith('-')); | ||||
|       return expect(hasHyphen).to.be.true; | ||||
|     }); | ||||
|   }); | ||||
|  | ||||
|   it('should wrap text on whitespace without adding hyphens', () => { | ||||
|     renderGraph( | ||||
|       ` | ||||
|       --- | ||||
|       config: | ||||
|         journey: | ||||
|           maxLabelWidth: 200 | ||||
|       --- | ||||
|       journey | ||||
|         title Whitespace Test | ||||
|         section Test | ||||
|           TextWithSpaces: 5: Gustavo Fring is played by Giancarlo Esposito and is a character in Breaking Bad. | ||||
|       `, | ||||
|       { journey: { useMaxWidth: true } } | ||||
|     ); | ||||
|  | ||||
|     // Verify that none of the text spans end with a hyphen. | ||||
|     cy.get('tspan').each(($el) => { | ||||
|       const text = $el.text(); | ||||
|       expect(text.trim()).not.to.match(/-$/); | ||||
|     }); | ||||
|   }); | ||||
|  | ||||
|   it('should wrap long labels into multiple lines, keep them under max width, and maintain margins', () => { | ||||
|     renderGraph( | ||||
|       ` | ||||
|       --- | ||||
|       config: | ||||
|         journey: | ||||
|           maxLabelWidth: 320 | ||||
|       --- | ||||
|       journey | ||||
|         title User Journey Example | ||||
|         section Onboarding | ||||
|             Sign Up: 5: This is a long label that will be split into multiple lines to test the wrapping functionality | ||||
|             Browse Features: 3: This is another long label that will be split into multiple lines to test the wrapping functionality | ||||
|             Use Core Functionality: 4: This is yet another long label that will be split into multiple lines to test the wrapping functionality | ||||
|         section Engagement | ||||
|             Browse Features: 3 | ||||
|             Use Core Functionality: 4 | ||||
|       `, | ||||
|       { journey: { useMaxWidth: true } } | ||||
|     ); | ||||
|  | ||||
|     let diagramStartX, maxLineWidth; | ||||
|  | ||||
|     // Get the diagram's left edge x-coordinate | ||||
|     cy.contains('foreignobject', 'Sign Up') | ||||
|       .then(($diagram) => { | ||||
|         diagramStartX = parseFloat($diagram.attr('x')); | ||||
|       }) | ||||
|       .then(() => { | ||||
|         cy.get('text.legend').then(($lines) => { | ||||
|           // Check that there are multiple lines | ||||
|           expect($lines.length).to.be.equal(9); | ||||
|  | ||||
|           // Check that all lines are under the maxLabelWidth | ||||
|           $lines.each((index, el) => { | ||||
|             const bbox = el.getBBox(); | ||||
|             expect(bbox.width).to.be.lte(320); | ||||
|             maxLineWidth = Math.max(maxLineWidth || 0, bbox.width); | ||||
|           }); | ||||
|  | ||||
|           /** The expected margin between the diagram and the legend is 150px, as defined by | ||||
|            *  conf.leftMargin in user-journey-config.js | ||||
|            */ | ||||
|           expect(diagramStartX - maxLineWidth).to.be.closeTo(150, 2); | ||||
|         }); | ||||
|       }); | ||||
|   }); | ||||
|  | ||||
|   it('should correctly render the user journey diagram title with the specified styling', () => { | ||||
|     renderGraph( | ||||
|       `--- | ||||
| config: | ||||
|   journey: | ||||
|     titleColor: "#2900A5" | ||||
|     titleFontFamily: "Times New Roman" | ||||
|     titleFontSize: "5rem" | ||||
| --- | ||||
|  | ||||
| journey | ||||
|     title User Journey Example | ||||
|     section Onboarding | ||||
|         Sign Up: 5: John, Shahir | ||||
|         Complete Profile: 4: John | ||||
|     section Engagement | ||||
|         Browse Features: 3: John | ||||
|         Use Core Functionality: 4: John | ||||
|     section Retention | ||||
|         Revisit Application: 5: John | ||||
|         Invite Friends: 3: John | ||||
|  | ||||
|         size: 2rem | ||||
|     ` | ||||
|     ); | ||||
|  | ||||
|     cy.get('text').contains('User Journey Example').as('title'); | ||||
|     cy.get('@title').then(($title) => { | ||||
|       expect($title).to.have.attr('fill', '#2900A5'); | ||||
|       expect($title).to.have.attr('font-family', 'Times New Roman'); | ||||
|       expect($title).to.have.attr('font-size', '5rem'); | ||||
|     }); | ||||
|   }); | ||||
| }); | ||||
|   | ||||
							
								
								
									
										136
									
								
								cypress/integration/rendering/kanban.spec.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										136
									
								
								cypress/integration/rendering/kanban.spec.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,136 @@ | ||||
| import { imgSnapshotTest } from '../../helpers/util.ts'; | ||||
|  | ||||
| describe('Kanban diagram', () => { | ||||
|   it('1: should render a kanban with a single section', () => { | ||||
|     imgSnapshotTest( | ||||
|       `kanban | ||||
|   id1[Todo] | ||||
|     docs[Create Documentation] | ||||
|     docs[Create Blog about the new diagram] | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|   }); | ||||
|   it('2: should render a kanban with multiple sections', () => { | ||||
|     imgSnapshotTest( | ||||
|       `kanban | ||||
|   id1[Todo] | ||||
|     docs[Create Documentation] | ||||
|   id2 | ||||
|     docs[Create Blog about the new diagram] | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|   }); | ||||
|   it('3: should render a kanban with a single wrapping node', () => { | ||||
|     imgSnapshotTest( | ||||
|       `kanban | ||||
|   id1[Todo] | ||||
|     id2[Title of diagram is more than 100 chars when user duplicates diagram with 100 char, wrapping] | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|   }); | ||||
|   it('4: should handle the height of a section with a wrapping node at the end', () => { | ||||
|     imgSnapshotTest( | ||||
|       `kanban | ||||
|   id1[Todo] | ||||
|     id2[One line] | ||||
|     id3[Title of diagram is more than 100 chars when user duplicates diagram with 100 char, wrapping] | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|   }); | ||||
|   it('5: should handle the height of a section with a wrapping node at the top', () => { | ||||
|     imgSnapshotTest( | ||||
|       `kanban | ||||
|   id1[Todo] | ||||
|     id2[Title of diagram is more than 100 chars when user duplicates diagram with 100 char, wrapping] | ||||
|     id3[One line] | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|   }); | ||||
|   it('6: should handle the height of a section with a wrapping node in the middle', () => { | ||||
|     imgSnapshotTest( | ||||
|       `kanban | ||||
|   id1[Todo] | ||||
|     id2[One line] | ||||
|     id3[Title of diagram is more than 100 chars when user duplicates diagram with 100 char, wrapping] | ||||
|     id4[One line] | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|   }); | ||||
|   it('6: should handle assignments', () => { | ||||
|     imgSnapshotTest( | ||||
|       `kanban | ||||
|   id1[Todo] | ||||
|     docs[Create Documentation] | ||||
|   id2[In progress] | ||||
|     docs[Create Blog about the new diagram]@{ assigned: 'knsv' } | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|   }); | ||||
|   it('7: should handle prioritization', () => { | ||||
|     imgSnapshotTest( | ||||
|       `kanban | ||||
|   id2[In progress] | ||||
|     vh[Very High]@{ priority: 'Very High' } | ||||
|     h[High]@{ priority: 'High' } | ||||
|     m[Default priority] | ||||
|     l[Low]@{ priority: 'Low' } | ||||
|     vl[Very Low]@{ priority: 'Very Low' } | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|   }); | ||||
|   it('7: should handle external tickets', () => { | ||||
|     imgSnapshotTest( | ||||
|       `kanban | ||||
|   id1[Todo] | ||||
|     docs[Create Documentation] | ||||
|   id2[In progress] | ||||
|     docs[Create Blog about the new diagram]@{ ticket: MC-2037 } | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|   }); | ||||
|   it('8: should handle assignments, prioritization and tickets ids in the same item', () => { | ||||
|     imgSnapshotTest( | ||||
|       `kanban | ||||
|   id2[In progress] | ||||
|     docs[Create Blog about the new diagram]@{ priority: 'Very Low', ticket: MC-2037, assigned: 'knsv' } | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|   }); | ||||
|   it('10: Full example', () => { | ||||
|     imgSnapshotTest( | ||||
|       `--- | ||||
| config: | ||||
|   kanban: | ||||
|     ticketBaseUrl: 'https://abc123.atlassian.net/browse/#TICKET#' | ||||
| --- | ||||
| kanban | ||||
|   id1[Todo] | ||||
|     docs[Create Documentation] | ||||
|     docs[Create Blog about the new diagram] | ||||
|   id7[In progress] | ||||
|     id6[Create renderer so that it works in all cases. We also add some extra text here for testing purposes. And some more just for the extra flare.] | ||||
|     id8[Design grammar]@{ assigned: 'knsv' } | ||||
|   id9[Ready for deploy] | ||||
|   id10[Ready for test] | ||||
|   id11[Done] | ||||
|     id5[define getData] | ||||
|     id2[Title of diagram is more than 100 chars when user duplicates diagram with 100 char]@{ ticket: MC-2036, priority: 'Very High'} | ||||
|     id3[Update DB function]@{ ticket: MC-2037, assigned: knsv, priority: 'High' } | ||||
|     id4[Create parsing tests]@{ ticket: MC-2038, assigned: 'K.Sveidqvist', priority: 'High' } | ||||
|     id66[last item]@{ priority: 'Very Low', assigned: 'knsv' } | ||||
|   id12[Can't reproduce] | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|   }); | ||||
| }); | ||||
| @@ -146,7 +146,7 @@ root | ||||
|       shouldHaveRoot | ||||
|     ); | ||||
|   }); | ||||
|   it('text shouhld wrap with icon', () => { | ||||
|   it('text should wrap with icon', () => { | ||||
|     imgSnapshotTest( | ||||
|       `mindmap | ||||
| root | ||||
|   | ||||
							
								
								
									
										146
									
								
								cypress/integration/rendering/newShapes.spec.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										146
									
								
								cypress/integration/rendering/newShapes.spec.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,146 @@ | ||||
| import { imgSnapshotTest } from '../../helpers/util.ts'; | ||||
|  | ||||
| const looks = ['classic', 'handDrawn'] as const; | ||||
| const directions = [ | ||||
|   'TB', | ||||
|   //'BT', | ||||
|   'LR', | ||||
|   //'RL' | ||||
| ] as const; | ||||
| const newShapesSet1 = [ | ||||
|   'triangle', | ||||
|   'sloped-rectangle', | ||||
|   'horizontal-cylinder', | ||||
|   'flipped-triangle', | ||||
|   'hourglass', | ||||
| ] as const; | ||||
| const newShapesSet2 = [ | ||||
|   'tagged-rectangle', | ||||
|   'documents', | ||||
|   'lightning-bolt', | ||||
|   'filled-circle', | ||||
|   'window-pane', | ||||
| ] as const; | ||||
|  | ||||
| const newShapesSet3 = [ | ||||
|   'curved-trapezoid', | ||||
|   'bow-rect', | ||||
|   'tagged-document', | ||||
|   'divided-rectangle', | ||||
|   'crossed-circle', | ||||
| ] as const; | ||||
|  | ||||
| const newShapesSet4 = [ | ||||
|   'document', | ||||
|   'notched-pentagon', | ||||
|   'lined-cylinder', | ||||
|   'stacked-document', | ||||
|   'half-rounded-rectangle', | ||||
| ] as const; | ||||
|  | ||||
| const newShapesSet5 = [ | ||||
|   'lined-document', | ||||
|   'tagged-document', | ||||
|   'brace-l', | ||||
|   'comment', | ||||
|   'braces', | ||||
|   'brace-r', | ||||
| ] as const; | ||||
|  | ||||
| const newShapesSet6 = ['brace-r', 'braces'] as const; | ||||
| // Aggregate all shape sets into a single array | ||||
| const newShapesSets = [ | ||||
|   newShapesSet1, | ||||
|   newShapesSet2, | ||||
|   newShapesSet3, | ||||
|   newShapesSet4, | ||||
|   newShapesSet5, | ||||
|   newShapesSet6, | ||||
| ]; | ||||
|  | ||||
| looks.forEach((look) => { | ||||
|   directions.forEach((direction) => { | ||||
|     newShapesSets.forEach((newShapesSet) => { | ||||
|       describe(`Test ${newShapesSet.join(', ')} in ${look} look and dir ${direction}`, () => { | ||||
|         it(`without label`, () => { | ||||
|           let flowchartCode = `flowchart ${direction}\n`; | ||||
|           newShapesSet.forEach((newShape, index) => { | ||||
|             flowchartCode += `  n${index} --> n${index}${index}@{ shape: ${newShape} }\n`; | ||||
|           }); | ||||
|           imgSnapshotTest(flowchartCode, { look }); | ||||
|         }); | ||||
|  | ||||
|         it(`with label`, () => { | ||||
|           let flowchartCode = `flowchart ${direction}\n`; | ||||
|           newShapesSet.forEach((newShape, index) => { | ||||
|             flowchartCode += `  n${index} --> n${index}${index}@{ shape: ${newShape}, label: 'This is a label for ${newShape} shape' }\n`; | ||||
|           }); | ||||
|           imgSnapshotTest(flowchartCode, { look }); | ||||
|         }); | ||||
|  | ||||
|         it(`connect all shapes with each other`, () => { | ||||
|           let flowchartCode = `flowchart ${direction}\n`; | ||||
|           newShapesSet.forEach((newShape, index) => { | ||||
|             flowchartCode += `  n${index}${index}@{ shape: ${newShape}, label: 'This is a label for ${newShape} shape' }\n`; | ||||
|           }); | ||||
|           for (let i = 0; i < newShapesSet.length; i++) { | ||||
|             for (let j = i + 1; j < newShapesSet.length; j++) { | ||||
|               flowchartCode += `  n${i}${i} --> n${j}${j}\n`; | ||||
|             } | ||||
|           } | ||||
|           if (!(direction === 'TB' && look === 'handDrawn' && newShapesSet === newShapesSet1)) { | ||||
|             //skip this test, works in real. Need to look | ||||
|             imgSnapshotTest(flowchartCode, { look }); | ||||
|           } | ||||
|         }); | ||||
|  | ||||
|         it(`with very long label`, () => { | ||||
|           let flowchartCode = `flowchart ${direction}\n`; | ||||
|           newShapesSet.forEach((newShape, index) => { | ||||
|             flowchartCode += `  n${index} --> n${index}${index}@{ shape: ${newShape}, label: 'This is a very very very very very long long long label for ${newShape} shape' }\n`; | ||||
|           }); | ||||
|           imgSnapshotTest(flowchartCode, { look }); | ||||
|         }); | ||||
|  | ||||
|         it(`with markdown htmlLabels:true`, () => { | ||||
|           let flowchartCode = `flowchart ${direction}\n`; | ||||
|           newShapesSet.forEach((newShape, index) => { | ||||
|             flowchartCode += `  n${index} --> n${index}${index}@{ shape: ${newShape}, label: 'This is **bold** </br>and <strong>strong</strong> for ${newShape} shape' }\n`; | ||||
|           }); | ||||
|           imgSnapshotTest(flowchartCode, { look }); | ||||
|         }); | ||||
|  | ||||
|         it(`with markdown htmlLabels:false`, () => { | ||||
|           let flowchartCode = `flowchart ${direction}\n`; | ||||
|           newShapesSet.forEach((newShape, index) => { | ||||
|             flowchartCode += `  n${index} --> n${index}${index}@{ shape: ${newShape}, label: 'This is **bold** </br>and <strong>strong</strong> for ${newShape} shape' }\n`; | ||||
|           }); | ||||
|           imgSnapshotTest(flowchartCode, { | ||||
|             look, | ||||
|             htmlLabels: false, | ||||
|             flowchart: { htmlLabels: false }, | ||||
|           }); | ||||
|         }); | ||||
|  | ||||
|         it(`with styles`, () => { | ||||
|           let flowchartCode = `flowchart ${direction}\n`; | ||||
|           newShapesSet.forEach((newShape, index) => { | ||||
|             flowchartCode += `  n${index} --> n${index}${index}@{ shape: ${newShape}, label: 'new ${newShape} shape' }\n`; | ||||
|             flowchartCode += `  style n${index}${index} fill:#f9f,stroke:#333,stroke-width:4px \n`; | ||||
|           }); | ||||
|           imgSnapshotTest(flowchartCode, { look }); | ||||
|         }); | ||||
|  | ||||
|         it(`with classDef`, () => { | ||||
|           let flowchartCode = `flowchart ${direction}\n`; | ||||
|           flowchartCode += `  classDef customClazz fill:#bbf,stroke:#f66,stroke-width:2px,color:#fff,stroke-dasharray: 5 5\n`; | ||||
|           newShapesSet.forEach((newShape, index) => { | ||||
|             flowchartCode += `  n${index} --> n${index}${index}@{ shape: ${newShape}, label: 'new ${newShape} shape' }\n`; | ||||
|             flowchartCode += `  n${index}${index}:::customClazz\n`; | ||||
|           }); | ||||
|           imgSnapshotTest(flowchartCode, { look }); | ||||
|         }); | ||||
|       }); | ||||
|     }); | ||||
|   }); | ||||
| }); | ||||
							
								
								
									
										107
									
								
								cypress/integration/rendering/oldShapes.spec.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								cypress/integration/rendering/oldShapes.spec.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,107 @@ | ||||
| import { imgSnapshotTest } from '../../helpers/util'; | ||||
|  | ||||
| const looks = ['classic', 'handDrawn'] as const; | ||||
| const directions = [ | ||||
|   'TB', | ||||
|   //'BT', | ||||
|   'LR', | ||||
|   //'RL' | ||||
| ] as const; | ||||
|  | ||||
| const shapesSet1 = ['text', 'card', 'lin-rect', 'diamond', 'hexagon'] as const; | ||||
|  | ||||
| // removing labelRect, need have alias for it | ||||
| const shapesSet2 = ['rounded', 'rect', 'start', 'stop'] as const; | ||||
|  | ||||
| const shapesSet3 = ['fork', 'choice', 'note', 'stadium', 'odd'] as const; | ||||
|  | ||||
| const shapesSet4 = ['subroutine', 'cylinder', 'circle', 'doublecircle', 'odd'] as const; | ||||
|  | ||||
| const shapesSet5 = ['anchor', 'lean-r', 'lean-l', 'trap-t', 'trap-b'] as const; | ||||
|  | ||||
| // Aggregate all shape sets into a single array | ||||
| const shapesSets = [shapesSet1, shapesSet2, shapesSet3, shapesSet4, shapesSet5] as const; | ||||
|  | ||||
| looks.forEach((look) => { | ||||
|   directions.forEach((direction) => { | ||||
|     shapesSets.forEach((shapesSet) => { | ||||
|       describe(`Test ${shapesSet.join(', ')} in ${look} look and dir ${direction}`, () => { | ||||
|         it(`without label`, () => { | ||||
|           let flowchartCode = `flowchart ${direction}\n`; | ||||
|           shapesSet.forEach((newShape, index) => { | ||||
|             flowchartCode += `  n${index} --> n${index}${index}@{ shape: ${newShape} }\n`; | ||||
|           }); | ||||
|           imgSnapshotTest(flowchartCode, { look }); | ||||
|         }); | ||||
|  | ||||
|         it(`with label`, () => { | ||||
|           let flowchartCode = `flowchart ${direction}\n`; | ||||
|           shapesSet.forEach((newShape, index) => { | ||||
|             flowchartCode += `  n${index} --> n${index}${index}@{ shape: ${newShape}, label: 'This is a label for ${newShape} shape' }\n`; | ||||
|           }); | ||||
|           imgSnapshotTest(flowchartCode, { look }); | ||||
|         }); | ||||
|  | ||||
|         it(`connect all shapes with each other`, () => { | ||||
|           let flowchartCode = `flowchart ${direction}\n`; | ||||
|           shapesSet.forEach((newShape, index) => { | ||||
|             flowchartCode += `  n${index}${index}@{ shape: ${newShape}, label: 'This is a label for ${newShape} shape' }\n`; | ||||
|           }); | ||||
|           for (let i = 0; i < shapesSet.length; i++) { | ||||
|             for (let j = i + 1; j < shapesSet.length; j++) { | ||||
|               flowchartCode += `  n${i}${i} --> n${j}${j}\n`; | ||||
|             } | ||||
|           } | ||||
|           imgSnapshotTest(flowchartCode, { look }); | ||||
|         }); | ||||
|  | ||||
|         it(`with very long label`, () => { | ||||
|           let flowchartCode = `flowchart ${direction}\n`; | ||||
|           shapesSet.forEach((newShape, index) => { | ||||
|             flowchartCode += `  n${index} --> n${index}${index}@{ shape: ${newShape}, label: 'This is a very very very very very long long long label for ${newShape} shape' }\n`; | ||||
|           }); | ||||
|           imgSnapshotTest(flowchartCode, { look }); | ||||
|         }); | ||||
|  | ||||
|         it(`with markdown htmlLabels:true`, () => { | ||||
|           let flowchartCode = `flowchart ${direction}\n`; | ||||
|           shapesSet.forEach((newShape, index) => { | ||||
|             flowchartCode += `  n${index} --> n${index}${index}@{ shape: ${newShape}, label: 'This is **bold** </br>and <strong>strong</strong> for ${newShape} shape' }\n`; | ||||
|           }); | ||||
|           imgSnapshotTest(flowchartCode, { look }); | ||||
|         }); | ||||
|  | ||||
|         it(`with markdown htmlLabels:false`, () => { | ||||
|           let flowchartCode = `flowchart ${direction}\n`; | ||||
|           shapesSet.forEach((newShape, index) => { | ||||
|             flowchartCode += `  n${index} --> n${index}${index}@{ shape: ${newShape}, label: 'This is **bold** </br>and <strong>strong</strong> for ${newShape} shape' }\n`; | ||||
|           }); | ||||
|           imgSnapshotTest(flowchartCode, { | ||||
|             look, | ||||
|             htmlLabels: false, | ||||
|             flowchart: { htmlLabels: false }, | ||||
|           }); | ||||
|         }); | ||||
|  | ||||
|         it(`with styles`, () => { | ||||
|           let flowchartCode = `flowchart ${direction}\n`; | ||||
|           shapesSet.forEach((newShape, index) => { | ||||
|             flowchartCode += `  n${index} --> n${index}${index}@{ shape: ${newShape}, label: 'new ${newShape} shape' }\n`; | ||||
|             flowchartCode += `  style n${index}${index} fill:#f9f,stroke:#333,stroke-width:4px \n`; | ||||
|           }); | ||||
|           imgSnapshotTest(flowchartCode, { look }); | ||||
|         }); | ||||
|  | ||||
|         it(`with classDef`, () => { | ||||
|           let flowchartCode = `flowchart ${direction}\n`; | ||||
|           flowchartCode += `  classDef customClazz fill:#bbf,stroke:#f66,stroke-width:2px,color:#fff,stroke-dasharray: 5 5\n`; | ||||
|           shapesSet.forEach((newShape, index) => { | ||||
|             flowchartCode += `  n${index} --> n${index}${index}@{ shape: ${newShape}, label: 'new ${newShape} shape' }\n`; | ||||
|             flowchartCode += `  n${index}${index}:::customClazz\n`; | ||||
|           }); | ||||
|           imgSnapshotTest(flowchartCode, { look }); | ||||
|         }); | ||||
|       }); | ||||
|     }); | ||||
|   }); | ||||
| }); | ||||
| @@ -64,7 +64,7 @@ describe('pie chart', () => { | ||||
|     }); | ||||
|   }); | ||||
|  | ||||
|   it('should render a pie diagram when textPosition is setted', () => { | ||||
|   it('should render a pie diagram when textPosition is set', () => { | ||||
|     imgSnapshotTest( | ||||
|       `pie | ||||
|         "Dogs": 50 | ||||
|   | ||||
| @@ -45,7 +45,7 @@ describe('Quadrant Chart', () => { | ||||
|       {} | ||||
|     ); | ||||
|   }); | ||||
|   it('should able to render y-axix on right side', () => { | ||||
|   it('should able to render y-axis on right side', () => { | ||||
|     imgSnapshotTest( | ||||
|       ` | ||||
|   %%{init: {"quadrantChart": {"yAxisPosition": "right"}}}%% | ||||
| @@ -61,7 +61,7 @@ describe('Quadrant Chart', () => { | ||||
|       {} | ||||
|     ); | ||||
|   }); | ||||
|   it('should able to render x-axix on bottom', () => { | ||||
|   it('should able to render x-axis on bottom', () => { | ||||
|     imgSnapshotTest( | ||||
|       ` | ||||
|   %%{init: {"quadrantChart": {"xAxisPosition": "bottom"}}}%% | ||||
| @@ -77,7 +77,7 @@ describe('Quadrant Chart', () => { | ||||
|       {} | ||||
|     ); | ||||
|   }); | ||||
|   it('should able to render x-axix on bottom and y-axis on right', () => { | ||||
|   it('should able to render x-axis on bottom and y-axis on right', () => { | ||||
|     imgSnapshotTest( | ||||
|       ` | ||||
|   %%{init: {"quadrantChart": {"xAxisPosition": "bottom", "yAxisPosition": "right"}}}%% | ||||
|   | ||||
							
								
								
									
										79
									
								
								cypress/integration/rendering/radar.spec.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								cypress/integration/rendering/radar.spec.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,79 @@ | ||||
| import { imgSnapshotTest } from '../../helpers/util'; | ||||
|  | ||||
| describe('radar structure', () => { | ||||
|   it('should render a simple radar diagram', () => { | ||||
|     imgSnapshotTest( | ||||
|       `radar-beta | ||||
|                 title Best Radar Ever | ||||
|                 axis A, B, C | ||||
|                 curve c1{1, 2, 3} | ||||
|             ` | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   it('should render a radar diagram with multiple curves', () => { | ||||
|     imgSnapshotTest( | ||||
|       `radar-beta | ||||
|                 title Best Radar Ever | ||||
|                 axis A, B, C | ||||
|                 curve c1{1, 2, 3} | ||||
|                 curve c2{2, 3, 1} | ||||
|             ` | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   it('should render a complex radar diagram', () => { | ||||
|     imgSnapshotTest( | ||||
|       `radar-beta  | ||||
|                 title My favorite ninjas | ||||
|                 axis Agility, Speed, Strength | ||||
|                 axis Stam["Stamina"] , Intel["Intelligence"] | ||||
|  | ||||
|                 curve Ninja1["Naruto Uzumaki"]{ | ||||
|                     Agility 2, Speed 2, | ||||
|                     Strength 3, Stam 5, | ||||
|                     Intel 0 | ||||
|                 } | ||||
|                 curve Ninja2["Sasuke"]{2, 3, 4, 1, 5} | ||||
|                 curve Ninja3 {3, 2, 1, 5, 4} | ||||
|  | ||||
|                 showLegend true | ||||
|                 ticks 3 | ||||
|                 max 8 | ||||
|                 min 0 | ||||
|                 graticule polygon | ||||
|             ` | ||||
|     ); | ||||
|     cy.get('svg').should((svg) => { | ||||
|       expect(svg).to.have.length(1); | ||||
|     }); | ||||
|   }); | ||||
|  | ||||
|   it('should render radar diagram with config override', () => { | ||||
|     imgSnapshotTest( | ||||
|       `radar-beta | ||||
|                 title Best Radar Ever | ||||
|                 axis A,B,C | ||||
|                 curve mycurve{1,2,3}`, | ||||
|       { radar: { marginTop: 100, axisScaleFactor: 0.5 } } | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   it('should parse radar diagram with theme override', () => { | ||||
|     imgSnapshotTest( | ||||
|       `radar-beta | ||||
|                 axis A,B,C | ||||
|                 curve mycurve{1,2,3}`, | ||||
|       { theme: 'base', themeVariables: { fontSize: 80, cScale0: '#FF0000' } } | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   it('should handle radar diagram with radar style override', () => { | ||||
|     imgSnapshotTest( | ||||
|       `radar-beta | ||||
|                 axis A,B,C | ||||
|                 curve mycurve{1,2,3}`, | ||||
|       { theme: 'base', themeVariables: { radar: { axisColor: '#FF0000' } } } | ||||
|     ); | ||||
|   }); | ||||
| }); | ||||
							
								
								
									
										703
									
								
								cypress/integration/rendering/requirementDiagram-unified.spec.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										703
									
								
								cypress/integration/rendering/requirementDiagram-unified.spec.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,703 @@ | ||||
| import { imgSnapshotTest, renderGraph } from '../../helpers/util.ts'; | ||||
|  | ||||
| const testOptions = [ | ||||
|   { description: '', options: { logLevel: 1 } }, | ||||
|   { description: 'ELK: ', options: { logLevel: 1, layout: 'elk' } }, | ||||
|   { description: 'HD: ', options: { logLevel: 1, look: 'handDrawn' } }, | ||||
| ]; | ||||
|  | ||||
| describe('Requirement Diagram Unified', () => { | ||||
|   testOptions.forEach(({ description, options }) => { | ||||
|     it(`${description}should render a simple Requirement diagram`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|     requirementDiagram | ||||
|         requirement test_req { | ||||
|         id: 1 | ||||
|         text: the test text. | ||||
|         risk: high | ||||
|         verifymethod: test | ||||
|         } | ||||
|  | ||||
|         element test_entity { | ||||
|         type: simulation | ||||
|         } | ||||
|  | ||||
|         test_entity - satisfies -> test_req | ||||
|         `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render a simple Requirement diagram without htmlLabels`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|     requirementDiagram | ||||
|         requirement test_req { | ||||
|         id: 1 | ||||
|         text: the test text. | ||||
|         risk: high | ||||
|         verifymethod: test | ||||
|         } | ||||
|  | ||||
|         element test_entity { | ||||
|         type: simulation | ||||
|         } | ||||
|  | ||||
|         test_entity - satisfies -> test_req | ||||
|         `, | ||||
|         { ...options, htmlLabels: false } | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render a not-so-simple Requirement diagram`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|     requirementDiagram | ||||
|  | ||||
|         requirement test_req { | ||||
|         id: 1 | ||||
|         text: the test text. | ||||
|         risk: high | ||||
|         verifymethod: test | ||||
|         } | ||||
|  | ||||
|         functionalRequirement test_req2 { | ||||
|         id: 1.1 | ||||
|         text: the second test text. | ||||
|         risk: low | ||||
|         verifymethod: inspection | ||||
|         } | ||||
|  | ||||
|         performanceRequirement test_req3 { | ||||
|         id: 1.2 | ||||
|         text: the third test text. | ||||
|         risk: medium | ||||
|         verifymethod: demonstration | ||||
|         } | ||||
|  | ||||
|         interfaceRequirement test_req4 { | ||||
|         id: 1.2.1 | ||||
|         text: the fourth test text. | ||||
|         risk: medium | ||||
|         verifymethod: analysis | ||||
|         } | ||||
|  | ||||
|         physicalRequirement test_req5 { | ||||
|         id: 1.2.2 | ||||
|         text: the fifth test text. | ||||
|         risk: medium | ||||
|         verifymethod: analysis | ||||
|         } | ||||
|  | ||||
|         designConstraint test_req6 { | ||||
|         id: 1.2.3 | ||||
|         text: the sixth test text. | ||||
|         risk: medium | ||||
|         verifymethod: analysis | ||||
|         } | ||||
|  | ||||
|         element test_entity { | ||||
|         type: simulation | ||||
|         } | ||||
|  | ||||
|         element test_entity2 { | ||||
|         type: word doc | ||||
|         docRef: reqs/test_entity | ||||
|         } | ||||
|  | ||||
|         element test_entity3 { | ||||
|         type: "test suite" | ||||
|         docRef: github.com/all_the_tests | ||||
|         } | ||||
|  | ||||
|  | ||||
|         test_entity - satisfies -> test_req2 | ||||
|         test_req - traces -> test_req2 | ||||
|         test_req - contains -> test_req3 | ||||
|         test_req3 - contains -> test_req4 | ||||
|         test_req4 - derives -> test_req5 | ||||
|         test_req5 - refines -> test_req6 | ||||
|         test_entity3 - verifies -> test_req5 | ||||
|         test_req <- copies - test_entity2 | ||||
|         `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render a not-so-simple Requirement diagram without htmlLabels`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|     requirementDiagram | ||||
|  | ||||
|         requirement test_req { | ||||
|         id: 1 | ||||
|         text: the test text. | ||||
|         risk: high | ||||
|         verifymethod: test | ||||
|         } | ||||
|  | ||||
|         functionalRequirement test_req2 { | ||||
|         id: 1.1 | ||||
|         text: the second test text. | ||||
|         risk: low | ||||
|         verifymethod: inspection | ||||
|         } | ||||
|  | ||||
|         performanceRequirement test_req3 { | ||||
|         id: 1.2 | ||||
|         text: the third test text. | ||||
|         risk: medium | ||||
|         verifymethod: demonstration | ||||
|         } | ||||
|  | ||||
|         interfaceRequirement test_req4 { | ||||
|         id: 1.2.1 | ||||
|         text: the fourth test text. | ||||
|         risk: medium | ||||
|         verifymethod: analysis | ||||
|         } | ||||
|  | ||||
|         physicalRequirement test_req5 { | ||||
|         id: 1.2.2 | ||||
|         text: the fifth test text. | ||||
|         risk: medium | ||||
|         verifymethod: analysis | ||||
|         } | ||||
|  | ||||
|         designConstraint test_req6 { | ||||
|         id: 1.2.3 | ||||
|         text: the sixth test text. | ||||
|         risk: medium | ||||
|         verifymethod: analysis | ||||
|         } | ||||
|  | ||||
|         element test_entity { | ||||
|         type: simulation | ||||
|         } | ||||
|  | ||||
|         element test_entity2 { | ||||
|         type: word doc | ||||
|         docRef: reqs/test_entity | ||||
|         } | ||||
|  | ||||
|         element test_entity3 { | ||||
|         type: "test suite" | ||||
|         docRef: github.com/all_the_tests | ||||
|         } | ||||
|  | ||||
|  | ||||
|         test_entity - satisfies -> test_req2 | ||||
|         test_req - traces -> test_req2 | ||||
|         test_req - contains -> test_req3 | ||||
|         test_req3 - contains -> test_req4 | ||||
|         test_req4 - derives -> test_req5 | ||||
|         test_req5 - refines -> test_req6 | ||||
|         test_entity3 - verifies -> test_req5 | ||||
|         test_req <- copies - test_entity2 | ||||
|         `, | ||||
|         { ...options, htmlLabels: false } | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render multiple Requirement diagrams`, () => { | ||||
|       imgSnapshotTest( | ||||
|         [ | ||||
|           ` | ||||
|     requirementDiagram | ||||
|  | ||||
|     requirement test_req { | ||||
|     id: 1 | ||||
|     text: the test text. | ||||
|     risk: high | ||||
|     verifymethod: test | ||||
|     } | ||||
|  | ||||
|     element test_entity { | ||||
|     type: simulation | ||||
|     } | ||||
|  | ||||
|     test_entity - satisfies -> test_req | ||||
|     `, | ||||
|           ` | ||||
|     requirementDiagram | ||||
|  | ||||
|     requirement test_req { | ||||
|     id: 1 | ||||
|     text: the test text. | ||||
|     risk: high | ||||
|     verifymethod: test | ||||
|     } | ||||
|  | ||||
|     element test_entity { | ||||
|     type: simulation | ||||
|     } | ||||
|  | ||||
|     test_entity - satisfies -> test_req | ||||
|     `, | ||||
|         ], | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render a Requirement diagram with empty information`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|     requirementDiagram | ||||
|         requirement test_req { | ||||
|         } | ||||
|         element test_entity { | ||||
|         } | ||||
|         `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render requirements and elements with and without information`, () => { | ||||
|       renderGraph( | ||||
|         ` | ||||
|     requirementDiagram | ||||
|         requirement test_req { | ||||
|             id: 1 | ||||
|             text: the test text. | ||||
|             risk: high | ||||
|             verifymethod: test | ||||
|         } | ||||
|         element test_entity { | ||||
|         } | ||||
|         `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render requirements and elements with long and short text`, () => { | ||||
|       renderGraph( | ||||
|         ` | ||||
|     requirementDiagram | ||||
|         requirement test_req { | ||||
|             id: 1 | ||||
|             text: the test text that is long and takes up a lot of space. | ||||
|             risk: high | ||||
|             verifymethod: test | ||||
|         } | ||||
|         element test_entity_name_that_is_extra_long { | ||||
|         } | ||||
|         `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render requirements and elements with long and short text without htmlLabels`, () => { | ||||
|       renderGraph( | ||||
|         ` | ||||
|       requirementDiagram | ||||
|           requirement test_req { | ||||
|               id: 1 | ||||
|               text: the test text that is long and takes up a lot of space. | ||||
|               risk: high | ||||
|               verifymethod: test | ||||
|           } | ||||
|           element test_entity_name_that_is_extra_long { | ||||
|           } | ||||
|           `, | ||||
|         { ...options, htmlLabels: false } | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render requirements and elements with quoted text for spaces`, () => { | ||||
|       renderGraph( | ||||
|         ` | ||||
|       requirementDiagram | ||||
|           requirement "test req name with spaces" { | ||||
|               id: 1 | ||||
|               text: the test text that is long and takes up a lot of space. | ||||
|               risk: high | ||||
|               verifymethod: test | ||||
|           } | ||||
|           element "test entity name that is extra long with spaces" { | ||||
|           } | ||||
|           `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render requirements and elements with markdown text`, () => { | ||||
|       renderGraph( | ||||
|         ` | ||||
|       requirementDiagram | ||||
|           requirement "__my bolded name__" { | ||||
|               id: 1 | ||||
|               text: "**Bolded text** _italicized text_" | ||||
|               risk: high | ||||
|               verifymethod: test | ||||
|           } | ||||
|           element "*my italicized name*" { | ||||
|             type: "**Bolded type** _italicized type_" | ||||
|             docref: "*Italicized* __Bolded__" | ||||
|           } | ||||
|           `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render requirements and elements with markdown text without htmlLabels`, () => { | ||||
|       renderGraph( | ||||
|         ` | ||||
|       requirementDiagram | ||||
|           requirement "__my bolded name__" { | ||||
|               id: 1 | ||||
|               text: "**Bolded text** _italicized text_" | ||||
|               risk: high | ||||
|               verifymethod: test | ||||
|           } | ||||
|           element "*my italicized name*" { | ||||
|             type: "**Bolded type** _italicized type_" | ||||
|             docref: "*Italicized* __Bolded__" | ||||
|           } | ||||
|           `, | ||||
|         { ...options, htmlLabels: false } | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render a simple Requirement diagram with a title`, () => { | ||||
|       imgSnapshotTest( | ||||
|         `--- | ||||
|   title: simple Requirement diagram | ||||
|   --- | ||||
|     requirementDiagram | ||||
|  | ||||
|     requirement test_req { | ||||
|     id: 1 | ||||
|     text: the test text. | ||||
|     risk: high | ||||
|     verifymethod: test | ||||
|     } | ||||
|  | ||||
|     element test_entity { | ||||
|     type: simulation | ||||
|     } | ||||
|  | ||||
|     test_entity - satisfies -> test_req | ||||
|   `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render a Requirement diagram with TB direction`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|     requirementDiagram | ||||
|     direction TB | ||||
|  | ||||
|     requirement test_req { | ||||
|     id: 1 | ||||
|     text: the test text. | ||||
|     risk: high | ||||
|     verifymethod: test | ||||
|     } | ||||
|  | ||||
|     element test_entity { | ||||
|     type: simulation | ||||
|     } | ||||
|  | ||||
|     test_entity - satisfies -> test_req | ||||
|         `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render a Requirement diagram with BT direction`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|       requirementDiagram | ||||
|       direction BT | ||||
|    | ||||
|       requirement test_req { | ||||
|       id: 1 | ||||
|       text: the test text. | ||||
|       risk: high | ||||
|       verifymethod: test | ||||
|       } | ||||
|    | ||||
|       element test_entity { | ||||
|       type: simulation | ||||
|       } | ||||
|    | ||||
|       test_entity - satisfies -> test_req | ||||
|           `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render a Requirement diagram with LR direction`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|       requirementDiagram | ||||
|       direction LR | ||||
|    | ||||
|       requirement test_req { | ||||
|       id: 1 | ||||
|       text: the test text. | ||||
|       risk: high | ||||
|       verifymethod: test | ||||
|       } | ||||
|    | ||||
|       element test_entity { | ||||
|       type: simulation | ||||
|       } | ||||
|    | ||||
|       test_entity - satisfies -> test_req | ||||
|           `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render a Requirement diagram with RL direction`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|       requirementDiagram | ||||
|       direction RL | ||||
|    | ||||
|       requirement test_req { | ||||
|       id: 1 | ||||
|       text: the test text. | ||||
|       risk: high | ||||
|       verifymethod: test | ||||
|       } | ||||
|    | ||||
|       element test_entity { | ||||
|       type: simulation | ||||
|       } | ||||
|    | ||||
|       test_entity - satisfies -> test_req | ||||
|           `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render requirements and elements with styles applied from style statement`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|     requirementDiagram | ||||
|  | ||||
|     requirement test_req { | ||||
|     id: 1 | ||||
|     text: the test text. | ||||
|     risk: high | ||||
|     verifymethod: test | ||||
|     } | ||||
|  | ||||
|     element test_entity { | ||||
|     type: simulation | ||||
|     } | ||||
|  | ||||
|     test_entity - satisfies -> test_req | ||||
|  | ||||
|     style test_req,test_entity fill:#f9f,stroke:blue, color:grey, font-weight:bold | ||||
|         `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render requirements and elements with styles applied from style statement without htmlLabels`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|       requirementDiagram | ||||
|    | ||||
|       requirement test_req { | ||||
|       id: 1 | ||||
|       text: the test text. | ||||
|       risk: high | ||||
|       verifymethod: test | ||||
|       } | ||||
|    | ||||
|       element test_entity { | ||||
|       type: simulation | ||||
|       } | ||||
|    | ||||
|       test_entity - satisfies -> test_req | ||||
|    | ||||
|       style test_req,test_entity fill:#f9f,stroke:blue, color:grey, font-weight:bold | ||||
|           `, | ||||
|         { ...options, htmlLabels: false } | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render requirements and elements with styles applied from class statement`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
| requirementDiagram | ||||
|    | ||||
|       requirement test_req { | ||||
|       id: 1 | ||||
|       text: the test text. | ||||
|       risk: high | ||||
|       verifymethod: test | ||||
|       } | ||||
|    | ||||
|       element test_entity { | ||||
|       type: simulation | ||||
|       } | ||||
|    | ||||
|       test_entity - satisfies -> test_req | ||||
|       classDef bold font-weight: bold | ||||
|       classDef blue stroke:lightblue, color: #0000FF | ||||
|       class test_entity bold | ||||
|       class test_req blue, bold | ||||
|         `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render requirements and elements with styles applied from class statement without htmlLabels`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|   requirementDiagram | ||||
|      | ||||
|         requirement test_req { | ||||
|         id: 1 | ||||
|         text: the test text. | ||||
|         risk: high | ||||
|         verifymethod: test | ||||
|         } | ||||
|      | ||||
|         element test_entity { | ||||
|         type: simulation | ||||
|         } | ||||
|      | ||||
|         test_entity - satisfies -> test_req | ||||
|         classDef bold font-weight: bold | ||||
|         classDef blue stroke:lightblue, color: #0000FF | ||||
|         class test_entity bold | ||||
|         class test_req blue, bold | ||||
|           `, | ||||
|         { ...options, htmlLabels: false } | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render requirements and elements with styles applied from classes with shorthand syntax`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|   requirementDiagram | ||||
|      | ||||
|         requirement test_req:::blue { | ||||
|         id: 1 | ||||
|         text: the test text. | ||||
|         risk: high | ||||
|         verifymethod: test | ||||
|         } | ||||
|      | ||||
|         element test_entity { | ||||
|         type: simulation | ||||
|         } | ||||
|      | ||||
|         test_entity - satisfies -> test_req | ||||
|         classDef bold font-weight: bold | ||||
|         classDef blue stroke:lightblue, color: #0000FF | ||||
|         test_entity:::bold | ||||
|           `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render requirements and elements with styles applied from classes with shorthand syntax without htmlLabels`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|   requirementDiagram | ||||
|      | ||||
|         requirement test_req:::blue { | ||||
|         id: 1 | ||||
|         text: the test text. | ||||
|         risk: high | ||||
|         verifymethod: test | ||||
|         } | ||||
|      | ||||
|         element test_entity { | ||||
|         type: simulation | ||||
|         } | ||||
|      | ||||
|         test_entity - satisfies -> test_req | ||||
|         classDef bold font-weight: bold | ||||
|         classDef blue stroke:lightblue, color: #0000FF | ||||
|         test_entity:::bold | ||||
|           `, | ||||
|         { ...options, htmlLabels: false } | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render requirements and elements with styles applied from the default class and other styles`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
| requirementDiagram | ||||
|    | ||||
|       requirement test_req:::blue { | ||||
|       id: 1 | ||||
|       text: the test text. | ||||
|       risk: high | ||||
|       verifymethod: test | ||||
|       } | ||||
|    | ||||
|       element test_entity { | ||||
|       type: simulation | ||||
|       } | ||||
|    | ||||
|       test_entity - satisfies -> test_req | ||||
|       classDef blue stroke:lightblue, color:blue | ||||
|       classDef default fill:pink | ||||
|       style test_entity color:green | ||||
|         `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render requirements and elements with styles applied from the default class and other styles without htmlLabels`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|   requirementDiagram | ||||
|      | ||||
|         requirement test_req:::blue { | ||||
|         id: 1 | ||||
|         text: the test text. | ||||
|         risk: high | ||||
|         verifymethod: test | ||||
|         } | ||||
|      | ||||
|         element test_entity { | ||||
|         type: simulation | ||||
|         } | ||||
|      | ||||
|         test_entity - satisfies -> test_req | ||||
|         classDef blue stroke:lightblue, color:blue | ||||
|         classDef default fill:pink | ||||
|         style test_entity color:green | ||||
|           `, | ||||
|         { ...options, htmlLabels: false } | ||||
|       ); | ||||
|     }); | ||||
|  | ||||
|     it(`${description}should render a Requirement diagram with a theme`, () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
| --- | ||||
|   theme: forest | ||||
| --- | ||||
|   requirementDiagram | ||||
|      | ||||
|         requirement test_req:::blue { | ||||
|         id: 1 | ||||
|         text: the test text. | ||||
|         risk: high | ||||
|         verifymethod: test | ||||
|         } | ||||
|      | ||||
|         element test_entity { | ||||
|         type: simulation | ||||
|         } | ||||
|      | ||||
|         test_entity - satisfies -> test_req | ||||
|           `, | ||||
|         options | ||||
|       ); | ||||
|     }); | ||||
|   }); | ||||
| }); | ||||
| @@ -138,8 +138,8 @@ describe('State diagram', () => { | ||||
|     imgSnapshotTest( | ||||
|       ` | ||||
|     stateDiagram-v2 | ||||
|     State1: This a a single line description | ||||
|     State2: This a a multi line description | ||||
|     State1: This a single line description | ||||
|     State2: This a multi line description | ||||
|     State2: here comes the multi part | ||||
|     [*] --> State1 | ||||
|     State1 --> State2 | ||||
| @@ -345,7 +345,7 @@ stateDiagram | ||||
|       } | ||||
|     ); | ||||
|   }); | ||||
|   it('v2 width of compond state should grow with title if title is wider', () => { | ||||
|   it('v2 width of compound state should grow with title if title is wider', () => { | ||||
|     imgSnapshotTest( | ||||
|       ` | ||||
| stateDiagram-v2 | ||||
| @@ -402,8 +402,8 @@ stateDiagram-v2 | ||||
|       ` | ||||
| stateDiagram-v2 | ||||
|     MyState | ||||
|     note left of MyState : I am a leftie | ||||
|     note right of MyState : I am a rightie | ||||
|     note left of MyState : I am a lefty | ||||
|     note right of MyState : I am a righty | ||||
|     `, | ||||
|       { | ||||
|         logLevel: 0, | ||||
| @@ -552,7 +552,7 @@ style AState fill:#636,border:1px solid red,color:white; | ||||
|         { logLevel: 0, fontFamily: 'courier' } | ||||
|       ); | ||||
|     }); | ||||
|     it(' should let styles take preceedence over classes', () => { | ||||
|     it(' should let styles take precedence over classes', () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
| stateDiagram-v2 | ||||
| @@ -565,7 +565,7 @@ style AState fill:#636,border:1px solid red,color:white; | ||||
|         { logLevel: 0, fontFamily: 'courier' } | ||||
|       ); | ||||
|     }); | ||||
|     it(' should allow styles to take effect in stubgraphs', () => { | ||||
|     it(' should allow styles to take effect in subgraphs', () => { | ||||
|       imgSnapshotTest( | ||||
|         ` | ||||
|   stateDiagram | ||||
|   | ||||
| @@ -129,8 +129,8 @@ describe('State diagram', () => { | ||||
|     imgSnapshotTest( | ||||
|       ` | ||||
|     stateDiagram | ||||
|     State1: This a a single line description | ||||
|     State2: This a a multi line description | ||||
|     State1: This a single line description | ||||
|     State2: This a multi line description | ||||
|     State2: here comes the multi part | ||||
|     [*] --> State1 | ||||
|     State1 --> State2 | ||||
|   | ||||
| @@ -7,7 +7,7 @@ describe('Timeline diagram', () => { | ||||
|     title History of Social Media Platform | ||||
|     2002 : LinkedIn | ||||
|     2004 : Facebook : Google | ||||
|     2005 : Youtube | ||||
|     2005 : YouTube | ||||
|     2006 : Twitter | ||||
|       `, | ||||
|       {} | ||||
| @@ -35,7 +35,7 @@ describe('Timeline diagram', () => { | ||||
|         section Stone Age | ||||
|           7600 BC : Britain's oldest known house was built in Orkney, Scotland | ||||
|           6000 BC : Sea levels rise and Britain becomes an island.<br> The people who live here are hunter-gatherers. | ||||
|         section Broze Age | ||||
|         section Bronze Age | ||||
|           2300 BC : People arrive from Europe and settle in Britain. <br>They bring farming and metalworking. | ||||
|                   : New styles of pottery and ways of burying the dead appear. | ||||
|           2200 BC : The last major building works are completed at Stonehenge.<br> People now bury their dead in stone circles. | ||||
| @@ -51,7 +51,7 @@ describe('Timeline diagram', () => { | ||||
|         title History of Social Media Platform | ||||
|           2002 : LinkedIn | ||||
|           2004 : Facebook : Google | ||||
|           2005 : Youtube | ||||
|           2005 : YouTube | ||||
|           2006 : Twitter | ||||
|       `, | ||||
|       {} | ||||
| @@ -68,7 +68,7 @@ describe('Timeline diagram', () => { | ||||
|         title History of Social Media Platform | ||||
|           2002 : LinkedIn | ||||
|           2004 : Facebook : Google | ||||
|           2005 : Youtube | ||||
|           2005 : YouTube | ||||
|           2006 : Twitter | ||||
|           2007 : Tumblr | ||||
|           2008 : Instagram | ||||
| @@ -84,7 +84,7 @@ describe('Timeline diagram', () => { | ||||
|         title History of Social Media Platform | ||||
|           2002 : LinkedIn | ||||
|           2004 : Facebook : Google | ||||
|           2005 : Youtube | ||||
|           2005 : YouTube | ||||
|           2006 : Twitter | ||||
|           2007 : Tumblr | ||||
|           2008 : Instagram | ||||
| @@ -101,7 +101,7 @@ describe('Timeline diagram', () => { | ||||
|         title History of Social Media Platform | ||||
|           2002 : LinkedIn | ||||
|           2004 : Facebook : Google | ||||
|           2005 : Youtube | ||||
|           2005 : YouTube | ||||
|           2006 : Twitter | ||||
|           2007 : Tumblr | ||||
|           2008 : Instagram | ||||
| @@ -118,7 +118,7 @@ describe('Timeline diagram', () => { | ||||
|         title History of Social Media Platform | ||||
|           2002 : LinkedIn | ||||
|           2004 : Facebook : Google | ||||
|           2005 : Youtube | ||||
|           2005 : YouTube | ||||
|           2006 : Twitter | ||||
|           2007 : Tumblr | ||||
|           2008 : Instagram | ||||
| @@ -135,7 +135,7 @@ describe('Timeline diagram', () => { | ||||
|         title History of Social Media Platform | ||||
|           2002 : LinkedIn | ||||
|           2004 : Facebook : Google | ||||
|           2005 : Youtube | ||||
|           2005 : YouTube | ||||
|           2006 : Twitter | ||||
|           2007 : Tumblr | ||||
|           2008 : Instagram | ||||
| @@ -152,7 +152,7 @@ describe('Timeline diagram', () => { | ||||
|         title History of Social Media Platform | ||||
|           2002 : LinkedIn | ||||
|           2004 : Facebook : Google | ||||
|           2005 : Youtube | ||||
|           2005 : YouTube | ||||
|           2006 : Twitter | ||||
|           2007 : Tumblr | ||||
|           2008 : Instagram | ||||
|   | ||||
| @@ -179,6 +179,7 @@ describe('XY Chart', () => { | ||||
|             axisLineWidth: 5 | ||||
|           chartOrientation: horizontal | ||||
|           plotReservedSpacePercent: 60 | ||||
|           showDataLabel: true | ||||
|       --- | ||||
|       xychart-beta | ||||
|         title "Sales Revenue" | ||||
| @@ -315,4 +316,516 @@ describe('XY Chart', () => { | ||||
|     ); | ||||
|     cy.get('svg'); | ||||
|   }); | ||||
|  | ||||
|   it('should render vertical bar chart with labels', () => { | ||||
|     imgSnapshotTest( | ||||
|       ` | ||||
|     --- | ||||
|     config: | ||||
|       xyChart: | ||||
|         showDataLabel: true | ||||
|     --- | ||||
|     xychart-beta | ||||
|       title "Sales Revenue" | ||||
|       x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec] | ||||
|       y-axis "Revenue (in $)" 4000 --> 11000 | ||||
|       bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000] | ||||
|     `, | ||||
|       {} | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   it('should render horizontal bar chart with labels', () => { | ||||
|     imgSnapshotTest( | ||||
|       ` | ||||
|     --- | ||||
|     config: | ||||
|       xyChart: | ||||
|         showDataLabel: true | ||||
|         chartOrientation: horizontal | ||||
|     --- | ||||
|     xychart-beta | ||||
|       title "Sales Revenue" | ||||
|       x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec] | ||||
|       y-axis "Revenue (in $)" 4000 --> 11000 | ||||
|       bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000] | ||||
|     `, | ||||
|       {} | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   it('should render vertical bar chart without labels by default', () => { | ||||
|     imgSnapshotTest( | ||||
|       ` | ||||
|     xychart-beta | ||||
|       title "Sales Revenue" | ||||
|       x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec] | ||||
|       y-axis "Revenue (in $)" 4000 --> 11000 | ||||
|       bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000] | ||||
|     `, | ||||
|       {} | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   it('should render horizontal bar chart without labels by default', () => { | ||||
|     imgSnapshotTest( | ||||
|       ` | ||||
|     --- | ||||
|     config: | ||||
|       xyChart: | ||||
|         chartOrientation: horizontal | ||||
|     --- | ||||
|     xychart-beta | ||||
|       title "Sales Revenue" | ||||
|       x-axis Months [jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec] | ||||
|       y-axis "Revenue (in $)" 4000 --> 11000 | ||||
|       bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000] | ||||
|     `, | ||||
|       {} | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   it('should render multiple bar plots vertically with labels correctly', () => { | ||||
|     imgSnapshotTest( | ||||
|       ` | ||||
|     --- | ||||
|     config: | ||||
|       xyChart: | ||||
|         showDataLabel: true | ||||
|     --- | ||||
|       xychart-beta | ||||
|         title "Multiple Bar Plots" | ||||
|         x-axis Categories [A, B, C] | ||||
|         y-axis "Values" 0 --> 100 | ||||
|         bar [10, 50, 90] | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   it('should render multiple bar plots horizontally with labels correctly', () => { | ||||
|     imgSnapshotTest( | ||||
|       ` | ||||
|     --- | ||||
|     config: | ||||
|       xyChart: | ||||
|         showDataLabel: true | ||||
|         chartOrientation: horizontal | ||||
|     --- | ||||
|       xychart-beta | ||||
|         title "Multiple Bar Plots" | ||||
|         x-axis Categories [A, B, C] | ||||
|         y-axis "Values" 0 --> 100 | ||||
|         bar [10, 50, 90] | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   it('should render a single bar with label for a vertical xy-chart', () => { | ||||
|     imgSnapshotTest( | ||||
|       ` | ||||
|     --- | ||||
|     config: | ||||
|       xyChart: | ||||
|         showDataLabel: true | ||||
|     --- | ||||
|       xychart-beta | ||||
|         title "Single Bar Chart" | ||||
|         x-axis Categories [A] | ||||
|         y-axis "Value" 0 --> 100 | ||||
|         bar [75] | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   it('should render a single bar with label for a horizontal xy-chart', () => { | ||||
|     imgSnapshotTest( | ||||
|       ` | ||||
|     --- | ||||
|     config: | ||||
|       xyChart: | ||||
|         showDataLabel: true | ||||
|         chartOrientation: horizontal | ||||
|     --- | ||||
|       xychart-beta | ||||
|         title "Single Bar Chart" | ||||
|         x-axis Categories [A] | ||||
|         y-axis "Value" 0 --> 100 | ||||
|         bar [75] | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   it('should render negative and decimal values with correct labels for vertical xy-chart', () => { | ||||
|     imgSnapshotTest( | ||||
|       ` | ||||
|     --- | ||||
|     config: | ||||
|       xyChart: | ||||
|         showDataLabel: true | ||||
|     --- | ||||
|       xychart-beta | ||||
|         title "Decimal and Negative Values" | ||||
|         x-axis Categories [A, B, C] | ||||
|         y-axis -10 --> 10 | ||||
|         bar [ -2.5, 0.75, 5.1 ] | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   it('should render negative and decimal values with correct labels for horizontal xy-chart', () => { | ||||
|     imgSnapshotTest( | ||||
|       ` | ||||
|     --- | ||||
|     config: | ||||
|       xyChart: | ||||
|         showDataLabel: true | ||||
|         chartOrientation: horizontal | ||||
|     --- | ||||
|       xychart-beta | ||||
|         title "Decimal and Negative Values" | ||||
|         x-axis Categories [A, B, C] | ||||
|         y-axis -10 --> 10 | ||||
|         bar [ -2.5, 0.75, 5.1 ] | ||||
|       `, | ||||
|       {} | ||||
|     ); | ||||
|   }); | ||||
|  | ||||
|   it('should render data labels within each bar in the vertical xy-chart', () => { | ||||
|     imgSnapshotTest( | ||||
|       ` | ||||
|     --- | ||||
|     config: | ||||
|       xyChart: | ||||
|         showDataLabel: true | ||||
|     --- | ||||
|     xychart-beta | ||||
|             title "Sales Revenue" | ||||
|             x-axis Months [jan,b,c] | ||||
|             y-axis "Revenue (in $)" 4000 --> 12000 | ||||
|             bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000, 3000, 2000, 500, 2000, 3000, 11000, 5000, 6000] | ||||
|     `, | ||||
|       {} | ||||
|     ); | ||||
|  | ||||
|     cy.get('g.bar-plot-0').within(() => { | ||||
|       cy.get('rect').each(($rect, index) => { | ||||
|         // Extract bar properties | ||||
|         const barProps = { | ||||
|           x: parseFloat($rect.attr('x')), | ||||
|           y: parseFloat($rect.attr('y')), | ||||
|           width: parseFloat($rect.attr('width')), | ||||
|           height: parseFloat($rect.attr('height')), | ||||
|         }; | ||||
|  | ||||
|         // Get the text element corresponding to this bar by index. | ||||
|         cy.get('text') | ||||
|           .eq(index) | ||||
|           .then(($text) => { | ||||
|             const bbox = $text[0].getBBox(); | ||||
|             const textProps = { | ||||
|               x: bbox.x, | ||||
|               y: bbox.y, | ||||
|               width: bbox.width, | ||||
|               height: bbox.height, | ||||
|             }; | ||||
|  | ||||
|             // Verify that the text label is positioned within the boundaries of the bar. | ||||
|             expect(textProps.x).to.be.greaterThan(barProps.x); | ||||
|             expect(textProps.x + textProps.width).to.be.lessThan(barProps.x + barProps.width); | ||||
|  | ||||
|             // Check horizontal alignment (within tolerance) | ||||
|             expect(textProps.x + textProps.width / 2).to.be.closeTo( | ||||
|               barProps.x + barProps.width / 2, | ||||
|               5 | ||||
|             ); | ||||
|  | ||||
|             expect(textProps.y).to.be.greaterThan(barProps.y); | ||||
|             expect(textProps.y + textProps.height).to.be.lessThan(barProps.y + barProps.height); | ||||
|           }); | ||||
|       }); | ||||
|     }); | ||||
|   }); | ||||
|  | ||||
|   it('should render data labels within each bar in the horizontal xy-chart', () => { | ||||
|     imgSnapshotTest( | ||||
|       ` | ||||
|     --- | ||||
|     config: | ||||
|       xyChart: | ||||
|         showDataLabel: true | ||||
|         chartOrientation: horizontal | ||||
|     --- | ||||
|     xychart-beta | ||||
|             title "Sales Revenue" | ||||
|             x-axis Months [jan,b,c] | ||||
|             y-axis "Revenue (in $)" 4000 --> 12000 | ||||
|             bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000, 3000, 2000, 500, 2000, 3000, 11000, 5000, 6000] | ||||
|     `, | ||||
|       {} | ||||
|     ); | ||||
|  | ||||
|     cy.get('g.bar-plot-0').within(() => { | ||||
|       cy.get('rect').each(($rect, index) => { | ||||
|         // Extract bar properties | ||||
|         const barProps = { | ||||
|           x: parseFloat($rect.attr('x')), | ||||
|           y: parseFloat($rect.attr('y')), | ||||
|           width: parseFloat($rect.attr('width')), | ||||
|           height: parseFloat($rect.attr('height')), | ||||
|         }; | ||||
|  | ||||
|         // Get the text element corresponding to this bar by index. | ||||
|         cy.get('text') | ||||
|           .eq(index) | ||||
|           .then(($text) => { | ||||
|             const bbox = $text[0].getBBox(); | ||||
|             const textProps = { | ||||
|               x: bbox.x, | ||||
|               y: bbox.y, | ||||
|               width: bbox.width, | ||||
|               height: bbox.height, | ||||
|             }; | ||||
|  | ||||
|             // Verify that the text label is positioned within the boundaries of the bar. | ||||
|             expect(textProps.x).to.be.greaterThan(barProps.x); | ||||
|             expect(textProps.x + textProps.width).to.be.lessThan(barProps.x + barProps.width); | ||||
|  | ||||
|             expect(textProps.y).to.be.greaterThan(barProps.y); | ||||
|             expect(textProps.y + textProps.height).to.be.lessThan(barProps.y + barProps.height); | ||||
|             expect(textProps.y + textProps.height / 2).to.be.closeTo( | ||||
|               barProps.y + barProps.height / 2, | ||||
|               5 | ||||
|             ); | ||||
|           }); | ||||
|       }); | ||||
|     }); | ||||
|   }); | ||||
|  | ||||
|   it('should render data labels within each bar in the vertical xy-chart with a lot of bars of different sizes', () => { | ||||
|     imgSnapshotTest( | ||||
|       ` | ||||
|       --- | ||||
|       config: | ||||
|         xyChart: | ||||
|           showDataLabel: true | ||||
|       --- | ||||
|       xychart-beta | ||||
|         title "Sales Revenue" | ||||
|         x-axis Months [jan,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s] | ||||
|         y-axis "Revenue (in $)" 4000 --> 12000 | ||||
|         bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000, 8000, 10000, 5000, 7600, 4999,11000 ,5000,6000] | ||||
|     `, | ||||
|       {} | ||||
|     ); | ||||
|  | ||||
|     cy.get('g.bar-plot-0').within(() => { | ||||
|       cy.get('rect').each(($rect, index) => { | ||||
|         // Extract bar properties | ||||
|         const barProps = { | ||||
|           x: parseFloat($rect.attr('x')), | ||||
|           y: parseFloat($rect.attr('y')), | ||||
|           width: parseFloat($rect.attr('width')), | ||||
|           height: parseFloat($rect.attr('height')), | ||||
|         }; | ||||
|  | ||||
|         // Get the text element corresponding to this bar by index. | ||||
|         cy.get('text') | ||||
|           .eq(index) | ||||
|           .then(($text) => { | ||||
|             const bbox = $text[0].getBBox(); | ||||
|             const textProps = { | ||||
|               x: bbox.x, | ||||
|               y: bbox.y, | ||||
|               width: bbox.width, | ||||
|               height: bbox.height, | ||||
|             }; | ||||
|  | ||||
|             // Verify that the text label is positioned within the boundaries of the bar. | ||||
|             expect(textProps.x).to.be.greaterThan(barProps.x); | ||||
|             expect(textProps.x + textProps.width).to.be.lessThan(barProps.x + barProps.width); | ||||
|  | ||||
|             // Check horizontal alignment (within tolerance) | ||||
|             expect(textProps.x + textProps.width / 2).to.be.closeTo( | ||||
|               barProps.x + barProps.width / 2, | ||||
|               5 | ||||
|             ); | ||||
|  | ||||
|             expect(textProps.y).to.be.greaterThan(barProps.y); | ||||
|             expect(textProps.y + textProps.height).to.be.lessThan(barProps.y + barProps.height); | ||||
|           }); | ||||
|       }); | ||||
|     }); | ||||
|   }); | ||||
|  | ||||
|   it('should render data labels within each bar in the horizontal xy-chart with a lot of bars of different sizes', () => { | ||||
|     imgSnapshotTest( | ||||
|       ` | ||||
|     --- | ||||
|     config: | ||||
|       xyChart: | ||||
|         showDataLabel: true | ||||
|         chartOrientation: horizontal | ||||
|     --- | ||||
|     xychart-beta | ||||
|       title "Sales Revenue" | ||||
|       x-axis Months [jan,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s] | ||||
|       y-axis "Revenue (in $)" 4000 --> 12000 | ||||
|       bar [5000, 6000, 7500, 8200, 9500, 10500, 11000, 10200, 9200, 8500, 7000, 6000, 8000, 10000, 5000, 7600, 4999,11000 ,5000,6000] | ||||
|     `, | ||||
|       {} | ||||
|     ); | ||||
|  | ||||
|     cy.get('g.bar-plot-0').within(() => { | ||||
|       cy.get('rect').each(($rect, index) => { | ||||
|         // Extract bar properties | ||||
|         const barProps = { | ||||
|           x: parseFloat($rect.attr('x')), | ||||
|           y: parseFloat($rect.attr('y')), | ||||
|           width: parseFloat($rect.attr('width')), | ||||
|           height: parseFloat($rect.attr('height')), | ||||
|         }; | ||||
|  | ||||
|         // Get the text element corresponding to this bar by index. | ||||
|         cy.get('text') | ||||
|           .eq(index) | ||||
|           .then(($text) => { | ||||
|             const bbox = $text[0].getBBox(); | ||||
|             const textProps = { | ||||
|               x: bbox.x, | ||||
|               y: bbox.y, | ||||
|               width: bbox.width, | ||||
|               height: bbox.height, | ||||
|             }; | ||||
|  | ||||
|             // Verify that the text label is positioned within the boundaries of the bar. | ||||
|             expect(textProps.x).to.be.greaterThan(barProps.x); | ||||
|             expect(textProps.x + textProps.width).to.be.lessThan(barProps.x + barProps.width); | ||||
|  | ||||
|             expect(textProps.y).to.be.greaterThan(barProps.y); | ||||
|             expect(textProps.y + textProps.height).to.be.lessThan(barProps.y + barProps.height); | ||||
|             expect(textProps.y + textProps.height / 2).to.be.closeTo( | ||||
|               barProps.y + barProps.height / 2, | ||||
|               5 | ||||
|             ); | ||||
|           }); | ||||
|       }); | ||||
|     }); | ||||
|   }); | ||||
|  | ||||
|   it('should render data labels correctly for a bar in the vertical xy-chart', () => { | ||||
|     imgSnapshotTest( | ||||
|       ` | ||||
|     --- | ||||
|     config: | ||||
|       xyChart: | ||||
|         showDataLabel: true | ||||
|     --- | ||||
|     xychart-beta | ||||
|             title "Sales Revenue" | ||||
|             x-axis Months [jan] | ||||
|             y-axis "Revenue (in $)" 3000 --> 12000 | ||||
|             bar [4000] | ||||
|     `, | ||||
|       {} | ||||
|     ); | ||||
|  | ||||
|     cy.get('g.bar-plot-0').within(() => { | ||||
|       cy.get('rect').each(($rect, index) => { | ||||
|         // Extract bar properties | ||||
|         const barProps = { | ||||
|           x: parseFloat($rect.attr('x')), | ||||
|           y: parseFloat($rect.attr('y')), | ||||
|           width: parseFloat($rect.attr('width')), | ||||
|           height: parseFloat($rect.attr('height')), | ||||
|         }; | ||||
|  | ||||
|         // Get the text element corresponding to this bar by index. | ||||
|         cy.get('text') | ||||
|           .eq(index) | ||||
|           .then(($text) => { | ||||
|             const bbox = $text[0].getBBox(); | ||||
|             const textProps = { | ||||
|               x: bbox.x, | ||||
|               y: bbox.y, | ||||
|               width: bbox.width, | ||||
|               height: bbox.height, | ||||
|             }; | ||||
|  | ||||
|             // Verify that the text label is positioned within the boundaries of the bar. | ||||
|             expect(textProps.x).to.be.greaterThan(barProps.x); | ||||
|             expect(textProps.x + textProps.width).to.be.lessThan(barProps.x + barProps.width); | ||||
|  | ||||
|             // Check horizontal alignment (within tolerance) | ||||
|             expect(textProps.x + textProps.width / 2).to.be.closeTo( | ||||
|               barProps.x + barProps.width / 2, | ||||
|               5 | ||||
|             ); | ||||
|  | ||||
|             expect(textProps.y).to.be.greaterThan(barProps.y); | ||||
|             expect(textProps.y + textProps.height).to.be.lessThan(barProps.y + barProps.height); | ||||
|           }); | ||||
|       }); | ||||
|     }); | ||||
|   }); | ||||
|  | ||||
|   it('should render data labels correctly for a bar in the horizontal xy-chart', () => { | ||||
|     imgSnapshotTest( | ||||
|       ` | ||||
|     --- | ||||
|     config: | ||||
|       xyChart: | ||||
|         showDataLabel: true | ||||
|         chartOrientation: horizontal | ||||
|     --- | ||||
|     xychart-beta | ||||
|             title "Sales Revenue" | ||||
|             x-axis Months [jan] | ||||
|             y-axis "Revenue (in $)" 3000 --> 12000 | ||||
|             bar [4000] | ||||
|     `, | ||||
|       {} | ||||
|     ); | ||||
|  | ||||
|     cy.get('g.bar-plot-0').within(() => { | ||||
|       cy.get('rect').each(($rect, index) => { | ||||
|         // Extract bar properties | ||||
|         const barProps = { | ||||
|           x: parseFloat($rect.attr('x')), | ||||
|           y: parseFloat($rect.attr('y')), | ||||
|           width: parseFloat($rect.attr('width')), | ||||
|           height: parseFloat($rect.attr('height')), | ||||
|         }; | ||||
|  | ||||
|         // Get the text element corresponding to this bar by index. | ||||
|         cy.get('text') | ||||
|           .eq(index) | ||||
|           .then(($text) => { | ||||
|             const bbox = $text[0].getBBox(); | ||||
|             const textProps = { | ||||
|               x: bbox.x, | ||||
|               y: bbox.y, | ||||
|               width: bbox.width, | ||||
|               height: bbox.height, | ||||
|             }; | ||||
|  | ||||
|             // Verify that the text label is positioned within the boundaries of the bar. | ||||
|             expect(textProps.x).to.be.greaterThan(barProps.x); | ||||
|             expect(textProps.x + textProps.width).to.be.lessThan(barProps.x + barProps.width); | ||||
|  | ||||
|             expect(textProps.y).to.be.greaterThan(barProps.y); | ||||
|             expect(textProps.y + textProps.height).to.be.lessThan(barProps.y + barProps.height); | ||||
|             expect(textProps.y + textProps.height / 2).to.be.closeTo( | ||||
|               barProps.y + barProps.height / 2, | ||||
|               5 | ||||
|             ); | ||||
|           }); | ||||
|       }); | ||||
|     }); | ||||
|   }); | ||||
| }); | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
|     <link href="https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" rel="stylesheet" /> | ||||
|     <link | ||||
|       rel="stylesheet" | ||||
|       href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/font-awesome.min.css" | ||||
|       href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/font-awesome.min.css" | ||||
|     /> | ||||
|     <link | ||||
|       href="https://cdn.jsdelivr.net/npm/@mdi/font@6.9.96/css/materialdesignicons.min.css" | ||||
| @@ -30,8 +30,8 @@ | ||||
|       .mermaid svg { | ||||
|         /* font-size: 18px !important; */ | ||||
|         background-color: #eee; | ||||
|         background-image: radial-gradient(#fff 1%, transparent 11%), | ||||
|           radial-gradient(#fff 1%, transparent 11%); | ||||
|         background-image: | ||||
|           radial-gradient(#fff 1%, transparent 11%), radial-gradient(#fff 1%, transparent 11%); | ||||
|         background-size: 20px 20px; | ||||
|         background-position: | ||||
|           0 0, | ||||
| @@ -60,7 +60,7 @@ | ||||
|     <pre id="diagram" class="mermaid2"> | ||||
|  timeline | ||||
|         title My day | ||||
|         section section with no tasks | ||||
|         section Section with no tasks | ||||
|         section Go to work at the dog office | ||||
|           1930 : first step : second step is a long step | ||||
|                : third step | ||||
| @@ -70,18 +70,18 @@ | ||||
|           1960 : India fights poverty, looses war to China and gets nuclear weapons from USA and USSR | ||||
|           1970 : Green Revolution comes to india | ||||
|         section Another section with no tasks | ||||
|           I am a big big big tasks | ||||
|           I am not so big tasks | ||||
|           I am a very, very big task | ||||
|           I am not so big task | ||||
|     </pre> | ||||
|     <pre id="diagram" class="mermaid"> | ||||
|  timeline | ||||
|         title MermaidChart 2023 Timeline | ||||
|         section 2023 Q1 <br> Release Personal Tier | ||||
|           Buttet 1 : sub-point 1a : sub-point 1b | ||||
|           Bullet 1 : sub-point 1a : sub-point 1b | ||||
|                : sub-point 1c | ||||
|           Bullet 2 : sub-point 2a : sub-point 2b | ||||
|         section 2023 Q2 <br> Release XYZ Tier | ||||
|           Buttet 3 : sub-point <br> 3a : sub-point 3b | ||||
|           Bullet 3 : sub-point <br> 3a : sub-point 3b | ||||
|                : sub-point 3c | ||||
|           Bullet 4 : sub-point 4a : sub-point 4b | ||||
|  | ||||
| @@ -93,7 +93,7 @@ | ||||
|         section Stone Age | ||||
|           7600 BC : Britain's oldest known house was built in Orkney, Scotland | ||||
|           6000 BC : Sea levels rise and Britain becomes an island. The people who live here are hunter-gatherers. | ||||
|         section Broze Age | ||||
|         section Bronze Age | ||||
|           2300 BC : People arrive from Europe and settle in Britain. They bring farming and metalworking. | ||||
|                : New styles of pottery and ways of burying the dead appear. | ||||
|           2200 BC : The last major building works are completed at Stonehenge. People now bury their dead in stone circles. | ||||
| @@ -106,7 +106,7 @@ | ||||
|         title History of Social Media Platform | ||||
|           2002 : LinkedIn | ||||
|           2004 : Facebook : Google : Pixar | ||||
|           2005 : Youtube | ||||
|           2005 : YouTube | ||||
|           2006 : Twitter | ||||
|           2007 : Tumblr | ||||
|           2008s : Instagram | ||||
| @@ -122,7 +122,7 @@ | ||||
|         title History of Social Media Platform | ||||
|           2002 : LinkedIn | ||||
|           2004 : Facebook : Google : Pixar | ||||
|           2005 : Youtube | ||||
|           2005 : YouTube | ||||
|           2006 : Twitter | ||||
|           2007 : Tumblr | ||||
|           2008s : Instagram | ||||
| @@ -139,7 +139,7 @@ | ||||
|         title History of Social Media Platform | ||||
|           2002 : LinkedIn | ||||
|           2004 : Facebook : Google | ||||
|           2005 : Youtube | ||||
|           2005 : YouTube | ||||
|           2006 : Twitter | ||||
|           2007 : Tumblr | ||||
|           2008 : Instagram | ||||
| @@ -152,7 +152,7 @@ | ||||
|         title History of Social Media Platform | ||||
|           2002 : LinkedIn | ||||
|           2004 : Facebook : Google | ||||
|           2005 : Youtube | ||||
|           2005 : YouTube | ||||
|           2006 : Twitter | ||||
|           2007 : Tumblr | ||||
|           2008s : Instagram | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
|     <link href="https://fonts.googleapis.com/css?family=Montserrat&display=swap" rel="stylesheet" /> | ||||
|     <link | ||||
|       rel="stylesheet" | ||||
|       href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/font-awesome.min.css" | ||||
|       href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/font-awesome.min.css" | ||||
|     /> | ||||
|     <link | ||||
|       href="https://fonts.googleapis.com/css?family=Noto+Sans+SC&display=swap" | ||||
| @@ -37,7 +37,7 @@ | ||||
|         +String owner | ||||
|         +BigDecimal balance | ||||
|         +deposit(amount) bool | ||||
|         +withdrawl(amount) int | ||||
|         +withdrawal(amount) int | ||||
|        } | ||||
|        cssClass "BankAccount" customCss | ||||
|  | ||||
| @@ -56,7 +56,7 @@ classE o-- classF : aggregation | ||||
|           +String owner | ||||
|           +BigDecimal balance | ||||
|           +deposit(amount) bool | ||||
|           +withdrawl(amount) int | ||||
|           +withdrawal(amount) int | ||||
|         } | ||||
|           Class01~T~ <|-- AveryLongClass : Cool | ||||
|           Class03~T~ *-- Class04~T~ | ||||
|   | ||||
| @@ -77,7 +77,7 @@ | ||||
|  | ||||
|         document.getElementsByTagName('body')[0].appendChild(div); | ||||
|       } | ||||
|       mermaid.initialize({ startOnLoad: true, securityLevel: 'strct', logLevel: 1 }); | ||||
|       mermaid.initialize({ startOnLoad: true, securityLevel: 'strict_', logLevel: 1 }); | ||||
|     </script> | ||||
|   </body> | ||||
| </html> | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
|     <link href="https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" rel="stylesheet" /> | ||||
|     <link | ||||
|       rel="stylesheet" | ||||
|       href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/font-awesome.min.css" | ||||
|       href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/font-awesome.min.css" | ||||
|     /> | ||||
|     <link | ||||
|       href="https://fonts.googleapis.com/css?family=Noto+Sans+SC&display=swap" | ||||
| @@ -31,7 +31,7 @@ | ||||
|         flowchart BT subgraph S1 sub1 -->sub2 end subgraph S2 sub4 end S1 --> S2 sub1 --> sub4 | ||||
|       </div> | ||||
|       <div class="mermaid2" style="width: 50%; height: 200px"> | ||||
|         sequenceDiagram Alice->>Bob:Extremely utterly long line of longness which had preivously | ||||
|         sequenceDiagram Alice->>Bob:Extremely utterly long line of longness which had previously | ||||
|         overflown the actor box as it is much longer than what it should be Bob->>Alice: I'm short | ||||
|         though | ||||
|       </div> | ||||
| @@ -61,9 +61,9 @@ | ||||
|       #quot;elit#quot;."}} | ||||
|     </div> | ||||
|     <div class="mermaid2" style="width: 50%; height: 50%"> | ||||
|       flowchart TB internet nat routeur lb1 lb2 compute1 compute2 subgraph project routeur nat | ||||
|       subgraph subnet1 compute1 lb1 end subgraph subnet2 compute2 lb2 end end internet --> routeur | ||||
|       routeur --> subnet1 & subnet2 subnet1 & subnet2 --> nat --> internet | ||||
|       flowchart TB internet nat router lb1 lb2 compute1 compute2 subgraph project router nat | ||||
|       subgraph subnet1 compute1 lb1 end subgraph subnet2 compute2 lb2 end end internet --> router | ||||
|       router --> subnet1 & subnet2 subnet1 & subnet2 --> nat --> internet | ||||
|     </div> | ||||
|     <div class="mermaid2" style="width: 50%; height: 50%"> | ||||
|       flowchart TD subgraph one[One] subgraph sub_one[Sub One] _sub_one end end subgraph two[Two] | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
|     <link href="https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" rel="stylesheet" /> | ||||
|     <link | ||||
|       rel="stylesheet" | ||||
|       href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/font-awesome.min.css" | ||||
|       href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/font-awesome.min.css" | ||||
|     /> | ||||
|     <link | ||||
|       href="https://fonts.googleapis.com/css?family=Noto+Sans+SC&display=swap" | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|       rel="stylesheet" | ||||
|     /> | ||||
|     <style> | ||||
|       svg { | ||||
|       svg:not(svg svg) { | ||||
|         border: 2px solid darkred; | ||||
|       } | ||||
|       .exClass2 > rect, | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
|     <link href="https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" rel="stylesheet" /> | ||||
|     <link | ||||
|       rel="stylesheet" | ||||
|       href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" | ||||
|       href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/font-awesome.min.css" | ||||
|     /> | ||||
|     <link | ||||
|       href="https://cdn.jsdelivr.net/npm/@mdi/font@6.9.96/css/materialdesignicons.min.css" | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
|     <link href="https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" rel="stylesheet" /> | ||||
|     <link | ||||
|       rel="stylesheet" | ||||
|       href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" | ||||
|       href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/font-awesome.min.css" | ||||
|     /> | ||||
|     <link | ||||
|       href="https://cdn.jsdelivr.net/npm/@mdi/font@6.9.96/css/materialdesignicons.min.css" | ||||
| @@ -4,7 +4,7 @@ | ||||
|     <link href="https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" rel="stylesheet" /> | ||||
|     <link | ||||
|       rel="stylesheet" | ||||
|       href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/font-awesome.min.css" | ||||
|       href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/font-awesome.min.css" | ||||
|     /> | ||||
|     <link | ||||
|       href="https://fonts.googleapis.com/css?family=Noto+Sans+SC&display=swap" | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
|     <link href="https://fonts.googleapis.com/css?family=Montserrat&display=swap" rel="stylesheet" /> | ||||
|     <link | ||||
|       rel="stylesheet" | ||||
|       href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/font-awesome.min.css" | ||||
|       href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/font-awesome.min.css" | ||||
|     /> | ||||
|     <link | ||||
|       href="https://fonts.googleapis.com/css?family=Noto+Sans+SC&display=swap" | ||||
| @@ -38,7 +38,7 @@ | ||||
|         +String owner | ||||
|         +BigDecimal balance | ||||
|         +deposit(amount) bool | ||||
|         +withdrawl(amount) int | ||||
|         +withdrawal(amount) int | ||||
|        } | ||||
|        cssClass "BankAccount" customCss | ||||
|     </pre> | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
|     <link href="https://fonts.googleapis.com/css?family=Montserrat&display=swap" rel="stylesheet" /> | ||||
|     <link | ||||
|       rel="stylesheet" | ||||
|       href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/font-awesome.min.css" | ||||
|       href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/font-awesome.min.css" | ||||
|     /> | ||||
|     <link | ||||
|       href="https://fonts.googleapis.com/css?family=Noto+Sans+SC&display=swap" | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
|     <link href="https://fonts.googleapis.com/css?family=Montserrat&display=swap" rel="stylesheet" /> | ||||
|     <link | ||||
|       rel="stylesheet" | ||||
|       href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/font-awesome.min.css" | ||||
|       href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/font-awesome.min.css" | ||||
|     /> | ||||
|     <link | ||||
|       href="https://fonts.googleapis.com/css?family=Noto+Sans+SC&display=swap" | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
|     <link href="https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" rel="stylesheet" /> | ||||
|     <link | ||||
|       rel="stylesheet" | ||||
|       href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" | ||||
|       href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/font-awesome.min.css" | ||||
|     /> | ||||
|     <link | ||||
|       href="https://cdn.jsdelivr.net/npm/@mdi/font@6.9.96/css/materialdesignicons.min.css" | ||||
| @@ -30,8 +30,8 @@ | ||||
|       .mermaid svg { | ||||
|         /* font-size: 18px !important; */ | ||||
|         background-color: #efefef; | ||||
|         background-image: radial-gradient(#fff 51%, transparent 91%), | ||||
|           radial-gradient(#fff 51%, transparent 91%); | ||||
|         background-image: | ||||
|           radial-gradient(#fff 51%, transparent 91%), radial-gradient(#fff 51%, transparent 91%); | ||||
|         background-size: 20px 20px; | ||||
|         background-position: | ||||
|           0 0, | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
|     <link href="https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" rel="stylesheet" /> | ||||
|     <link | ||||
|       rel="stylesheet" | ||||
|       href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/font-awesome.min.css" | ||||
|       href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/font-awesome.min.css" | ||||
|     /> | ||||
|     <link | ||||
|       href="https://cdn.jsdelivr.net/npm/@mdi/font@6.9.96/css/materialdesignicons.min.css" | ||||
|   | ||||
| @@ -4,12 +4,16 @@ | ||||
|     <link href="https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" rel="stylesheet" /> | ||||
|     <link | ||||
|       rel="stylesheet" | ||||
|       href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" | ||||
|       href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/font-awesome.min.css" | ||||
|     /> | ||||
|     <link | ||||
|       href="https://cdn.jsdelivr.net/npm/@mdi/font@6.9.96/css/materialdesignicons.min.css" | ||||
|       rel="stylesheet" | ||||
|     /> | ||||
|     <link | ||||
|       href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/all.min.css" | ||||
|       rel="stylesheet" | ||||
|     /> | ||||
|     <link | ||||
|       href="https://fonts.googleapis.com/css?family=Noto+Sans+SC&display=swap" | ||||
|       rel="stylesheet" | ||||
| @@ -34,6 +38,7 @@ | ||||
|         /* background: rgb(221, 208, 208); */ | ||||
|         /* background: #333; */ | ||||
|         font-family: 'Arial'; | ||||
|         /* color: white; */ | ||||
|         /* font-size: 18px !important; */ | ||||
|       } | ||||
|  | ||||
| @@ -73,180 +78,355 @@ | ||||
|         font-family: monospace; | ||||
|         font-size: 72px; | ||||
|       } | ||||
|  | ||||
|       pre { | ||||
|         width: 100%; | ||||
|       } | ||||
|  | ||||
|       /* tspan { | ||||
|               font-size: 6px !important; | ||||
|             } */ | ||||
|       /* .flowchart-link { | ||||
|         stroke-dasharray: 4, 4 !important; | ||||
|         animation: flow 1s linear infinite; | ||||
|         animation: dashdraw 4.93282s linear infinite; | ||||
|         stroke-width: 2px !important; | ||||
|       } */ | ||||
|  | ||||
|       @keyframes dashdraw { | ||||
|         from { | ||||
|           stroke-dashoffset: 0; | ||||
|         } | ||||
|       } | ||||
|  | ||||
|       /*stroke-width:2;stroke-dasharray:10.000000,9.865639;stroke-dashoffset:-198.656393;animation:    4.932820s linear infinite;*/ | ||||
|       /* stroke-width:2;stroke-dasharray:10.000000,9.865639;stroke-dashoffset:-198.656393;animation: dashdraw 4.932820s linear infinite;*/ | ||||
|     </style> | ||||
|   </head> | ||||
|  | ||||
|   <body> | ||||
|     <pre id="diagram" class="mermaid"> | ||||
|     <pre id="diagram4" class="mermaid"> | ||||
|       flowchart LR | ||||
|         AB["apa@apa@"] --> B(("`apa@apa`")) | ||||
|     </pre> | ||||
|     <pre id="diagram4" class="mermaid"> | ||||
|       flowchart | ||||
|         D(("for D")) | ||||
|     </pre> | ||||
|     <pre id="diagram4" class="mermaid"> | ||||
|       flowchart LR | ||||
|         A e1@==> B | ||||
|         e1@{ animate: true} | ||||
|     </pre> | ||||
|     <pre id="diagram4" class="mermaid"> | ||||
| flowchart LR | ||||
|   A e1@--> B | ||||
|   classDef animate stroke-width:2,stroke-dasharray:10\,8,stroke-dashoffset:-180,animation: edge-animation-frame 6s linear infinite, stroke-linecap: round | ||||
|   class e1 animate | ||||
|     </pre> | ||||
|     <h2>infinite</h2> | ||||
|     <pre id="diagram4" class="mermaid2"> | ||||
| flowchart LR | ||||
|   A e1@--> B | ||||
|   classDef animate stroke-dasharray: 9\,5,stroke-dashoffset: 900,animation: dash 25s linear infinite; | ||||
|   class e1 animate | ||||
|     </pre> | ||||
|     <h2>Mermaid - edge-animation-slow</h2> | ||||
|     <pre id="diagram4" class="mermaid2"> | ||||
| flowchart LR | ||||
|   A e1@--> B | ||||
| e1@{ animation: fast} | ||||
|     </pre> | ||||
|     <h2>Mermaid - edge-animation-fast</h2> | ||||
|     <pre id="diagram4" class="mermaid2"> | ||||
| flowchart LR | ||||
|   A e1@--> B | ||||
|   classDef animate stroke-dasharray: 1000,stroke-dashoffset: 1000,animation: dash 10s linear; | ||||
|   class e1 edge-animation-fast | ||||
|     </pre> | ||||
|  | ||||
|     <pre id="diagram4" class="mermaid2"> | ||||
|  | ||||
| info    </pre | ||||
|     > | ||||
|     <pre id="diagram4" class="mermaid2"> | ||||
| --- | ||||
|   title: hello2 | ||||
|   config: | ||||
|     look: handDrawn | ||||
|     layout: elk | ||||
|     elk: | ||||
|         <!-- nodePlacementStrategy: INTERACTIVE --> | ||||
|         <!-- mergeEdges: true --> | ||||
| config: | ||||
|   layout: elk | ||||
| --- | ||||
| stateDiagram-v2 | ||||
|     direction LR | ||||
|     accTitle: An idealized Open Source supply-chain graph | ||||
|       flowchart LR | ||||
|       a | ||||
|       subgraph s0["APA"] | ||||
|       subgraph s8["APA"] | ||||
|       subgraph s1["APA"] | ||||
|         D{"X"} | ||||
|         E[Q] | ||||
|       end | ||||
|       subgraph s3["BAPA"] | ||||
|         F[Q] | ||||
|         I | ||||
|       end | ||||
|             D --> I | ||||
|             D --> I | ||||
|             D --> I | ||||
|  | ||||
|     %% | ||||
|     state "🟦 Importer" as author_importer | ||||
|     state "🟥 Supplier, Owner" as author_owner | ||||
|     state "🟨🟥 Maintainer, Author\n🟨 Custodian" as author | ||||
|     state "🟩 Distributor" as repository_distributor | ||||
|     state "🟦 Importer" as language_importer | ||||
|     state "🟦🟨 Packager" as language_packager | ||||
|     state "🟦🟨 OSS Steward" as language_steward | ||||
|     state "🟨 Curator" as language_curator | ||||
|     state "🟩 Distributor" as language_distributor | ||||
|     state "🟦 Contributor" as contributor | ||||
|     state "🟦 Importer" as package_importer | ||||
|     state "🟨 Patcher" as package_patcher | ||||
|     state "🟨🟦 Builder\n🟨🟦 Packager\n🟨🟦 Containerizer" as package_packager | ||||
|     state "🟨 Curator" as package_curator | ||||
|     state "🟩 Distributor" as package_distributor | ||||
|     state "🟦 Importer" as integrator_importer | ||||
|     state "🟥 Supplier, Manufacturer, Owner" as integrator_owner | ||||
|     state "🟦🟨🟥 Integrator, Developer" as integrator_developer | ||||
|     state "🟩🟨 SBOM Redactor\n🟩 Publisher" as integrator_publisher | ||||
|     state "🟦🟨 Builder" as integrator_builder | ||||
|     state "🟨 Deployer" as deployer | ||||
|     state "🟦 Vuln. Checker" as integrator_checker | ||||
|     state "🟩🟨 SBOM Redactor" as redactor | ||||
|     state "🟦 Consumer\n🟦  User" as consumer | ||||
|     state "🟦 Auditor" as auditor_internal | ||||
|     state "🟦 Auditor" as auditor_external | ||||
|       I{"X"} | ||||
|       end | ||||
|       end | ||||
|     </pre> | ||||
|     <pre id="diagram4" class="mermaid2"> | ||||
| --- | ||||
| config: | ||||
|   layout: elk | ||||
| --- | ||||
|       flowchart LR | ||||
|       a | ||||
|         D{"Use the editor"} | ||||
|  | ||||
|     %% | ||||
|     classDef createsSBOM stroke:red,stroke-width:3px; | ||||
|     classDef updatesSBOM stroke:yellow,stroke-width:3px; | ||||
|     classDef assemblesSBOM stroke:yellow,stroke-width:3px; | ||||
|     classDef distributesSBOM stroke:green,stroke-width:3px; | ||||
|     classDef verifiesSBOM stroke:#07f,stroke-width:3px; | ||||
|       D -- Mermaid js --> I{"fa:fa-code Text"} | ||||
|       D-->I | ||||
|       D-->I | ||||
|     </pre> | ||||
|     <pre id="diagram4" class="mermaid2"> | ||||
| --- | ||||
| config: | ||||
|   layout: elk | ||||
| --- | ||||
| flowchart LR | ||||
|  subgraph s1["Untitled subgraph"] | ||||
|         n1["Evaluate"] | ||||
|         n2["Option 1"] | ||||
|         n3["Option 2"] | ||||
|         n4["fa:fa-car Option 3"] | ||||
|   end | ||||
|  subgraph s2["Untitled subgraph"] | ||||
|         n5["Evaluate"] | ||||
|         n6["Option 1"] | ||||
|         n7["Option 2"] | ||||
|         n8["fa:fa-car Option 3"] | ||||
|   end | ||||
|     A["Start"] -- Some text --> B("Continue") | ||||
|     B --> C{"Evaluate"} | ||||
|     C -- One --> D["Option 1"] | ||||
|     C -- Two --> E["Option 2"] | ||||
|     C -- Three --> F["fa:fa-car Option 3"] | ||||
|     n1 -- One --> n2 | ||||
|     n1 -- Two --> n3 | ||||
|     n1 -- Three --> n4 | ||||
|     n5 -- One --> n6 | ||||
|     n5 -- Two --> n7 | ||||
|     n5 -- Three --> n8 | ||||
|     n1@{ shape: diam} | ||||
|     n2@{ shape: rect} | ||||
|     n3@{ shape: rect} | ||||
|     n4@{ shape: rect} | ||||
|     n5@{ shape: diam} | ||||
|     n6@{ shape: rect} | ||||
|     n7@{ shape: rect} | ||||
|     n8@{ shape: rect} | ||||
|  | ||||
|     %% | ||||
|     class author_importer verifiesSBOM | ||||
|     class author_owner createsSBOM | ||||
|     class manufacturer_owner createsSBOM | ||||
|     class author assemblesSBOM | ||||
|     class package_importer verifiesSBOM | ||||
|     class package_patcher updatesSBOM | ||||
|     class package_packager assemblesSBOM | ||||
|     class package_curator distributesSBOM | ||||
|     class package_distributor distributesSBOM | ||||
|     class language_importer verifiesSBOM | ||||
|     class language_packager assemblesSBOM | ||||
|     class language_steward updatesSBOM | ||||
|     class language_curator distributesSBOM | ||||
|     class language_distributor distributesSBOM | ||||
|     class repository_distributor distributesSBOM | ||||
|     class integrator_importer verifiesSBOM | ||||
|     class integrator_owner createsSBOM | ||||
|     class integrator_developer assemblesSBOM | ||||
|     class integrator_publisher distributesSBOM | ||||
|     class integrator_builder assemblesSBOM | ||||
|     class integrator_checker verifiesSBOM | ||||
|     class deployer assemblesSBOM | ||||
|     class redactor distributesSBOM | ||||
|     class auditor_internal verifiesSBOM | ||||
|     class auditor_external verifiesSBOM | ||||
|  | ||||
|     state "Maintainer Environment" as environment_maintainer { | ||||
|         [*] --> author_importer | ||||
|         [*] --> author | ||||
|         author_importer --> author | ||||
|         author_owner --> author | ||||
|         author       --> language_packager | ||||
|     } | ||||
|  | ||||
|     [*] --> environment_maintainer | ||||
|  | ||||
|     state "Language Ecosystem" as ecosystem_lang { | ||||
|         [*] --> language_importer | ||||
|         [*] --> language_steward | ||||
|         [*] --> language_curator | ||||
|         [*] --> language_distributor | ||||
|         language_importer --> language_distributor | ||||
|         language_importer --> language_curator | ||||
|         language_steward --> language_curator | ||||
|         language_curator --> language_distributor | ||||
|     } | ||||
|  | ||||
|     language_packager --> ecosystem_lang | ||||
|     ecosystem_lang    --> ecosystem_lang | ||||
|  | ||||
|     state "Public Collaboration Ecosystem" as ecosystem_repo { | ||||
|         [*] --> repository_distributor | ||||
|     } | ||||
|  | ||||
|     author         --> ecosystem_repo | ||||
|     ecosystem_repo --> author | ||||
|  | ||||
|     repository_distributor --> contributor | ||||
|     contributor            --> repository_distributor | ||||
|  | ||||
|     state "Package Ecosystem" as ecosystem_package { | ||||
|         [*] --> package_importer | ||||
|         [*] --> package_packager | ||||
|         [*] --> package_patcher | ||||
|         package_importer --> package_patcher | ||||
|         package_importer --> package_packager | ||||
|         package_patcher  --> package_packager | ||||
|         package_packager --> package_curator | ||||
|         package_packager --> package_distributor | ||||
|         package_curator  --> package_distributor | ||||
|     } | ||||
|  | ||||
|     repository_distributor --> ecosystem_package | ||||
|     language_distributor   --> ecosystem_package | ||||
|     ecosystem_package      --> ecosystem_package | ||||
|  | ||||
|     state "Integrator Environment" as environment_integrator { | ||||
|         [*] --> integrator_developer | ||||
|         [*] --> integrator_importer | ||||
|         integrator_importer  --> integrator_developer | ||||
|         integrator_owner     --> integrator_developer | ||||
|         integrator_builder   --> integrator_publisher | ||||
|         integrator_developer --> integrator_checker | ||||
|         integrator_checker   --> integrator_developer | ||||
|         auditor_internal     --> integrator_developer | ||||
|         integrator_developer --> integrator_builder | ||||
|         integrator_developer --> auditor_internal | ||||
|     } | ||||
|  | ||||
|     repository_distributor --> environment_integrator | ||||
|     language_distributor   --> environment_integrator | ||||
|     package_distributor    --> environment_integrator | ||||
|  | ||||
|     state "Production Environment" as environment_prod { | ||||
|         [*] --> deployer | ||||
|         deployer --> redactor | ||||
|     } | ||||
|  | ||||
|     integrator_publisher --> [*] | ||||
|     integrator_developer --> environment_prod | ||||
|     integrator_builder   --> environment_prod | ||||
|     integrator_publisher --> environment_prod | ||||
|  | ||||
|     deployer --> auditor_external | ||||
|     deployer --> consumer | ||||
|     redactor --> consumer | ||||
|     </pre> | ||||
|     <pre id="diagram4" class="mermaid2"> | ||||
| --- | ||||
| config: | ||||
|   layout: elk | ||||
| --- | ||||
| flowchart LR | ||||
|  subgraph s1["Untitled subgraph"] | ||||
|         n1["Evaluate"] | ||||
|         n2["Option 1"] | ||||
|   end | ||||
|     n1 -- One --> n2 | ||||
|  | ||||
|  | ||||
|  | ||||
|       </pre> | ||||
|  | ||||
|     </pre> | ||||
|     <pre id="diagram4" class="mermaid2"> | ||||
| --- | ||||
| config: | ||||
|   layout: elk | ||||
| --- | ||||
| flowchart LR | ||||
|     A{A} --> B & C | ||||
| </pre | ||||
|     > | ||||
|     <pre id="diagram4" class="mermaid2"> | ||||
| --- | ||||
| config: | ||||
|   layout: elk | ||||
| --- | ||||
| flowchart LR | ||||
|     A{A} --> B & C | ||||
|     subgraph "subbe" | ||||
|       A | ||||
|     end | ||||
| </pre | ||||
|     > | ||||
|     <pre id="diagram4" class="mermaid2"> | ||||
| --- | ||||
| config: | ||||
|   layout: elk | ||||
| --- | ||||
| flowchart LR | ||||
|     n2@{ shape: rect} | ||||
|     n3@{ shape: rect} | ||||
|     n4@{ shape: rect} | ||||
|     A["Start"] -- Some text --> B("Continue") | ||||
|     B --> C{"Evaluate"} | ||||
|     C -- One --> D["Option 1"] | ||||
|     C -- Two --> E["Option 2"] | ||||
|     C -- Three --> F["fa:fa-car Option 3"] | ||||
|     %% C@{ shape: hexagon} | ||||
|  | ||||
|  | ||||
|     </pre> | ||||
|     <pre id="diagram4" class="mermaid2"> | ||||
| --- | ||||
| config: | ||||
|   kanban: | ||||
|     ticketBaseUrl: 'https://github.com/your-repo/issues/#TICKET#' | ||||
| --- | ||||
| kanban | ||||
|   Backlog | ||||
|     task1[📝 Define project requirements]@{ ticket: a101 } | ||||
|   To Do | ||||
|     task2[🔍 Research technologies]@{ ticket: a102 } | ||||
|   Review | ||||
|     task4[🔍 Code review for login feature]@{ ticket: a104 } | ||||
|   Done | ||||
|     task5[✅ Deploy initial version]@{ ticket: a105 } | ||||
|   In Progress | ||||
|     task3[💻 Develop login feature]@{ ticket: 103 } | ||||
|  | ||||
|     </pre> | ||||
|     <pre id="diagram4" class="mermaid2"> | ||||
| flowchart LR | ||||
| nA[Default] --> A@{ icon: 'fa:bell', form: 'rounded' } | ||||
|  | ||||
|     </pre> | ||||
|     <pre id="diagram4" class="mermaid2"> | ||||
| flowchart LR | ||||
| nA[Style] --> A@{ icon: 'fa:bell', form: 'rounded' } | ||||
| style A fill:#f9f,stroke:#333,stroke-width:4px | ||||
|     </pre> | ||||
|     <pre id="diagram4" class="mermaid2"> | ||||
| flowchart LR | ||||
| nA[Class] --> A@{ icon: 'fa:bell', form: 'rounded' } | ||||
| A:::AClass | ||||
| classDef AClass fill:#f9f,stroke:#333,stroke-width:4px | ||||
|     </pre> | ||||
|     <pre id="diagram4" class="mermaid2"> | ||||
| flowchart LR | ||||
|   nA[Class] --> A@{ icon: 'logos:aws', form: 'rounded' } | ||||
|  | ||||
|     </pre> | ||||
|     <pre id="diagram4" class="mermaid2"> | ||||
| flowchart LR | ||||
| nA[Default] --> A@{ icon: 'fa:bell', form: 'square' } | ||||
|  | ||||
|     </pre> | ||||
|     <pre id="diagram4" class="mermaid2"> | ||||
| flowchart LR | ||||
| nA[Style] --> A@{ icon: 'fa:bell', form: 'square' } | ||||
| style A fill:#f9f,stroke:#333,stroke-width:4px | ||||
|     </pre> | ||||
|     <pre id="diagram4" class="mermaid2"> | ||||
| flowchart LR | ||||
| nA[Class] --> A@{ icon: 'fa:bell', form: 'square' } | ||||
| A:::AClass | ||||
| classDef AClass fill:#f9f,stroke:#333,stroke-width:4px | ||||
|     </pre> | ||||
|     <pre id="diagram4" class="mermaid2"> | ||||
| flowchart LR | ||||
|   nA[Class] --> A@{ icon: 'logos:aws', form: 'square' } | ||||
|  | ||||
|     </pre> | ||||
|     <pre id="diagram4" class="mermaid2"> | ||||
| flowchart LR | ||||
| nA[Default] --> A@{ icon: 'fa:bell', form: 'circle' } | ||||
|  | ||||
|     </pre> | ||||
|     <pre id="diagram4" class="mermaid2"> | ||||
| flowchart LR | ||||
| nA[Style] --> A@{ icon: 'fa:bell', form: 'circle' } | ||||
| style A fill:#f9f,stroke:#333,stroke-width:4px | ||||
|     </pre> | ||||
|     <pre id="diagram4" class="mermaid2"> | ||||
| flowchart LR | ||||
| nA[Class] --> A@{ icon: 'fa:bell', form: 'circle' } | ||||
| A:::AClass | ||||
| classDef AClass fill:#f9f,stroke:#333,stroke-width:4px | ||||
|     </pre> | ||||
|     <pre id="diagram4" class="mermaid2"> | ||||
| flowchart LR | ||||
|   nA[Class] --> A@{ icon: 'logos:aws', form: 'circle' } | ||||
|   A:::AClass | ||||
|   classDef AClass fill:#f9f,stroke:#333,stroke-width:4px | ||||
|     </pre> | ||||
|     <pre id="diagram4" class="mermaid2"> | ||||
| flowchart LR | ||||
|   nA[Style] --> A@{ icon: 'logos:aws', form: 'circle' } | ||||
|   style A fill:#f9f,stroke:#333,stroke-width:4px | ||||
|     </pre> | ||||
|     <pre id="diagram4" class="mermaid2"> | ||||
| kanban | ||||
|   id2[In progress] | ||||
|     docs[Create Blog about the new diagram]@{ priority: 'Very Low', ticket: MC-2037, assigned: 'knsv' } | ||||
|     </pre> | ||||
|     <pre id="diagram4" class="mermaid2"> | ||||
| --- | ||||
| config: | ||||
|   kanban: | ||||
|     ticketBaseUrl: 'https://mermaidchart.atlassian.net/browse/#TICKET#' | ||||
|     # sectionWidth: 300 | ||||
| --- | ||||
| kanban | ||||
|   Todo | ||||
|     [Create Documentation] | ||||
|     docs[Create Blog about the new diagram] | ||||
|   id7[In progress] | ||||
|     id6[Create renderer so that it works in all cases. We also add some extra text here for testing purposes. And some more just for the extra flare.] | ||||
|   id9[Ready for deploy] | ||||
|     id8[Design grammar]@{ assigned: 'knsv' } | ||||
|   id10[Ready for test] | ||||
|     id4[Create parsing tests]@{ ticket: MC-2038, assigned: 'K.Sveidqvist', priority: 'High' } | ||||
|     id66[last item]@{ priority: 'Very Low', assigned: 'knsv' } | ||||
|   id11[Done] | ||||
|     id5[define getData] | ||||
|     id2[Title of diagram is more than 100 chars when user duplicates diagram with 100 char]@{ ticket: MC-2036, priority: 'Very High'} | ||||
|     id3[Update DB function]@{ ticket: MC-2037, assigned: knsv, priority: 'High' } | ||||
|  | ||||
|   id12[Can't reproduce] | ||||
|     id3[Weird flickering in Firefox] | ||||
|     </pre> | ||||
|     <script type="module"> | ||||
|       import mermaid from './mermaid.esm.mjs'; | ||||
|       import layouts from './mermaid-layout-elk.esm.mjs'; | ||||
|  | ||||
|       const staticBellIconPack = { | ||||
|         prefix: 'fa6-regular', | ||||
|         icons: { | ||||
|           bell: { | ||||
|             body: '<path fill="currentColor" d="M224 0c-17.7 0-32 14.3-32 32v19.2C119 66 64 130.6 64 208v25.4c0 45.4-15.5 89.5-43.8 124.9L5.3 377c-5.8 7.2-6.9 17.1-2.9 25.4S14.8 416 24 416h400c9.2 0 17.6-5.3 21.6-13.6s2.9-18.2-2.9-25.4l-14.9-18.6c-28.3-35.5-43.8-79.6-43.8-125V208c0-77.4-55-142-128-156.8V32c0-17.7-14.3-32-32-32m0 96c61.9 0 112 50.1 112 112v25.4c0 47.9 13.9 94.6 39.7 134.6H72.3c25.8-40 39.7-86.7 39.7-134.6V208c0-61.9 50.1-112 112-112m64 352H160c0 17 6.7 33.3 18.7 45.3S207 512 224 512s33.3-6.7 45.3-18.7S288 465 288 448"/>', | ||||
|             width: 448, | ||||
|           }, | ||||
|         }, | ||||
|         width: 512, | ||||
|         height: 512, | ||||
|       }; | ||||
|  | ||||
|       mermaid.registerIconPacks([ | ||||
|         { | ||||
|           name: 'logos', | ||||
|           loader: () => | ||||
|             fetch('https://unpkg.com/@iconify-json/logos@1/icons.json').then((res) => res.json()), | ||||
|         }, | ||||
|         { | ||||
|           name: 'fa', | ||||
|           loader: () => staticBellIconPack, | ||||
|         }, | ||||
|       ]); | ||||
|       mermaid.registerLayoutLoaders(layouts); | ||||
|       mermaid.parseError = function (err, hash) { | ||||
|         console.error('Mermaid error: ', err); | ||||
| @@ -254,8 +434,13 @@ stateDiagram-v2 | ||||
|       window.callback = function () { | ||||
|         alert('A callback was triggered'); | ||||
|       }; | ||||
|       mermaid.initialize({ | ||||
|       function callback() { | ||||
|         alert('It worked'); | ||||
|       } | ||||
|       await mermaid.initialize({ | ||||
|         // theme: 'base', | ||||
|         // theme: 'default', | ||||
|         // theme: 'forest', | ||||
|         // handDrawnSeed: 12, | ||||
|         // look: 'handDrawn', | ||||
|         // 'elk.nodePlacement.strategy': 'NETWORK_SIMPLEX', | ||||
| @@ -264,21 +449,25 @@ stateDiagram-v2 | ||||
|         // layout: 'fixed', | ||||
|         // htmlLabels: false, | ||||
|         flowchart: { titleTopMargin: 10 }, | ||||
|  | ||||
|         // fontFamily: 'Caveat', | ||||
|         // fontFamily: 'Kalam', | ||||
|         // fontFamily: 'courier', | ||||
|         fontFamily: 'arial', | ||||
|         sequence: { | ||||
|           actorFontFamily: 'courier', | ||||
|           noteFontFamily: 'courier', | ||||
|           messageFontFamily: 'courier', | ||||
|         }, | ||||
|         kanban: { | ||||
|           htmlLabels: false, | ||||
|         }, | ||||
|         fontSize: 12, | ||||
|         logLevel: 3, | ||||
|         logLevel: 0, | ||||
|         securityLevel: 'loose', | ||||
|         callback, | ||||
|       }); | ||||
|       function callback() { | ||||
|         alert('It worked'); | ||||
|       } | ||||
|  | ||||
|       mermaid.parseError = function (err, hash) { | ||||
|         console.error('In parse error:'); | ||||
|         console.error(err); | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
|     <link href="https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" rel="stylesheet" /> | ||||
|     <link | ||||
|       rel="stylesheet" | ||||
|       href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/font-awesome.min.css" | ||||
|       href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/font-awesome.min.css" | ||||
|     /> | ||||
|     <link | ||||
|       href="https://fonts.googleapis.com/css?family=Noto+Sans+SC&display=swap" | ||||
|   | ||||
							
								
								
									
										141
									
								
								cypress/platform/saurabh.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										141
									
								
								cypress/platform/saurabh.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,141 @@ | ||||
| <html> | ||||
|   <head> | ||||
|     <link href="https://fonts.googleapis.com/css?family=Montserrat&display=swap" rel="stylesheet" /> | ||||
|     <link href="https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" rel="stylesheet" /> | ||||
|     <link | ||||
|       rel="stylesheet" | ||||
|       href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/font-awesome.min.css" | ||||
|     /> | ||||
|     <link | ||||
|       href="https://cdn.jsdelivr.net/npm/@mdi/font@6.9.96/css/materialdesignicons.min.css" | ||||
|       rel="stylesheet" | ||||
|     /> | ||||
|     <link | ||||
|       href="https://fonts.googleapis.com/css?family=Noto+Sans+SC&display=swap" | ||||
|       rel="stylesheet" | ||||
|     /> | ||||
|     <link rel="preconnect" href="https://fonts.googleapis.com" /> | ||||
|     <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> | ||||
|     <link | ||||
|       href="https://fonts.googleapis.com/css2?family=Kalam:wght@300;400;700&display=swap" | ||||
|       rel="stylesheet" | ||||
|     /> | ||||
|     <link | ||||
|       href="https://fonts.googleapis.com/css2?family=Caveat:wght@400..700&family=Kalam:wght@300;400;700&family=Rubik+Mono+One&display=swap" | ||||
|       rel="stylesheet" | ||||
|     /> | ||||
|     <link | ||||
|       href="https://fonts.googleapis.com/css2?family=Kalam:wght@300;400;700&family=Rubik+Mono+One&display=swap" | ||||
|       rel="stylesheet" | ||||
|     /> | ||||
|  | ||||
|     <style> | ||||
|       body { | ||||
|         /* background: rgb(221, 208, 208); */ | ||||
|         /* background: #333; */ | ||||
|         font-family: 'Arial'; | ||||
|         /* font-size: 18px !important; */ | ||||
|       } | ||||
|  | ||||
|       h1 { | ||||
|         color: grey; | ||||
|       } | ||||
|  | ||||
|       .mermaid2 { | ||||
|         display: none; | ||||
|       } | ||||
|  | ||||
|       .mermaid svg { | ||||
|         /* font-size: 18px !important; */ | ||||
|  | ||||
|         /* background-color: #efefef; | ||||
|         background-image: radial-gradient(#fff 51%, transparent 91%), | ||||
|           radial-gradient(#fff 51%, transparent 91%); | ||||
|         background-size: 20px 20px; | ||||
|         background-position: | ||||
|           0 0, | ||||
|           10px 10px; | ||||
|         background-repeat: repeat; */ | ||||
|       } | ||||
|     </style> | ||||
|   </head> | ||||
|  | ||||
|   <body style="display: flex; gap: 2rem; flex-direction: row"> | ||||
|     <pre id="diagram4" class="mermaid"> | ||||
|       flowchart | ||||
|           A --> A | ||||
|           subgraph B | ||||
|             B1 --> B1 | ||||
|           end | ||||
|           subgraph C | ||||
|             subgraph C1 | ||||
|               C2 --> C2 | ||||
|               subgraph D | ||||
|                 D1 --> D1 | ||||
|               end | ||||
|               D --> D | ||||
|             end | ||||
|             C1 --> C1 | ||||
|           end | ||||
|  | ||||
|     </pre> | ||||
|     <script type="module"> | ||||
|       import mermaid from './mermaid.esm.mjs'; | ||||
|       import layouts from './mermaid-layout-elk.esm.mjs'; | ||||
|       mermaid.registerLayoutLoaders(layouts); | ||||
|       mermaid.registerIconPacks([ | ||||
|         { | ||||
|           name: 'logos', | ||||
|           loader: () => | ||||
|             fetch('https://unpkg.com/@iconify-json/logos/icons.json').then((res) => res.json()), | ||||
|         }, | ||||
|         { | ||||
|           name: 'fa', | ||||
|           loader: () => | ||||
|             fetch('https://unpkg.com/@iconify-json/fa6-solid/icons.json').then((res) => res.json()), | ||||
|         }, | ||||
|       ]); | ||||
|       mermaid.parseError = function (err, hash) { | ||||
|         console.error('Mermaid error: ', err); | ||||
|       }; | ||||
|       window.callback = function () { | ||||
|         alert('A callback was triggered'); | ||||
|       }; | ||||
|       mermaid.initialize({ | ||||
|         // theme: 'base', | ||||
|         // handdrawnSeed: 12, | ||||
|         look: 'classic', | ||||
|         // 'elk.nodePlacement.strategy': 'NETWORK_SIMPLEX', | ||||
|         // 'elk.nodePlacement.strategy': 'SIMPLE', | ||||
|         // 'elk.nodePlacement.strategy': 'LAYERED', | ||||
|         // 'elk.mergeEdges': true, | ||||
|         // layout: 'dagre', | ||||
|         // layout: 'elk', | ||||
|         // layout: 'fixed', | ||||
|         // htmlLabels: false, | ||||
|         flowchart: { titleTopMargin: 10, padding: 0, htmlLabels: true }, | ||||
|         // fontFamily: 'Caveat', | ||||
|         // fontFamily: 'Kalam', | ||||
|         fontFamily: 'courier', | ||||
|         sequence: { | ||||
|           actorFontFamily: 'courier', | ||||
|           noteFontFamily: 'courier', | ||||
|           messageFontFamily: 'courier', | ||||
|         }, | ||||
|         themeVariables: { | ||||
|           fontSize: 50, | ||||
|           fontFamily: 'courier', | ||||
|         }, | ||||
|         logLevel: 0, | ||||
|         securityLevel: 'loose', | ||||
|       }); | ||||
|       function callback() { | ||||
|         alert('It worked'); | ||||
|       } | ||||
|       mermaid.parseError = function (err, hash) { | ||||
|         console.error('In parse error:'); | ||||
|         console.error(err); | ||||
|       }; | ||||
|     </script> | ||||
|   </body> | ||||
| </html> | ||||
| @@ -4,7 +4,7 @@ | ||||
|     <link href="https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" rel="stylesheet" /> | ||||
|     <link | ||||
|       rel="stylesheet" | ||||
|       href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.2/css/font-awesome.min.css" | ||||
|       href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/font-awesome.min.css" | ||||
|     /> | ||||
|     <link | ||||
|       href="https://fonts.googleapis.com/css?family=Noto+Sans+SC&display=swap" | ||||
|   | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user