diff --git a/examples/default/domains/Orders/index.md b/examples/default/domains/Orders/index.md
index f2fcffda..d3ae6cdd 100644
--- a/examples/default/domains/Orders/index.md
+++ b/examples/default/domains/Orders/index.md
@@ -11,7 +11,7 @@ services:
- id: NotificationService
version: 0.0.2
- id: OrdersService
- version: 0.0.2
+ version: 0.0.3
badges:
- content: New domain
backgroundColor: blue
diff --git a/examples/default/domains/Orders/services/OrdersService/index.md b/examples/default/domains/Orders/services/OrdersService/index.md
index 0f4e9363..41444cd9 100644
--- a/examples/default/domains/Orders/services/OrdersService/index.md
+++ b/examples/default/domains/Orders/services/OrdersService/index.md
@@ -10,6 +10,7 @@ receives:
- id: InventoryAdjusted
version: 0.0.3
- id: GetOrder
+ - id: UserSubscriptionCancelled
sends:
- id: OrderAmended
- id: OrderCancelled
diff --git a/examples/default/domains/Payment/services/PaymentService/index.md b/examples/default/domains/Payment/services/PaymentService/index.md
index 2a97d1dd..25fda291 100644
--- a/examples/default/domains/Payment/services/PaymentService/index.md
+++ b/examples/default/domains/Payment/services/PaymentService/index.md
@@ -10,6 +10,8 @@ receives:
- id: PaymentInitiated
version: 0.0.1
- id: GetPaymentStatus
+ - id: UserSubscriptionStarted
+ - id: InventoryAdjusted
sends:
- id: PaymentProcessed
version: 0.0.1
diff --git a/examples/default/domains/Subscriptions/services/SubscriptionService/index.md b/examples/default/domains/Subscriptions/services/SubscriptionService/index.md
index ad897c55..d1a4aa81 100644
--- a/examples/default/domains/Subscriptions/services/SubscriptionService/index.md
+++ b/examples/default/domains/Subscriptions/services/SubscriptionService/index.md
@@ -12,6 +12,8 @@ receives:
- id: CancelSubscription
version: 0.0.1
- id: GetSubscriptionStatus
+ - id: PaymentProcessed
+ version: 0.0.1
sends:
- id: UserSubscriptionStarted
version: 0.0.1
diff --git a/package-lock.json b/package-lock.json
index 2f80c222..f2a2d18d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -36,6 +36,7 @@
"@stoplight/mosaic": "^1.53.2",
"@tailwindcss/typography": "^0.5.13",
"@tanstack/react-table": "^8.17.3",
+ "@xyflow/react": "^12.3.6",
"astro": "^4.16.5",
"astro-expressive-code": "^0.36.1",
"astro-pagefind": "^1.6.0",
@@ -53,7 +54,6 @@
"rapidoc": "^9.3.4",
"react": "^18.3.1",
"react-dom": "^18.3.1",
- "reactflow": "^11.11.4",
"rehype-slug": "^6.0.0",
"remark-gfm": "^3.0.1",
"semver": "7.6.3",
@@ -3461,102 +3461,6 @@
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
}
},
- "node_modules/@reactflow/background": {
- "version": "11.3.14",
- "resolved": "https://registry.npmjs.org/@reactflow/background/-/background-11.3.14.tgz",
- "integrity": "sha512-Gewd7blEVT5Lh6jqrvOgd4G6Qk17eGKQfsDXgyRSqM+CTwDqRldG2LsWN4sNeno6sbqVIC2fZ+rAUBFA9ZEUDA==",
- "dependencies": {
- "@reactflow/core": "11.11.4",
- "classcat": "^5.0.3",
- "zustand": "^4.4.1"
- },
- "peerDependencies": {
- "react": ">=17",
- "react-dom": ">=17"
- }
- },
- "node_modules/@reactflow/controls": {
- "version": "11.2.14",
- "resolved": "https://registry.npmjs.org/@reactflow/controls/-/controls-11.2.14.tgz",
- "integrity": "sha512-MiJp5VldFD7FrqaBNIrQ85dxChrG6ivuZ+dcFhPQUwOK3HfYgX2RHdBua+gx+40p5Vw5It3dVNp/my4Z3jF0dw==",
- "dependencies": {
- "@reactflow/core": "11.11.4",
- "classcat": "^5.0.3",
- "zustand": "^4.4.1"
- },
- "peerDependencies": {
- "react": ">=17",
- "react-dom": ">=17"
- }
- },
- "node_modules/@reactflow/core": {
- "version": "11.11.4",
- "resolved": "https://registry.npmjs.org/@reactflow/core/-/core-11.11.4.tgz",
- "integrity": "sha512-H4vODklsjAq3AMq6Np4LE12i1I4Ta9PrDHuBR9GmL8uzTt2l2jh4CiQbEMpvMDcp7xi4be0hgXj+Ysodde/i7Q==",
- "dependencies": {
- "@types/d3": "^7.4.0",
- "@types/d3-drag": "^3.0.1",
- "@types/d3-selection": "^3.0.3",
- "@types/d3-zoom": "^3.0.1",
- "classcat": "^5.0.3",
- "d3-drag": "^3.0.0",
- "d3-selection": "^3.0.0",
- "d3-zoom": "^3.0.0",
- "zustand": "^4.4.1"
- },
- "peerDependencies": {
- "react": ">=17",
- "react-dom": ">=17"
- }
- },
- "node_modules/@reactflow/minimap": {
- "version": "11.7.14",
- "resolved": "https://registry.npmjs.org/@reactflow/minimap/-/minimap-11.7.14.tgz",
- "integrity": "sha512-mpwLKKrEAofgFJdkhwR5UQ1JYWlcAAL/ZU/bctBkuNTT1yqV+y0buoNVImsRehVYhJwffSWeSHaBR5/GJjlCSQ==",
- "dependencies": {
- "@reactflow/core": "11.11.4",
- "@types/d3-selection": "^3.0.3",
- "@types/d3-zoom": "^3.0.1",
- "classcat": "^5.0.3",
- "d3-selection": "^3.0.0",
- "d3-zoom": "^3.0.0",
- "zustand": "^4.4.1"
- },
- "peerDependencies": {
- "react": ">=17",
- "react-dom": ">=17"
- }
- },
- "node_modules/@reactflow/node-resizer": {
- "version": "2.2.14",
- "resolved": "https://registry.npmjs.org/@reactflow/node-resizer/-/node-resizer-2.2.14.tgz",
- "integrity": "sha512-fwqnks83jUlYr6OHcdFEedumWKChTHRGw/kbCxj0oqBd+ekfs+SIp4ddyNU0pdx96JIm5iNFS0oNrmEiJbbSaA==",
- "dependencies": {
- "@reactflow/core": "11.11.4",
- "classcat": "^5.0.4",
- "d3-drag": "^3.0.0",
- "d3-selection": "^3.0.0",
- "zustand": "^4.4.1"
- },
- "peerDependencies": {
- "react": ">=17",
- "react-dom": ">=17"
- }
- },
- "node_modules/@reactflow/node-toolbar": {
- "version": "1.3.14",
- "resolved": "https://registry.npmjs.org/@reactflow/node-toolbar/-/node-toolbar-1.3.14.tgz",
- "integrity": "sha512-rbynXQnH/xFNu4P9H+hVqlEUafDCkEoCy0Dg9mG22Sg+rY/0ck6KkrAQrYrTgXusd+cEJOMK0uOOFCK2/5rSGQ==",
- "dependencies": {
- "@reactflow/core": "11.11.4",
- "classcat": "^5.0.3",
- "zustand": "^4.4.1"
- },
- "peerDependencies": {
- "react": ">=17",
- "react-dom": ">=17"
- }
- },
"node_modules/@rehooks/component-size": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@rehooks/component-size/-/component-size-1.0.3.tgz",
@@ -6454,93 +6358,11 @@
"resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz",
"integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA=="
},
- "node_modules/@types/d3": {
- "version": "7.4.3",
- "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz",
- "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==",
- "dependencies": {
- "@types/d3-array": "*",
- "@types/d3-axis": "*",
- "@types/d3-brush": "*",
- "@types/d3-chord": "*",
- "@types/d3-color": "*",
- "@types/d3-contour": "*",
- "@types/d3-delaunay": "*",
- "@types/d3-dispatch": "*",
- "@types/d3-drag": "*",
- "@types/d3-dsv": "*",
- "@types/d3-ease": "*",
- "@types/d3-fetch": "*",
- "@types/d3-force": "*",
- "@types/d3-format": "*",
- "@types/d3-geo": "*",
- "@types/d3-hierarchy": "*",
- "@types/d3-interpolate": "*",
- "@types/d3-path": "*",
- "@types/d3-polygon": "*",
- "@types/d3-quadtree": "*",
- "@types/d3-random": "*",
- "@types/d3-scale": "*",
- "@types/d3-scale-chromatic": "*",
- "@types/d3-selection": "*",
- "@types/d3-shape": "*",
- "@types/d3-time": "*",
- "@types/d3-time-format": "*",
- "@types/d3-timer": "*",
- "@types/d3-transition": "*",
- "@types/d3-zoom": "*"
- }
- },
- "node_modules/@types/d3-array": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz",
- "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg=="
- },
- "node_modules/@types/d3-axis": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz",
- "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==",
- "dependencies": {
- "@types/d3-selection": "*"
- }
- },
- "node_modules/@types/d3-brush": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz",
- "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==",
- "dependencies": {
- "@types/d3-selection": "*"
- }
- },
- "node_modules/@types/d3-chord": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz",
- "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg=="
- },
"node_modules/@types/d3-color": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz",
"integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A=="
},
- "node_modules/@types/d3-contour": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz",
- "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==",
- "dependencies": {
- "@types/d3-array": "*",
- "@types/geojson": "*"
- }
- },
- "node_modules/@types/d3-delaunay": {
- "version": "6.0.4",
- "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz",
- "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw=="
- },
- "node_modules/@types/d3-dispatch": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz",
- "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ=="
- },
"node_modules/@types/d3-drag": {
"version": "3.0.7",
"resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz",
@@ -6549,47 +6371,6 @@
"@types/d3-selection": "*"
}
},
- "node_modules/@types/d3-dsv": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz",
- "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g=="
- },
- "node_modules/@types/d3-ease": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz",
- "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA=="
- },
- "node_modules/@types/d3-fetch": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz",
- "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==",
- "dependencies": {
- "@types/d3-dsv": "*"
- }
- },
- "node_modules/@types/d3-force": {
- "version": "3.0.10",
- "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz",
- "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw=="
- },
- "node_modules/@types/d3-format": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz",
- "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g=="
- },
- "node_modules/@types/d3-geo": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz",
- "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==",
- "dependencies": {
- "@types/geojson": "*"
- }
- },
- "node_modules/@types/d3-hierarchy": {
- "version": "3.1.7",
- "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz",
- "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg=="
- },
"node_modules/@types/d3-interpolate": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz",
@@ -6598,26 +6379,6 @@
"@types/d3-color": "*"
}
},
- "node_modules/@types/d3-path": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.0.tgz",
- "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ=="
- },
- "node_modules/@types/d3-polygon": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz",
- "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA=="
- },
- "node_modules/@types/d3-quadtree": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz",
- "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg=="
- },
- "node_modules/@types/d3-random": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz",
- "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ=="
- },
"node_modules/@types/d3-scale": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz",
@@ -6632,37 +6393,19 @@
"integrity": "sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw=="
},
"node_modules/@types/d3-selection": {
- "version": "3.0.10",
- "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.10.tgz",
- "integrity": "sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg=="
- },
- "node_modules/@types/d3-shape": {
- "version": "3.1.6",
- "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz",
- "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==",
- "dependencies": {
- "@types/d3-path": "*"
- }
+ "version": "3.0.11",
+ "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz",
+ "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w=="
},
"node_modules/@types/d3-time": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz",
"integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw=="
},
- "node_modules/@types/d3-time-format": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz",
- "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg=="
- },
- "node_modules/@types/d3-timer": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz",
- "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw=="
- },
"node_modules/@types/d3-transition": {
- "version": "3.0.8",
- "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.8.tgz",
- "integrity": "sha512-ew63aJfQ/ms7QQ4X7pk5NxQ9fZH/z+i24ZfJ6tJSfqxJMrYLiK01EAs2/Rtw/JreGUsS3pLPNV644qXFGnoZNQ==",
+ "version": "3.0.9",
+ "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz",
+ "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==",
"dependencies": {
"@types/d3-selection": "*"
}
@@ -6725,11 +6468,6 @@
"@types/estree": "*"
}
},
- "node_modules/@types/geojson": {
- "version": "7946.0.14",
- "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz",
- "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg=="
- },
"node_modules/@types/hast": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz",
@@ -7106,6 +6844,34 @@
"resolved": "https://registry.npmjs.org/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz",
"integrity": "sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ=="
},
+ "node_modules/@xyflow/react": {
+ "version": "12.3.6",
+ "resolved": "https://registry.npmjs.org/@xyflow/react/-/react-12.3.6.tgz",
+ "integrity": "sha512-9GS+cz8hDZahpvTrVCmySAEgKUL8oN4b2q1DluHrKtkqhAMWfH2s7kblhbM4Y4Y4SUnH2lt4drXKZ/4/Lot/2Q==",
+ "dependencies": {
+ "@xyflow/system": "0.0.47",
+ "classcat": "^5.0.3",
+ "zustand": "^4.4.0"
+ },
+ "peerDependencies": {
+ "react": ">=17",
+ "react-dom": ">=17"
+ }
+ },
+ "node_modules/@xyflow/system": {
+ "version": "0.0.47",
+ "resolved": "https://registry.npmjs.org/@xyflow/system/-/system-0.0.47.tgz",
+ "integrity": "sha512-aUXJPIvsCFxGX70ccRG8LPsR+A8ExYXfh/noYNpqn8udKerrLdSHxMG2VsvUrQ1PGex10fOpbJwFU4A+I/Xv8w==",
+ "dependencies": {
+ "@types/d3-drag": "^3.0.7",
+ "@types/d3-selection": "^3.0.10",
+ "@types/d3-transition": "^3.0.8",
+ "@types/d3-zoom": "^3.0.8",
+ "d3-drag": "^3.0.0",
+ "d3-selection": "^3.0.0",
+ "d3-zoom": "^3.0.0"
+ }
+ },
"node_modules/abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@@ -18181,23 +17947,6 @@
"react-dom": "*"
}
},
- "node_modules/reactflow": {
- "version": "11.11.4",
- "resolved": "https://registry.npmjs.org/reactflow/-/reactflow-11.11.4.tgz",
- "integrity": "sha512-70FOtJkUWH3BAOsN+LU9lCrKoKbtOPnz2uq0CV2PLdNSwxTXOhCbsZr50GmZ+Rtw3jx8Uv7/vBFtCGixLfd4Og==",
- "dependencies": {
- "@reactflow/background": "11.3.14",
- "@reactflow/controls": "11.2.14",
- "@reactflow/core": "11.11.4",
- "@reactflow/minimap": "11.7.14",
- "@reactflow/node-resizer": "2.2.14",
- "@reactflow/node-toolbar": "1.3.14"
- },
- "peerDependencies": {
- "react": ">=17",
- "react-dom": ">=17"
- }
- },
"node_modules/read-cache": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
@@ -21056,9 +20805,9 @@
}
},
"node_modules/use-sync-external-store": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
- "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==",
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz",
+ "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==",
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0"
}
@@ -22176,11 +21925,11 @@
}
},
"node_modules/zustand": {
- "version": "4.5.4",
- "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.4.tgz",
- "integrity": "sha512-/BPMyLKJPtFEvVL0E9E9BTUM63MNyhPGlvxk1XjrfWTUlV+BR8jufjsovHzrtR6YNcBEcL7cMHovL1n9xHawEg==",
+ "version": "4.5.5",
+ "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.5.tgz",
+ "integrity": "sha512-+0PALYNJNgK6hldkgDq2vLrw5f6g/jCInz52n9RTpropGgeAf/ioFUCdtsjCqu4gNhW9D01rUQBROoRjdzyn2Q==",
"dependencies": {
- "use-sync-external-store": "1.2.0"
+ "use-sync-external-store": "1.2.2"
},
"engines": {
"node": ">=12.7.0"
diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md
index fa263c7d..a87d0de0 100644
--- a/packages/core/CHANGELOG.md
+++ b/packages/core/CHANGELOG.md
@@ -1,5 +1,11 @@
# @eventcatalog/core
+## 2.16.3
+
+### Patch Changes
+
+- 9c84f9c: feat(core): added inital version of the domain map to visualizer
+
## 2.16.2
### Patch Changes
diff --git a/packages/core/eventcatalog/package.json b/packages/core/eventcatalog/package.json
index 78be268c..3fe28709 100644
--- a/packages/core/eventcatalog/package.json
+++ b/packages/core/eventcatalog/package.json
@@ -30,6 +30,7 @@
"@stoplight/mosaic": "^1.53.2",
"@tailwindcss/typography": "^0.5.13",
"@tanstack/react-table": "^8.17.3",
+ "@xyflow/react": "^12.3.6",
"astro": "^4.16.5",
"astro-expressive-code": "^0.36.1",
"astro-pagefind": "^1.6.0",
@@ -47,7 +48,6 @@
"rapidoc": "^9.3.4",
"react": "^18.3.1",
"react-dom": "^18.3.1",
- "reactflow": "^11.11.4",
"rehype-slug": "^6.0.0",
"remark-gfm": "^3.0.1",
"semver": "7.6.3",
diff --git a/packages/core/eventcatalog/src/components/MDX/Accordion/Accordion.tsx b/packages/core/eventcatalog/src/components/MDX/Accordion/Accordion.tsx
index 5d43bece..00d10e43 100644
--- a/packages/core/eventcatalog/src/components/MDX/Accordion/Accordion.tsx
+++ b/packages/core/eventcatalog/src/components/MDX/Accordion/Accordion.tsx
@@ -7,7 +7,7 @@ export default function Example({ title, children }: any) {
{({ open }) => (
- <>
+
{title}
@@ -21,7 +21,7 @@ export default function Example({ title, children }: any) {
{children}
- >
+
)}
diff --git a/packages/core/eventcatalog/src/components/MDX/AsyncAPI/AsyncAPI.astro b/packages/core/eventcatalog/src/components/MDX/AsyncAPI/AsyncAPI.astro
index 2b8a2c63..fbef31c6 100644
--- a/packages/core/eventcatalog/src/components/MDX/AsyncAPI/AsyncAPI.astro
+++ b/packages/core/eventcatalog/src/components/MDX/AsyncAPI/AsyncAPI.astro
@@ -4,13 +4,13 @@ import Admonition from '../Admonition';
- <>
+
{` `} component now deprecated
Use the new specifications frontmatter api. Read more here.
- >
+
diff --git a/packages/core/eventcatalog/src/components/MDX/ChannelInformation/ChannelInformation.tsx b/packages/core/eventcatalog/src/components/MDX/ChannelInformation/ChannelInformation.tsx
index bc6a46c8..b7747202 100644
--- a/packages/core/eventcatalog/src/components/MDX/ChannelInformation/ChannelInformation.tsx
+++ b/packages/core/eventcatalog/src/components/MDX/ChannelInformation/ChannelInformation.tsx
@@ -25,9 +25,9 @@ const ChannelParameters = (data: CollectionEntry<'channels'>['data']) => {
{data.address && (
- <>
+
Address: {data.address}
- >
+
)}
{data.protocols && data.protocols.length > 0 && (
diff --git a/packages/core/eventcatalog/src/components/MDX/Flow/Flow.astro b/packages/core/eventcatalog/src/components/MDX/Flow/Flow.astro
index 9cbd424c..0780bd55 100644
--- a/packages/core/eventcatalog/src/components/MDX/Flow/Flow.astro
+++ b/packages/core/eventcatalog/src/components/MDX/Flow/Flow.astro
@@ -23,12 +23,12 @@ const { nodes, edges } = await getNodesAndEdges({
{
!flow && (
- <>
+
{` `} failed to load
Tried to load flow id: {id} with version {version}. Make sure you have this flow defined in your project.
- >
+
)
}
diff --git a/packages/core/eventcatalog/src/components/MDX/NodeGraph/DownloadButton.tsx b/packages/core/eventcatalog/src/components/MDX/NodeGraph/DownloadButton.tsx
index c83b1580..2f6e07d6 100644
--- a/packages/core/eventcatalog/src/components/MDX/NodeGraph/DownloadButton.tsx
+++ b/packages/core/eventcatalog/src/components/MDX/NodeGraph/DownloadButton.tsx
@@ -1,4 +1,4 @@
-import { Panel, useReactFlow, getNodesBounds, getViewportForBounds } from 'reactflow';
+import { Panel, useReactFlow, getNodesBounds, getViewportForBounds } from '@xyflow/react';
import { toPng } from 'html-to-image';
import { DocumentArrowDownIcon } from '@heroicons/react/24/outline';
@@ -19,7 +19,7 @@ function DownloadButton({ filename, addPadding = true }: { filename?: string; ad
const nodesBounds = getNodesBounds(getNodes());
const width = imageWidth > nodesBounds.width ? imageWidth : nodesBounds.width;
const height = imageHeight > nodesBounds.height ? imageHeight : nodesBounds.height;
- const viewport = getViewportForBounds(nodesBounds, width, height, 0.5, 2);
+ const viewport = getViewportForBounds(nodesBounds, width, height, 0.5, 2, 0);
// Hide the button
// @ts-ignore
diff --git a/packages/core/eventcatalog/src/components/MDX/NodeGraph/Edges/AnimatedMessageEdge.tsx b/packages/core/eventcatalog/src/components/MDX/NodeGraph/Edges/AnimatedMessageEdge.tsx
index 1cafc76e..073b677a 100644
--- a/packages/core/eventcatalog/src/components/MDX/NodeGraph/Edges/AnimatedMessageEdge.tsx
+++ b/packages/core/eventcatalog/src/components/MDX/NodeGraph/Edges/AnimatedMessageEdge.tsx
@@ -1,5 +1,5 @@
import { useMemo } from 'react';
-import { BaseEdge, getBezierPath } from 'reactflow';
+import { BaseEdge, getBezierPath } from '@xyflow/react';
const AnimatedMessageEdge = ({
id,
@@ -44,6 +44,7 @@ const AnimatedMessageEdge = ({
const randomDelay = useMemo(() => Math.random() * 1, []);
return (
+ // @ts-ignore
<>
{/* Circle Icon */}
diff --git a/packages/core/eventcatalog/src/components/MDX/NodeGraph/NodeGraph.astro b/packages/core/eventcatalog/src/components/MDX/NodeGraph/NodeGraph.astro
index bdd66772..575e65b9 100644
--- a/packages/core/eventcatalog/src/components/MDX/NodeGraph/NodeGraph.astro
+++ b/packages/core/eventcatalog/src/components/MDX/NodeGraph/NodeGraph.astro
@@ -6,7 +6,10 @@ import {
getNodesAndEdgesForEvents,
getNodesAndEdgesForQueries,
} from '@utils/node-graphs/message-node-graph';
-import { getNodesAndEdges as getNodesAndEdgesForDomain } from '@utils/node-graphs/domains-node-graph';
+import {
+ getNodesAndEdges as getNodesAndEdgesForDomain,
+ getNodesAndEdgesForDomainContextMap,
+} from '@utils/node-graphs/domains-node-graph';
import { getNodesAndEdges as getNodesAndEdgesForFlows } from '@utils/node-graphs/flows-node-graph';
interface Props {
@@ -24,8 +27,10 @@ interface Props {
}
const { id, collection, title, mode = 'simple', linkTo = 'docs', version, href, linksToVisualiser } = Astro.props;
+
let nodes = [],
edges = [];
+
const getNodesAndEdgesFunctions = {
services: getNodesAndEdgesForService,
events: getNodesAndEdgesForEvents,
@@ -47,6 +52,12 @@ if (collection in getNodesAndEdgesFunctions) {
nodes = fetchedNodes;
edges = fetchedEdges;
}
+
+if (collection === 'domain-context-map') {
+ const { nodes: fetchedNodes, edges: fetchedEdges } = await getNodesAndEdgesForDomainContextMap({});
+ nodes = fetchedNodes;
+ edges = fetchedEdges;
+}
---
diff --git a/packages/core/eventcatalog/src/components/MDX/NodeGraph/NodeGraph.tsx b/packages/core/eventcatalog/src/components/MDX/NodeGraph/NodeGraph.tsx
index 4daa6b43..265901d6 100644
--- a/packages/core/eventcatalog/src/components/MDX/NodeGraph/NodeGraph.tsx
+++ b/packages/core/eventcatalog/src/components/MDX/NodeGraph/NodeGraph.tsx
@@ -1,6 +1,7 @@
import { useEffect, useMemo, useState, useCallback, useRef } from 'react';
import { createPortal } from 'react-dom';
-import ReactFlow, {
+import {
+ ReactFlow,
Background,
ConnectionLineType,
Controls,
@@ -11,8 +12,8 @@ import ReactFlow, {
type Edge,
type Node,
useReactFlow,
-} from 'reactflow';
-import 'reactflow/dist/style.css';
+} from '@xyflow/react';
+import '@xyflow/react/dist/style.css';
// Nodes and edges
import ServiceNode from './Nodes/Service';
@@ -105,10 +106,10 @@ const NodeGraphBuilder = ({
(_: any, node: Node) => {
if (linksToVisualiser) {
if (node.type === 'events' || node.type === 'commands') {
- navigate(getVisualiserUrlForCollection(node.data.message));
+ navigate(getVisualiserUrlForCollection(node.data.message as CollectionEntry
));
}
if (node.type === 'services') {
- navigate(getVisualiserUrlForCollection(node.data.service));
+ navigate(getVisualiserUrlForCollection(node.data.service as CollectionEntry<'services'>));
}
return;
}
diff --git a/packages/core/eventcatalog/src/components/MDX/NodeGraph/Nodes/Channel.tsx b/packages/core/eventcatalog/src/components/MDX/NodeGraph/Nodes/Channel.tsx
index 6f697293..bf688607 100644
--- a/packages/core/eventcatalog/src/components/MDX/NodeGraph/Nodes/Channel.tsx
+++ b/packages/core/eventcatalog/src/components/MDX/NodeGraph/Nodes/Channel.tsx
@@ -2,7 +2,7 @@ import { BoltIcon } from '@heroicons/react/16/solid';
import { ArrowsRightLeftIcon } from '@heroicons/react/20/solid';
import type { CollectionMessageTypes, CollectionTypes } from '@types';
import type { CollectionEntry } from 'astro:content';
-import { Handle } from 'reactflow';
+import { Handle } from '@xyflow/react';
interface Data {
title: string;
diff --git a/packages/core/eventcatalog/src/components/MDX/NodeGraph/Nodes/Command.tsx b/packages/core/eventcatalog/src/components/MDX/NodeGraph/Nodes/Command.tsx
index 4aeaa4ff..29e5af50 100644
--- a/packages/core/eventcatalog/src/components/MDX/NodeGraph/Nodes/Command.tsx
+++ b/packages/core/eventcatalog/src/components/MDX/NodeGraph/Nodes/Command.tsx
@@ -1,6 +1,6 @@
import { ChatBubbleLeftIcon } from '@heroicons/react/16/solid';
import type { CollectionEntry } from 'astro:content';
-import { Handle } from 'reactflow';
+import { Handle } from '@xyflow/react';
interface Data {
title: string;
diff --git a/packages/core/eventcatalog/src/components/MDX/NodeGraph/Nodes/Event.tsx b/packages/core/eventcatalog/src/components/MDX/NodeGraph/Nodes/Event.tsx
index c01197f7..2b38ed21 100644
--- a/packages/core/eventcatalog/src/components/MDX/NodeGraph/Nodes/Event.tsx
+++ b/packages/core/eventcatalog/src/components/MDX/NodeGraph/Nodes/Event.tsx
@@ -1,6 +1,6 @@
import { BoltIcon } from '@heroicons/react/16/solid';
import type { CollectionEntry } from 'astro:content';
-import { Handle } from 'reactflow';
+import { Handle } from '@xyflow/react';
interface Data {
title: string;
diff --git a/packages/core/eventcatalog/src/components/MDX/NodeGraph/Nodes/ExternalSystem.tsx b/packages/core/eventcatalog/src/components/MDX/NodeGraph/Nodes/ExternalSystem.tsx
index 0d1dcf3c..e642fd4f 100644
--- a/packages/core/eventcatalog/src/components/MDX/NodeGraph/Nodes/ExternalSystem.tsx
+++ b/packages/core/eventcatalog/src/components/MDX/NodeGraph/Nodes/ExternalSystem.tsx
@@ -1,7 +1,7 @@
import { ServerIcon } from '@heroicons/react/16/solid';
import { GlobeAmericasIcon } from '@heroicons/react/20/solid';
import type { CollectionEntry } from 'astro:content';
-import { Handle } from 'reactflow';
+import { Handle } from '@xyflow/react';
interface Data {
label: string;
diff --git a/packages/core/eventcatalog/src/components/MDX/NodeGraph/Nodes/Query.tsx b/packages/core/eventcatalog/src/components/MDX/NodeGraph/Nodes/Query.tsx
index a761d0ee..3da209a9 100644
--- a/packages/core/eventcatalog/src/components/MDX/NodeGraph/Nodes/Query.tsx
+++ b/packages/core/eventcatalog/src/components/MDX/NodeGraph/Nodes/Query.tsx
@@ -1,6 +1,6 @@
import { MagnifyingGlassIcon } from '@heroicons/react/16/solid';
import type { CollectionEntry } from 'astro:content';
-import { Handle } from 'reactflow';
+import { Handle } from '@xyflow/react';
interface Data {
title: string;
diff --git a/packages/core/eventcatalog/src/components/MDX/NodeGraph/Nodes/Service.tsx b/packages/core/eventcatalog/src/components/MDX/NodeGraph/Nodes/Service.tsx
index f8a1773e..3696132a 100644
--- a/packages/core/eventcatalog/src/components/MDX/NodeGraph/Nodes/Service.tsx
+++ b/packages/core/eventcatalog/src/components/MDX/NodeGraph/Nodes/Service.tsx
@@ -1,6 +1,6 @@
import { ServerIcon } from '@heroicons/react/16/solid';
import type { CollectionEntry } from 'astro:content';
-import { Handle } from 'reactflow';
+import { Handle } from '@xyflow/react';
interface Data {
label: string;
diff --git a/packages/core/eventcatalog/src/components/MDX/NodeGraph/Nodes/Step.tsx b/packages/core/eventcatalog/src/components/MDX/NodeGraph/Nodes/Step.tsx
index 27824b47..4243ed82 100644
--- a/packages/core/eventcatalog/src/components/MDX/NodeGraph/Nodes/Step.tsx
+++ b/packages/core/eventcatalog/src/components/MDX/NodeGraph/Nodes/Step.tsx
@@ -1,4 +1,4 @@
-import { Handle } from 'reactflow';
+import { Handle } from '@xyflow/react';
interface Data {
title: string;
@@ -45,7 +45,7 @@ export default function StepNode({ data, sourcePosition, targetPosition }: any)
)}
{summary && (
- <>
+
{title}
@@ -56,7 +56,7 @@ export default function StepNode({ data, sourcePosition, targetPosition }: any)
)}
- >
+
)}
diff --git a/packages/core/eventcatalog/src/components/MDX/NodeGraph/Nodes/User.tsx b/packages/core/eventcatalog/src/components/MDX/NodeGraph/Nodes/User.tsx
index e53f66b6..9a074a7a 100644
--- a/packages/core/eventcatalog/src/components/MDX/NodeGraph/Nodes/User.tsx
+++ b/packages/core/eventcatalog/src/components/MDX/NodeGraph/Nodes/User.tsx
@@ -1,5 +1,5 @@
import { UserIcon } from '@heroicons/react/20/solid';
-import { Handle } from 'reactflow';
+import { Handle } from '@xyflow/react';
interface Data {
title: string;
@@ -57,7 +57,7 @@ export default function UserNode({ data, sourcePosition, targetPosition }: any)
)}
{summary && mode === 'full' && (
- <>
+
{name}
@@ -68,7 +68,7 @@ export default function UserNode({ data, sourcePosition, targetPosition }: any)
)}
- >
+
)}
diff --git a/packages/core/eventcatalog/src/components/MDX/OpenAPI/OpenAPI.astro b/packages/core/eventcatalog/src/components/MDX/OpenAPI/OpenAPI.astro
index e87e8ae5..327373ca 100644
--- a/packages/core/eventcatalog/src/components/MDX/OpenAPI/OpenAPI.astro
+++ b/packages/core/eventcatalog/src/components/MDX/OpenAPI/OpenAPI.astro
@@ -4,13 +4,13 @@ import Admonition from '../Admonition';
- <>
+
{` `} component now deprecated
Use the new specifications frontmatter api. Read more here.
- >
+
diff --git a/packages/core/eventcatalog/src/components/MDX/SchemaViewer/SchemaViewer.astro b/packages/core/eventcatalog/src/components/MDX/SchemaViewer/SchemaViewer.astro
index 7d9ed61a..537a1cdf 100644
--- a/packages/core/eventcatalog/src/components/MDX/SchemaViewer/SchemaViewer.astro
+++ b/packages/core/eventcatalog/src/components/MDX/SchemaViewer/SchemaViewer.astro
@@ -82,10 +82,10 @@ try {
{/* User has tried to load the schema, but it was not found on file system */}
{!schema.exists && (
- <>
+
{` `} failed to load
Tried to load schema from {schema.schemaPath}, but no schema can be found
- >
+
)}
diff --git a/packages/core/eventcatalog/src/components/Tables/Table.tsx b/packages/core/eventcatalog/src/components/Tables/Table.tsx
index a50cb8a1..77430ef5 100644
--- a/packages/core/eventcatalog/src/components/Tables/Table.tsx
+++ b/packages/core/eventcatalog/src/components/Tables/Table.tsx
@@ -67,7 +67,7 @@ export const Table = ({
});
return (
- <>
+
{/*
{table.getPrePaginationRowModel().rows.length} results
*/}
@@ -171,7 +171,7 @@ export const Table = ({
- >
+
);
};
@@ -225,7 +225,7 @@ function Filter({ column }: { column: Column }) {
}, [column.getFacetedUniqueValues(), filterVariant]);
return (
- <>
+
{/* Autocomplete suggestions from faceted values feature */}
{sortedUniqueValues.map((value: any, index) => (
@@ -241,6 +241,6 @@ function Filter({ column }: { column: Column }) {
list={column.id + 'list'}
/>
- >
+
);
}
diff --git a/packages/core/eventcatalog/src/hooks/eventcatalog-visualizer.ts b/packages/core/eventcatalog/src/hooks/eventcatalog-visualizer.ts
index f15c36c6..2e76ecc6 100644
--- a/packages/core/eventcatalog/src/hooks/eventcatalog-visualizer.ts
+++ b/packages/core/eventcatalog/src/hooks/eventcatalog-visualizer.ts
@@ -1,5 +1,5 @@
import { useCallback, useMemo, useState, useEffect } from 'react';
-import { type Edge, type Node } from 'reactflow';
+import { type Edge, type Node } from '@xyflow/react';
import {
createEdge,
generatedIdForEdge,
@@ -8,6 +8,8 @@ import {
getEdgeLabelForServiceAsTarget,
getNodesAndEdgesFromDagre,
} from '@utils/node-graphs/utils/utils';
+import type { CollectionEntry } from 'astro:content';
+import type { CollectionMessageTypes, CollectionTypes } from '@types';
interface EventCatalogVisualizerProps {
nodes: Node[];
@@ -50,18 +52,21 @@ export const useEventCatalogVisualiser = ({ nodes, edges, setNodes, setEdges }:
return [...acc, edge];
}
+ const dataTarget = data?.target as CollectionEntry;
+ const dataSource = data?.source as CollectionEntry;
+
if (sourceIsChannel) {
const edgeLabel =
- data.target.collection === 'services'
- ? getEdgeLabelForMessageAsSource(data.source)
- : getEdgeLabelForServiceAsTarget(data.target);
+ dataTarget?.collection === 'services'
+ ? getEdgeLabelForMessageAsSource(dataSource as CollectionEntry)
+ : getEdgeLabelForServiceAsTarget(dataTarget as CollectionEntry);
return [
...acc,
createEdge({
- id: generatedIdForEdge(data.source, data.target),
- source: generateIdForNode(data.source),
- target: generateIdForNode(data.target),
+ id: generatedIdForEdge(dataSource, dataTarget),
+ source: generateIdForNode(dataSource),
+ target: generateIdForNode(dataTarget),
label: edgeLabel,
}),
];
diff --git a/packages/core/eventcatalog/src/layouts/VerticalSideBarLayout.astro b/packages/core/eventcatalog/src/layouts/VerticalSideBarLayout.astro
index f5faec3b..eecf37fb 100644
--- a/packages/core/eventcatalog/src/layouts/VerticalSideBarLayout.astro
+++ b/packages/core/eventcatalog/src/layouts/VerticalSideBarLayout.astro
@@ -95,7 +95,7 @@ const navigationItems = [
},
];
-const sideNav = allData.reduce((acc, item) => {
+const allDataAsSideNav = allData.reduce((acc, item) => {
const title = item.collection;
const group = acc[title] || [];
const currentPath = Astro.url.pathname;
@@ -129,6 +129,15 @@ const sideNav = allData.reduce((acc, item) => {
};
}, {} as any);
+const sideNav = {
+ ...(currentPath.includes('visualiser')
+ ? {
+ 'bounded context map': [{ label: 'Domain map', href: '/visualiser/context-map', collection: 'bounded-context-map' }],
+ }
+ : {}),
+ ...allDataAsSideNav,
+};
+
const currentNavigationItem = navigationItems.find((item) => item.current);
const { title, description, sidebar: showSideBarOverride } = Astro.props;
diff --git a/packages/core/eventcatalog/src/pages/docs/[type]/[id]/language.astro b/packages/core/eventcatalog/src/pages/docs/[type]/[id]/language.astro
index 6b5d3659..d1ae481a 100644
--- a/packages/core/eventcatalog/src/pages/docs/[type]/[id]/language.astro
+++ b/packages/core/eventcatalog/src/pages/docs/[type]/[id]/language.astro
@@ -81,7 +81,7 @@ const ubiquitousLanguage = ubiquitousLanguages[0];
{
ubiquitousLanguage && (
- <>
+
{term.icon && (
- <>
+
{(() => {
const Icon = LucideIcons[term.icon as keyof typeof LucideIcons];
//@ts-ignore
return Icon ? : null;
})()}
- >
+
)}
@@ -119,12 +119,12 @@ const ubiquitousLanguage = ubiquitousLanguages[0];
{term.summary}
{term.description && (
- <>
+
{term.description}
Show more
- >
+
)}
@@ -138,7 +138,7 @@ const ubiquitousLanguage = ubiquitousLanguages[0];
No matching terms
Try adjusting your search terms.
- >
+
)
}
diff --git a/packages/core/eventcatalog/src/pages/visualiser/context-map/index.astro b/packages/core/eventcatalog/src/pages/visualiser/context-map/index.astro
new file mode 100644
index 00000000..42bbfeec
--- /dev/null
+++ b/packages/core/eventcatalog/src/pages/visualiser/context-map/index.astro
@@ -0,0 +1,30 @@
+---
+import NodeGraph from '@components/MDX/NodeGraph/NodeGraph.astro';
+import { ViewTransitions } from 'astro:transitions';
+import VerticalSideBarLayout from '@layouts/VerticalSideBarLayout.astro';
+---
+
+
+
+
+
diff --git a/packages/core/eventcatalog/src/utils/__tests__/commands/node-graph.spec.ts b/packages/core/eventcatalog/src/utils/__tests__/commands/node-graph.spec.ts
index cb9e396e..5e02683c 100644
--- a/packages/core/eventcatalog/src/utils/__tests__/commands/node-graph.spec.ts
+++ b/packages/core/eventcatalog/src/utils/__tests__/commands/node-graph.spec.ts
@@ -1,4 +1,4 @@
-import { MarkerType } from 'reactflow';
+import { MarkerType } from '@xyflow/react';
import { getNodesAndEdgesForCommands as getNodesAndEdges } from '../../node-graphs/message-node-graph';
import { expect, describe, it, vi } from 'vitest';
import { mockCommands, mockServices } from './mocks';
diff --git a/packages/core/eventcatalog/src/utils/__tests__/domains/node-graph.spec.ts b/packages/core/eventcatalog/src/utils/__tests__/domains/node-graph.spec.ts
index 6de3a459..04851ec6 100644
--- a/packages/core/eventcatalog/src/utils/__tests__/domains/node-graph.spec.ts
+++ b/packages/core/eventcatalog/src/utils/__tests__/domains/node-graph.spec.ts
@@ -2,7 +2,7 @@ import type { ContentCollectionKey } from 'astro:content';
import { expect, describe, it, vi } from 'vitest';
import { mockDomains, mockServices, mockEvents, mockCommands } from './mocks';
import { getNodesAndEdges } from '@utils/node-graphs/domains-node-graph';
-import { MarkerType } from 'reactflow';
+import { MarkerType } from '@xyflow/react';
vi.mock('astro:content', async (importOriginal) => {
return {
@@ -28,6 +28,7 @@ vi.mock('astro:content', async (importOriginal) => {
describe('Domains NodeGraph', () => {
describe('getNodesAndEdges', () => {
it('returns an empty array if no domains are found', async () => {
+ // @ts-ignore
const { nodes, edges } = await getNodesAndEdges({ id: 'UnknownDomain', version: '1.0.0' });
expect(nodes).toEqual([]);
@@ -35,6 +36,7 @@ describe('Domains NodeGraph', () => {
});
it('should return nodes and edges for a given domain', async () => {
+ // @ts-ignore
const { nodes, edges } = await getNodesAndEdges({ id: 'Shipping', version: '0.0.1' });
const expectedServiceNode = {
@@ -88,6 +90,7 @@ describe('Domains NodeGraph', () => {
});
it('should return nodes and edges for a given domain with services using semver range or latest version (version undefind)', async () => {
+ // @ts-ignore
const { nodes, edges } = await getNodesAndEdges({ id: 'Checkout', version: '0.0.1' });
const expectedNodes = [
diff --git a/packages/core/eventcatalog/src/utils/__tests__/events/node-graph.spec.ts b/packages/core/eventcatalog/src/utils/__tests__/events/node-graph.spec.ts
index 3d4ec54a..4d7a7130 100644
--- a/packages/core/eventcatalog/src/utils/__tests__/events/node-graph.spec.ts
+++ b/packages/core/eventcatalog/src/utils/__tests__/events/node-graph.spec.ts
@@ -1,4 +1,4 @@
-import { MarkerType } from 'reactflow';
+import { MarkerType } from '@xyflow/react';
import { getNodesAndEdgesForEvents as getNodesAndEdges } from '../../node-graphs/message-node-graph';
import { expect, describe, it, vi, beforeEach } from 'vitest';
import { mockEvents, mockServices, mockChannels } from './mocks';
diff --git a/packages/core/eventcatalog/src/utils/__tests__/queries/node-graph.spec.ts b/packages/core/eventcatalog/src/utils/__tests__/queries/node-graph.spec.ts
index 7bd0dc57..0bb623cc 100644
--- a/packages/core/eventcatalog/src/utils/__tests__/queries/node-graph.spec.ts
+++ b/packages/core/eventcatalog/src/utils/__tests__/queries/node-graph.spec.ts
@@ -1,4 +1,4 @@
-import { MarkerType } from 'reactflow';
+import { MarkerType } from '@xyflow/react';
import { getNodesAndEdgesForQueries as getNodesAndEdges } from '../../node-graphs/message-node-graph';
import { expect, describe, it, vi, beforeEach } from 'vitest';
import { mockQueries, mockServices } from './mocks';
diff --git a/packages/core/eventcatalog/src/utils/__tests__/services/mocks.ts b/packages/core/eventcatalog/src/utils/__tests__/services/mocks.ts
index ccbdd6ff..50435eb3 100644
--- a/packages/core/eventcatalog/src/utils/__tests__/services/mocks.ts
+++ b/packages/core/eventcatalog/src/utils/__tests__/services/mocks.ts
@@ -66,6 +66,7 @@ export const mockServices = [
},
{
id: 'EmailVerified',
+ version: '1.0.0',
},
],
},
diff --git a/packages/core/eventcatalog/src/utils/__tests__/services/node-graph.spec.ts b/packages/core/eventcatalog/src/utils/__tests__/services/node-graph.spec.ts
index 45e4cb28..c45c0d25 100644
--- a/packages/core/eventcatalog/src/utils/__tests__/services/node-graph.spec.ts
+++ b/packages/core/eventcatalog/src/utils/__tests__/services/node-graph.spec.ts
@@ -1,4 +1,4 @@
-import { MarkerType } from 'reactflow';
+import { MarkerType } from '@xyflow/react';
import { getNodesAndEdges } from '../../node-graphs/services-node-graph';
import { expect, describe, it, vi, beforeEach } from 'vitest';
import { mockCommands, mockEvents, mockQueries, mockServices, mockChannels } from './mocks';
diff --git a/packages/core/eventcatalog/src/utils/__tests__/services/services.spec.ts b/packages/core/eventcatalog/src/utils/__tests__/services/services.spec.ts
index 1bc497e8..240fb71f 100644
--- a/packages/core/eventcatalog/src/utils/__tests__/services/services.spec.ts
+++ b/packages/core/eventcatalog/src/utils/__tests__/services/services.spec.ts
@@ -1,7 +1,7 @@
import type { ContentCollectionKey } from 'astro:content';
import { expect, describe, it, vi } from 'vitest';
import { mockCommands, mockEvents, mockQueries, mockServices } from './mocks';
-import { getServices } from '@utils/collections/services';
+import { getProducersOfMessage, getServices, getConsumersOfMessage } from '@utils/collections/services';
vi.mock('astro:content', async (importOriginal) => {
return {
@@ -112,4 +112,271 @@ describe('Services', () => {
);
});
});
+
+ describe('getProducersOfMessage', () => {
+ it('should return an array of services that publish a message', async () => {
+ const services = await getServices();
+ const message = mockEvents[12];
+
+ // @ts-ignore
+ const servicesThatPublishMessage = getProducersOfMessage(services, message);
+
+ expect(servicesThatPublishMessage).toHaveLength(1);
+ expect(servicesThatPublishMessage[0].data.id).toEqual('PaymentService');
+ });
+
+ it('should return an array of services that publish a message with a specific version', async () => {
+ const message = {
+ slug: 'SomeTestEvent',
+ collection: 'events',
+ data: {
+ id: 'SomeTestEvent',
+ version: '0.0.1',
+ },
+ };
+
+ const service = {
+ ...mockServices[0],
+ data: {
+ ...mockServices[0].data,
+ id: 'SomeTestService',
+ sends: [
+ {
+ id: 'SomeTestEvent',
+ version: '0.0.1',
+ },
+ ],
+ receives: [],
+ },
+ };
+
+ // @ts-ignore
+ const servicesThatPublishMessage = getProducersOfMessage([service], message);
+
+ expect(servicesThatPublishMessage).toHaveLength(1);
+ expect(servicesThatPublishMessage[0].data.id).toEqual('SomeTestService');
+ });
+
+ it('if the service uses latest, it should return all services that publish the message', async () => {
+ const message = {
+ slug: 'SomeTestEvent',
+ collection: 'events',
+ data: {
+ id: 'SomeTestEvent',
+ version: '0.0.1',
+ },
+ };
+
+ const service = {
+ ...mockServices[0],
+ data: {
+ ...mockServices[0].data,
+ id: 'SomeTestService',
+ sends: [
+ {
+ id: 'SomeTestEvent',
+ version: 'latest',
+ },
+ ],
+ receives: [],
+ },
+ };
+
+ // @ts-ignore
+ const servicesThatPublishMessage = getProducersOfMessage([service], message);
+
+ expect(servicesThatPublishMessage).toHaveLength(1);
+ expect(servicesThatPublishMessage[0].data.id).toEqual('SomeTestService');
+ });
+
+ it('if the service does not have a version, it should return all services that publish the message', async () => {
+ const message = {
+ slug: 'SomeTestEvent',
+ collection: 'events',
+ data: {
+ id: 'SomeTestEvent',
+ version: '0.0.1',
+ },
+ };
+
+ const service = {
+ ...mockServices[0],
+ data: {
+ ...mockServices[0].data,
+ id: 'SomeTestService',
+ sends: [
+ {
+ id: 'SomeTestEvent',
+ },
+ ],
+ receives: [],
+ },
+ };
+
+ // @ts-ignore
+ const servicesThatPublishMessage = getProducersOfMessage([service], message);
+
+ expect(servicesThatPublishMessage).toHaveLength(1);
+ expect(servicesThatPublishMessage[0].data.id).toEqual('SomeTestService');
+ });
+
+ it('if the service has a version for the message, but they do not match, it should not return any services', async () => {
+ const message = {
+ slug: 'SomeTestEvent',
+ collection: 'events',
+ data: {
+ id: 'SomeTestEvent',
+ version: '0.0.1',
+ },
+ };
+
+ const service = {
+ ...mockServices[0],
+ data: {
+ ...mockServices[0].data,
+ id: 'SomeTestService',
+ sends: [
+ {
+ id: 'SomeTestEvent',
+ version: '1.0.0',
+ },
+ ],
+ receives: [],
+ },
+ };
+
+ // @ts-ignore
+ const servicesThatPublishMessage = getProducersOfMessage([service], message);
+
+ expect(servicesThatPublishMessage).toHaveLength(0);
+ });
+ });
+
+ describe('getConsumersOfMessage', () => {
+ it('should return an array of services that consume a message with a specific version', async () => {
+ const message = {
+ slug: 'SomeTestEvent',
+ collection: 'events',
+ data: {
+ id: 'SomeTestEvent',
+ version: '0.0.1',
+ },
+ };
+
+ const service = {
+ ...mockServices[0],
+ data: {
+ ...mockServices[0].data,
+ id: 'SomeTestService',
+ receives: [
+ {
+ id: 'SomeTestEvent',
+ version: '0.0.1',
+ },
+ ],
+ sends: [],
+ },
+ };
+
+ // @ts-ignore
+ const servicesThatConsumeMessage = getConsumersOfMessage([service], message);
+
+ expect(servicesThatConsumeMessage).toHaveLength(1);
+ expect(servicesThatConsumeMessage[0].data.id).toEqual('SomeTestService');
+ });
+
+ it('if the service uses latest, it should return all services that consume the message', async () => {
+ const message = {
+ slug: 'SomeTestEvent',
+ collection: 'events',
+ data: {
+ id: 'SomeTestEvent',
+ version: '0.0.1',
+ },
+ };
+
+ const service = {
+ ...mockServices[0],
+ data: {
+ ...mockServices[0].data,
+ id: 'SomeTestService',
+ receives: [
+ {
+ id: 'SomeTestEvent',
+ version: 'latest',
+ },
+ ],
+ sends: [],
+ },
+ };
+
+ // @ts-ignore
+ const servicesThatConsumeMessage = getConsumersOfMessage([service], message);
+
+ expect(servicesThatConsumeMessage).toHaveLength(1);
+ expect(servicesThatConsumeMessage[0].data.id).toEqual('SomeTestService');
+ });
+
+ it('if the service does not have a version, it should return all services that consume the message', async () => {
+ const message = {
+ slug: 'SomeTestEvent',
+ collection: 'events',
+ data: {
+ id: 'SomeTestEvent',
+ version: '0.0.1',
+ },
+ };
+
+ const service = {
+ ...mockServices[0],
+ data: {
+ ...mockServices[0].data,
+ id: 'SomeTestService',
+ receives: [
+ {
+ id: 'SomeTestEvent',
+ },
+ ],
+ sends: [],
+ },
+ };
+
+ // @ts-ignore
+ const servicesThatConsumeMessage = getConsumersOfMessage([service], message);
+
+ expect(servicesThatConsumeMessage).toHaveLength(1);
+ expect(servicesThatConsumeMessage[0].data.id).toEqual('SomeTestService');
+ });
+
+ it('if the service has a version for the message, but they do not match, it should not return any services', async () => {
+ const message = {
+ slug: 'SomeTestEvent',
+ collection: 'events',
+ data: {
+ id: 'SomeTestEvent',
+ version: '0.0.1',
+ },
+ };
+
+ const service = {
+ ...mockServices[0],
+ data: {
+ ...mockServices[0].data,
+ id: 'SomeTestService',
+ receives: [
+ {
+ id: 'SomeTestEvent',
+ version: '1.0.0',
+ },
+ ],
+ sends: [],
+ },
+ };
+
+ // @ts-ignore
+ const servicesThatConsumeMessage = getConsumersOfMessage([service], message);
+
+ expect(servicesThatConsumeMessage).toHaveLength(0);
+ });
+ });
});
diff --git a/packages/core/eventcatalog/src/utils/collections/icons.ts b/packages/core/eventcatalog/src/utils/collections/icons.ts
index f34ef51b..102518b0 100644
--- a/packages/core/eventcatalog/src/utils/collections/icons.ts
+++ b/packages/core/eventcatalog/src/utils/collections/icons.ts
@@ -9,6 +9,7 @@ import {
UserIcon,
ArrowsRightLeftIcon,
VariableIcon,
+ MapIcon,
} from '@heroicons/react/24/outline';
import { BookText } from 'lucide-react';
@@ -36,6 +37,8 @@ export const getIconForCollection = (collection: string) => {
return VariableIcon;
case 'ubiquitousLanguages':
return BookText;
+ case 'bounded-context-map':
+ return MapIcon;
default:
return ServerIcon;
}
diff --git a/packages/core/eventcatalog/src/utils/collections/services.ts b/packages/core/eventcatalog/src/utils/collections/services.ts
index 28a4f880..44e9378e 100644
--- a/packages/core/eventcatalog/src/utils/collections/services.ts
+++ b/packages/core/eventcatalog/src/utils/collections/services.ts
@@ -2,6 +2,7 @@ import { getItemsFromCollectionByIdAndSemverOrLatest, getVersionForCollectionIte
import { getCollection } from 'astro:content';
import type { CollectionEntry } from 'astro:content';
import path from 'path';
+import semver from 'semver';
const PROJECT_DIR = process.env.PROJECT_DIR || process.cwd();
@@ -65,3 +66,37 @@ export const getServices = async ({ getAllVersions = true }: Props = {}): Promis
};
});
};
+
+export const getProducersOfMessage = (services: Service[], message: CollectionEntry<'events' | 'commands' | 'queries'>) => {
+ return services.filter((service) => {
+ return service.data.sends?.some((send) => {
+ const idMatch = send.id === message.data.id;
+
+ // If no version specified in send, treat as 'latest'
+ if (!send.version) return idMatch;
+
+ // If version is 'latest', match any version
+ if (send.version === 'latest') return idMatch;
+
+ // Use semver to compare versions
+ return idMatch && semver.satisfies(message.data.version, send.version);
+ });
+ });
+};
+
+export const getConsumersOfMessage = (services: Service[], message: CollectionEntry<'events' | 'commands' | 'queries'>) => {
+ return services.filter((service) => {
+ return service.data.receives?.some((receive) => {
+ const idMatch = receive.id === message.data.id;
+
+ // If no version specified in send, treat as 'latest'
+ if (!receive.version) return idMatch;
+
+ // If version is 'latest', match any version
+ if (receive.version === 'latest') return idMatch;
+
+ // Use semver to compare versions
+ return idMatch && semver.satisfies(message.data.version, receive.version);
+ });
+ });
+};
diff --git a/packages/core/eventcatalog/src/utils/node-graphs/domains-node-graph.ts b/packages/core/eventcatalog/src/utils/node-graphs/domains-node-graph.ts
index 1b125f99..21315b03 100644
--- a/packages/core/eventcatalog/src/utils/node-graphs/domains-node-graph.ts
+++ b/packages/core/eventcatalog/src/utils/node-graphs/domains-node-graph.ts
@@ -1,19 +1,222 @@
import { getCollection } from 'astro:content';
-import { createDagreGraph, calculatedNodes } from '@utils/node-graphs/utils/utils';
+import {
+ createDagreGraph,
+ calculatedNodes,
+ generateIdForNode,
+ createNode,
+ getEdgeLabelForServiceAsTarget,
+ generatedIdForEdge,
+ createEdge,
+} from '@utils/node-graphs/utils/utils';
import { getNodesAndEdges as getServicesNodeAndEdges } from './services-node-graph';
import merge from 'lodash.merge';
import { getItemsFromCollectionByIdAndSemverOrLatest } from '@utils/collections/util';
+import type { Node } from '@xyflow/react';
+import { getProducersOfMessage } from '@utils/collections/services';
type DagreGraph = any;
interface Props {
+ defaultFlow?: DagreGraph;
+}
+
+export const getNodesAndEdgesForDomainContextMap = async ({ defaultFlow = null }: Props) => {
+ const flow = defaultFlow ?? createDagreGraph({ ranksep: 360, nodesep: 50, edgesep: 50 });
+ let nodes = [] as any,
+ edges = [] as any;
+
+ const allDomains = await getCollection('domains');
+ const domains = allDomains.filter((domain) => !domain.id.includes('/versioned'));
+ const services = await getCollection('services');
+
+ const events = await getCollection('events');
+ const commands = await getCollection('commands');
+ const queries = await getCollection('queries');
+
+ const messages = [...events, ...commands, ...queries];
+
+ domains.forEach((domain, index) => {
+ const nodeId = generateIdForNode(domain);
+ const rawServices = domain.data.services ?? [];
+ const domainServices = rawServices
+ .map((service) => getItemsFromCollectionByIdAndSemverOrLatest(services, service.id, service.version))
+ .flat()
+ .filter((e) => e !== undefined);
+
+ // Calculate domain node size based on services
+ const servicesCount = domainServices.length;
+ const SERVICES_PER_ROW = 1;
+ const SERVICE_WIDTH = 330;
+ const SERVICE_HEIGHT = 100;
+ const PADDING = 40;
+ const TITLE_HEIGHT = 20;
+
+ const rows = Math.ceil(servicesCount / SERVICES_PER_ROW);
+ const domainWidth = SERVICE_WIDTH * SERVICES_PER_ROW;
+ const domainHeight = SERVICE_HEIGHT * rows + PADDING * 4;
+
+ // Position domains in a grid layout
+ const DOMAINS_PER_ROW = 2;
+ const rowIndex = Math.floor(index / DOMAINS_PER_ROW);
+ const colIndex = index % DOMAINS_PER_ROW;
+
+ const test = servicesCount * SERVICE_HEIGHT + PADDING * 2;
+
+ nodes.push({
+ id: nodeId,
+ type: 'group',
+ position: {
+ x: colIndex * (domainWidth + 400), // Increased from 100 to 400px gap between domains
+ y: rowIndex * (domainHeight + 300), // Increased from 100 to 300px gap between rows
+ },
+ style: {
+ width: domainWidth,
+ height: domainHeight,
+ backgroundColor: 'transparent',
+ borderRadius: '8px',
+ border: '1px solid #ddd',
+ 'box-shadow': '0 0 10px 0 rgba(0, 0, 0, 0.1)',
+ },
+ data: {
+ label: domain.data.name,
+ domain,
+ },
+ });
+
+ nodes.push({
+ id: `domain-context-map-title-${domain.data.name}`,
+ data: { label: `Bounded Context: ${domain.data.name}` },
+ position: { x: 0, y: 0 },
+ style: {
+ height: 40,
+ backgroundColor: 'transparent',
+ border: 'none',
+ color: 'black',
+ width: domainWidth,
+ },
+ extent: 'parent',
+ parentId: nodeId,
+ connectable: false,
+ sourcePosition: 'left',
+ targetPosition: 'right',
+ draggable: false,
+ } as Node);
+
+ // Position services in a grid within the domain
+ if (domainServices) {
+ domainServices.forEach((service, serviceIndex) => {
+ const row = Math.floor(serviceIndex / SERVICES_PER_ROW);
+ const col = serviceIndex % SERVICES_PER_ROW;
+ const serviceNodeId = `service-${domain.id}-${service.id}`;
+
+ // Add spacing between services
+ const SERVICE_MARGIN = 25;
+ const xPosition = PADDING + col * (SERVICE_WIDTH + SERVICE_MARGIN) + 20;
+ const yPosition = PADDING + row * (SERVICE_HEIGHT + SERVICE_MARGIN) + TITLE_HEIGHT;
+
+ nodes.push({
+ id: generateIdForNode(service),
+ sourcePosition: 'right',
+ targetPosition: 'left',
+ type: 'services',
+ position: {
+ x: xPosition,
+ y: yPosition,
+ },
+ parentId: nodeId,
+ extent: 'parent',
+ draggable: false,
+ data: {
+ mode: 'full',
+ service,
+ },
+ });
+
+ // Edges
+ const rawReceives = service.data.receives ?? [];
+ const rawSends = service.data.sends ?? [];
+
+ const receives = rawReceives
+ .map((receive) => getItemsFromCollectionByIdAndSemverOrLatest(messages, receive.id, receive.version))
+ .flat();
+ const sends = rawSends.map((send) => getItemsFromCollectionByIdAndSemverOrLatest(messages, send.id, send.version)).flat();
+
+ for (const receive of receives) {
+ const producers = getProducersOfMessage(services, receive);
+
+ for (const producer of producers) {
+ const isSameDomain = domainServices.some((domainService) => domainService.data.id === producer.data.id);
+
+ if (!isSameDomain) {
+ // WIP... adding messages?
+ // edges.push(createEdge({
+ // id: generatedIdForEdge(receive, service),
+ // source: generateIdForNode(receive),
+ // target: generateIdForNode(service),
+ // label: getEdgeLabelForServiceAsTarget(receive),
+ // zIndex: 1000,
+ // }));
+
+ // Find the producer and consumer nodes to get their positions
+ // const producerNode = nodes.find(n => n.id === generateIdForNode(producer));
+ // const consumerNode = nodes.find(n => n.id === generateIdForNode(service));
+
+ edges.push(
+ createEdge({
+ id: generatedIdForEdge(producer, service),
+ source: generateIdForNode(producer),
+ target: generateIdForNode(service),
+ label: getEdgeLabelForServiceAsTarget(receive),
+ zIndex: 1000,
+ })
+ );
+
+ // // Calculate middle position between producer and consumer
+ // const messageX = (producerNode?.position?.x ?? 0) +
+ // ((consumerNode?.position?.x ?? 0) - (producerNode?.position?.x ?? 0)) / 2;
+ // const messageY = (producerNode?.position?.y ?? 0) +
+ // ((consumerNode?.position?.y ?? 0) - (producerNode?.position?.y ?? 0)) / 2;
+
+ // nodes.push({
+ // id: generateIdForNode(receive),
+ // type: receive.collection,
+ // sourcePosition: 'right',
+ // targetPosition: 'left',
+ // data: {
+ // message: receive,
+ // mode: 'full',
+ // },
+ // position: { x: messageX, y: messageY },
+ // });
+
+ // edges.push(createEdge({
+ // id: generatedIdForEdge(producer, receive),
+ // source: generateIdForNode(producer),
+ // target: generateIdForNode(receive),
+ // label: getEdgeLabelForServiceAsTarget(receive),
+ // zIndex: 1000,
+ // }));
+ }
+ }
+ }
+ });
+ }
+ });
+
+ return {
+ nodes,
+ edges,
+ };
+};
+
+interface NodesAndEdgesProps {
id: string;
version: string;
defaultFlow?: DagreGraph;
- mode?: 'simple' | 'full';
+ mode: 'simple' | 'full';
}
-export const getNodesAndEdges = async ({ id, version, defaultFlow, mode = 'simple' }: Props) => {
+export const getNodesAndEdges = async ({ id, version, defaultFlow, mode = 'simple' }: NodesAndEdgesProps) => {
const flow = defaultFlow || createDagreGraph({ ranksep: 360, nodesep: 50, edgesep: 50 });
let nodes = new Map(),
edges = new Map();
diff --git a/packages/core/eventcatalog/src/utils/node-graphs/flows-node-graph.ts b/packages/core/eventcatalog/src/utils/node-graphs/flows-node-graph.ts
index ae170726..a3d78ff4 100644
--- a/packages/core/eventcatalog/src/utils/node-graphs/flows-node-graph.ts
+++ b/packages/core/eventcatalog/src/utils/node-graphs/flows-node-graph.ts
@@ -1,8 +1,8 @@
import { getCollection, type CollectionEntry } from 'astro:content';
import dagre from 'dagre';
import { createDagreGraph, calculatedNodes } from '@utils/node-graphs/utils/utils';
-import { MarkerType } from 'reactflow';
-import type { Node as NodeType } from 'reactflow';
+import { MarkerType } from '@xyflow/react';
+import type { Node as NodeType } from '@xyflow/react';
import { getItemsFromCollectionByIdAndSemverOrLatest } from '@utils/collections/util';
type DagreGraph = any;
diff --git a/packages/core/eventcatalog/src/utils/node-graphs/message-node-graph.ts b/packages/core/eventcatalog/src/utils/node-graphs/message-node-graph.ts
index d7c2be9c..0572c59e 100644
--- a/packages/core/eventcatalog/src/utils/node-graphs/message-node-graph.ts
+++ b/packages/core/eventcatalog/src/utils/node-graphs/message-node-graph.ts
@@ -12,7 +12,7 @@ import {
getEdgeLabelForMessageAsSource,
getEdgeLabelForServiceAsTarget,
} from './utils/utils';
-import { MarkerType } from 'reactflow';
+import { MarkerType } from '@xyflow/react';
import { findMatchingNodes } from '@utils/collections/util';
import type { CollectionMessageTypes } from '@types';
import { getCommands } from '@utils/commands';
diff --git a/packages/core/eventcatalog/src/utils/node-graphs/services-node-graph.ts b/packages/core/eventcatalog/src/utils/node-graphs/services-node-graph.ts
index bb9c1a30..8f479e62 100644
--- a/packages/core/eventcatalog/src/utils/node-graphs/services-node-graph.ts
+++ b/packages/core/eventcatalog/src/utils/node-graphs/services-node-graph.ts
@@ -9,7 +9,7 @@ import {
getChannelNodesAndEdges,
} from '@utils/node-graphs/utils/utils';
import { findMatchingNodes, getItemsFromCollectionByIdAndSemverOrLatest } from '@utils/collections/util';
-import { MarkerType } from 'reactflow';
+import { MarkerType } from '@xyflow/react';
import type { CollectionMessageTypes } from '@types';
type DagreGraph = any;
diff --git a/packages/core/eventcatalog/src/utils/node-graphs/utils/utils.ts b/packages/core/eventcatalog/src/utils/node-graphs/utils/utils.ts
index ce94814c..486e9d59 100644
--- a/packages/core/eventcatalog/src/utils/node-graphs/utils/utils.ts
+++ b/packages/core/eventcatalog/src/utils/node-graphs/utils/utils.ts
@@ -1,5 +1,5 @@
import { getCollection, type CollectionEntry } from 'astro:content';
-import { MarkerType, Position, type Edge, type Node } from 'reactflow';
+import { MarkerType, Position, type Edge, type Node } from '@xyflow/react';
import dagre from 'dagre';
import { getItemsFromCollectionByIdAndSemverOrLatest } from '@utils/collections/util';
import type { CollectionMessageTypes, CollectionTypes } from '@types';
diff --git a/packages/core/package.json b/packages/core/package.json
index 55a4254b..6bd69844 100644
--- a/packages/core/package.json
+++ b/packages/core/package.json
@@ -7,7 +7,7 @@
"directory": "packages/core/"
},
"type": "module",
- "version": "2.16.2",
+ "version": "2.16.3",
"license": "MIT",
"publishConfig": {
"access": "public"