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 && ( - <> +
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"