@eventcatalog/core 0.1.19 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (356) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +126 -43
  3. package/.next/cache/.tsbuildinfo +1 -1
  4. package/.next/cache/config.json +3 -3
  5. package/.next/cache/eslint/.cache_1bay4w0 +1 -1
  6. package/.next/cache/next-server.js.nft.json +1 -1
  7. package/.next/cache/webpack/client-production/0.pack +0 -0
  8. package/.next/cache/webpack/client-production/index.pack +0 -0
  9. package/.next/cache/webpack/server-production/0.pack +0 -0
  10. package/.next/cache/webpack/server-production/index.pack +0 -0
  11. package/.next/next-server.js.nft.json +1 -1
  12. package/.next/prerender-manifest.json +1 -1
  13. package/.next/routes-manifest.json +1 -1
  14. package/.next/server/chunks/{730.js → 189.js} +184 -2
  15. package/.next/server/chunks/267.js +255 -0
  16. package/.next/server/chunks/{681.js → 29.js} +275 -40
  17. package/.next/server/chunks/484.js +12 -3
  18. package/.next/server/chunks/50.js +392 -0
  19. package/.next/server/chunks/526.js +15 -4
  20. package/.next/server/chunks/565.js +3 -3
  21. package/.next/server/chunks/778.js +76 -0
  22. package/.next/server/chunks/797.js +92 -0
  23. package/.next/server/chunks/854.js +103 -0
  24. package/.next/server/chunks/938.js +3 -2
  25. package/.next/server/chunks/944.js +102 -153
  26. package/.next/server/pages/404.html +1 -1
  27. package/.next/server/pages/500.html +1 -1
  28. package/.next/server/pages/_app.js +5 -1
  29. package/.next/server/pages/domains/Shopping/events/AddedItemToCart/logs.html +1 -0
  30. package/.next/server/pages/{events → domains/Shopping/events}/AddedItemToCart/logs.json +0 -0
  31. package/.next/server/pages/domains/Shopping/events/AddedItemToCart/v/0.0.1.html +58 -0
  32. package/.next/server/pages/domains/Shopping/events/AddedItemToCart/v/0.0.1.json +1 -0
  33. package/.next/server/pages/domains/Shopping/events/AddedItemToCart/v/0.0.2.html +65 -0
  34. package/.next/server/pages/domains/Shopping/events/AddedItemToCart/v/0.0.2.json +1 -0
  35. package/.next/server/pages/domains/Shopping/events/AddedItemToCart.html +65 -0
  36. package/.next/server/pages/domains/Shopping/events/AddedItemToCart.json +1 -0
  37. package/.next/server/pages/domains/Shopping/services/Basket Service.html +2 -0
  38. package/.next/server/pages/domains/Shopping/services/Basket Service.json +1 -0
  39. package/.next/server/pages/domains/Shopping/services/Data Lake.html +2 -0
  40. package/.next/server/pages/domains/Shopping/services/Data Lake.json +1 -0
  41. package/.next/server/pages/domains/Shopping.html +2 -0
  42. package/.next/server/pages/domains/Shopping.json +1 -0
  43. package/.next/server/pages/domains/[domain]/events/[name]/logs.js +243 -0
  44. package/.next/server/pages/domains/[domain]/events/[name]/logs.js.nft.json +1 -0
  45. package/.next/server/pages/domains/[domain]/events/[name]/v/[version].js +352 -0
  46. package/.next/server/pages/domains/[domain]/events/[name]/v/[version].js.nft.json +1 -0
  47. package/.next/server/pages/domains/[domain]/events/[name].js +270 -0
  48. package/.next/server/pages/domains/[domain]/events/[name].js.nft.json +1 -0
  49. package/.next/server/pages/domains/[domain]/services/[name].js +318 -0
  50. package/.next/server/pages/domains/[domain]/services/[name].js.nft.json +1 -0
  51. package/.next/server/pages/domains/[domain].js +504 -0
  52. package/.next/server/pages/domains/[domain].js.nft.json +1 -0
  53. package/.next/server/pages/domains.html +2 -0
  54. package/.next/server/pages/domains.js +318 -0
  55. package/.next/server/pages/domains.js.nft.json +1 -0
  56. package/.next/server/pages/domains.json +1 -0
  57. package/.next/server/pages/events/OrderComplete/logs.html +1 -1
  58. package/.next/server/pages/events/OrderComplete.html +2 -2
  59. package/.next/server/pages/events/OrderComplete.json +1 -1
  60. package/.next/server/pages/events/OrderConfirmed/logs.html +1 -1
  61. package/.next/server/pages/events/OrderConfirmed.html +2 -2
  62. package/.next/server/pages/events/OrderConfirmed.json +1 -1
  63. package/.next/server/pages/events/OrderRequested/logs.html +1 -1
  64. package/.next/server/pages/events/OrderRequested.html +2 -2
  65. package/.next/server/pages/events/OrderRequested.json +1 -1
  66. package/.next/server/pages/events/PaymentProcessed/logs.html +1 -1
  67. package/.next/server/pages/events/PaymentProcessed.html +2 -2
  68. package/.next/server/pages/events/PaymentProcessed.json +1 -1
  69. package/.next/server/pages/events/RemovedItemFromCart/logs.html +1 -1
  70. package/.next/server/pages/events/RemovedItemFromCart.html +2 -2
  71. package/.next/server/pages/events/RemovedItemFromCart.json +1 -1
  72. package/.next/server/pages/events/ShipmentDelivered/logs.html +1 -1
  73. package/.next/server/pages/events/ShipmentDelivered.html +2 -2
  74. package/.next/server/pages/events/ShipmentDelivered.json +1 -1
  75. package/.next/server/pages/events/ShipmentDispatched/logs.html +1 -1
  76. package/.next/server/pages/events/ShipmentDispatched.html +2 -2
  77. package/.next/server/pages/events/ShipmentDispatched.json +1 -1
  78. package/.next/server/pages/events/ShipmentPrepared/logs.html +1 -1
  79. package/.next/server/pages/events/ShipmentPrepared.html +2 -2
  80. package/.next/server/pages/events/ShipmentPrepared.json +1 -1
  81. package/.next/server/pages/events/[name]/logs.js +1 -243
  82. package/.next/server/pages/events/[name]/logs.js.nft.json +1 -1
  83. package/.next/server/pages/events/[name]/v/[version].js +10 -5
  84. package/.next/server/pages/events/[name]/v/[version].js.nft.json +1 -1
  85. package/.next/server/pages/events/[name].js +2 -2
  86. package/.next/server/pages/events/[name].js.nft.json +1 -1
  87. package/.next/server/pages/events.html +3 -3
  88. package/.next/server/pages/events.js +39 -14
  89. package/.next/server/pages/events.js.nft.json +1 -1
  90. package/.next/server/pages/events.json +1 -1
  91. package/.next/server/pages/index.html +1 -1
  92. package/.next/server/pages/overview.html +1 -1
  93. package/.next/server/pages/overview.js +4 -4
  94. package/.next/server/pages/overview.js.nft.json +1 -1
  95. package/.next/server/pages/overview.json +1 -1
  96. package/.next/server/pages/services/Basket Service.html +1 -2
  97. package/.next/server/pages/services/Basket Service.json +1 -1
  98. package/.next/server/pages/services/Data Lake.html +1 -2
  99. package/.next/server/pages/services/Data Lake.json +1 -1
  100. package/.next/server/pages/services/Payment Service.html +2 -2
  101. package/.next/server/pages/services/Payment Service.json +1 -1
  102. package/.next/server/pages/services/Shipping Service.html +2 -2
  103. package/.next/server/pages/services/Shipping Service.json +1 -1
  104. package/.next/server/pages/services/[name].js +1 -505
  105. package/.next/server/pages/services/[name].js.nft.json +1 -1
  106. package/.next/server/pages/services.html +3 -3
  107. package/.next/server/pages/services.js +1 -1
  108. package/.next/server/pages/services.js.nft.json +1 -1
  109. package/.next/server/pages/services.json +1 -1
  110. package/.next/server/pages/users/[id].js +35 -13
  111. package/.next/server/pages/users/[id].js.nft.json +1 -1
  112. package/.next/server/pages/users/dboyne.html +6 -5
  113. package/.next/server/pages/users/dboyne.json +1 -1
  114. package/.next/server/pages/users/mSmith.html +3 -3
  115. package/.next/server/pages/users/mSmith.json +1 -1
  116. package/.next/server/pages/visualiser.html +4 -3
  117. package/.next/server/pages/visualiser.js +149 -149
  118. package/.next/server/pages/visualiser.js.nft.json +1 -1
  119. package/.next/server/pages/visualiser.json +1 -1
  120. package/.next/server/pages-manifest.json +6 -0
  121. package/.next/static/chunks/109-716dea1303010b4f.js +1 -0
  122. package/.next/static/chunks/169-b33dfdaf2847d062.js +1 -0
  123. package/.next/static/chunks/178-e9a666e11fb7c88d.js +1 -0
  124. package/.next/static/chunks/585-aa9262ea1bcf9d5b.js +1 -0
  125. package/.next/static/chunks/650-555944cc1eb7714e.js +1 -0
  126. package/.next/static/chunks/962-17a425b16c23bd0f.js +1 -0
  127. package/.next/static/chunks/pages/_app-d88c877888678e85.js +1 -0
  128. package/.next/static/chunks/pages/domains/[domain]/events/[name]/logs-7317f2121b8f0d8c.js +1 -0
  129. package/.next/static/chunks/pages/domains/[domain]/events/[name]/v/[version]-a7fa6002267ccd3b.js +1 -0
  130. package/.next/static/chunks/pages/domains/[domain]/events/[name]-a5fb5b26471e703b.js +1 -0
  131. package/.next/static/chunks/pages/domains/[domain]/services/[name]-80d6d803e5466b81.js +1 -0
  132. package/.next/static/chunks/pages/domains/[domain]-e39d527b56fd45c8.js +1 -0
  133. package/.next/static/chunks/pages/domains-6ab78cb1bc2f4200.js +1 -0
  134. package/.next/static/chunks/pages/events/[name]/v/[version]-93d978734b0dc0a3.js +1 -0
  135. package/.next/static/chunks/pages/events/{[name]-813780e7042af288.js → [name]-d3d2a03948b8dfeb.js} +1 -1
  136. package/.next/static/chunks/pages/events-5a41c37b360b2fce.js +1 -0
  137. package/.next/static/chunks/pages/{overview-2f0bfad06c84e437.js → overview-dc5e91549c7e3d52.js} +1 -1
  138. package/.next/static/chunks/pages/services/[name]-148079bb388f8c53.js +1 -0
  139. package/.next/static/chunks/pages/services-7fe5a823f1b25f18.js +1 -0
  140. package/.next/static/chunks/pages/users/[id]-b255611073ef76e0.js +1 -0
  141. package/.next/static/chunks/pages/visualiser-2fc8224670ac5dff.js +1 -0
  142. package/.next/static/chunks/webpack-b17b8ef11b94ba66.js +1 -0
  143. package/{out/_next/static/css/4a01a08d48b115f7.css → .next/static/css/70ede87da43120f8.css} +1 -1
  144. package/.next/static/sTHntsHUajnk_njFTxiB5/_buildManifest.js +1 -0
  145. package/.next/static/{jznFKGTbxJsAeYNZE4XtO → sTHntsHUajnk_njFTxiB5}/_middlewareManifest.js +0 -0
  146. package/.next/static/sTHntsHUajnk_njFTxiB5/_ssgManifest.js +1 -0
  147. package/.next/trace +57 -56
  148. package/CHANGELOG.md +6 -0
  149. package/components/Grids/DomainGrid.tsx +53 -0
  150. package/components/Grids/EventGrid.tsx +12 -5
  151. package/components/Grids/ServiceGrid.tsx +3 -3
  152. package/components/Header.tsx +2 -1
  153. package/components/Mdx/NodeGraph/GraphElements.tsx +1 -1
  154. package/components/Mdx/NodeGraph/GraphLayout.ts +6 -2
  155. package/components/Mdx/NodeGraph/NodeGraph.tsx +13 -3
  156. package/components/Mdx/NodeGraph/__tests__/GraphElements.spec.ts +8 -4
  157. package/components/Mdx/NodeGraph/__tests__/GraphLayout.spec.ts +2 -2
  158. package/components/Sidebars/DomainSidebar.tsx +55 -0
  159. package/components/Sidebars/EventSidebar.tsx +61 -111
  160. package/components/Sidebars/ServiceSidebar.tsx +47 -125
  161. package/components/Sidebars/components/ExternalLinks.tsx +28 -0
  162. package/components/Sidebars/components/ItemList.tsx +32 -0
  163. package/components/Sidebars/components/Owners.tsx +38 -0
  164. package/components/Sidebars/components/Tags.tsx +45 -0
  165. package/lib/__tests__/assets/domains/User/events/UserCreated/index.md +16 -0
  166. package/lib/__tests__/assets/domains/User/events/UserRemoved/examples/Basic.cs +31 -0
  167. package/lib/__tests__/assets/domains/User/events/UserRemoved/examples/Basic.js +1 -0
  168. package/lib/__tests__/assets/domains/User/events/UserRemoved/index.md +16 -0
  169. package/lib/__tests__/assets/domains/User/events/UserRemoved/schema.json +4 -0
  170. package/lib/__tests__/assets/domains/User/index.md +12 -0
  171. package/lib/__tests__/assets/domains/User/services/User Service/index.md +15 -0
  172. package/lib/__tests__/assets/events/AddedItemToCart/index.md +0 -2
  173. package/lib/__tests__/assets/services/Basket Service/index.md +1 -1
  174. package/lib/__tests__/domains.spec.ts +267 -0
  175. package/lib/__tests__/events.spec.ts +216 -90
  176. package/lib/__tests__/graphs.spec.ts +4 -4
  177. package/lib/__tests__/services.spec.ts +62 -7
  178. package/lib/domains.ts +148 -0
  179. package/lib/events.ts +68 -22
  180. package/lib/graphs.ts +6 -3
  181. package/lib/services.ts +51 -13
  182. package/out/404/index.html +1 -1
  183. package/out/_next/data/{jznFKGTbxJsAeYNZE4XtO → sTHntsHUajnk_njFTxiB5/domains/Shopping}/events/AddedItemToCart/logs.json +0 -0
  184. package/out/_next/data/sTHntsHUajnk_njFTxiB5/domains/Shopping/events/AddedItemToCart/v/0.0.1.json +1 -0
  185. package/out/_next/data/sTHntsHUajnk_njFTxiB5/domains/Shopping/events/AddedItemToCart/v/0.0.2.json +1 -0
  186. package/out/_next/data/sTHntsHUajnk_njFTxiB5/domains/Shopping/events/AddedItemToCart.json +1 -0
  187. package/out/_next/data/sTHntsHUajnk_njFTxiB5/domains/Shopping/services/Basket Service.json +1 -0
  188. package/out/_next/data/sTHntsHUajnk_njFTxiB5/domains/Shopping/services/Data Lake.json +1 -0
  189. package/out/_next/data/sTHntsHUajnk_njFTxiB5/domains/Shopping.json +1 -0
  190. package/out/_next/data/sTHntsHUajnk_njFTxiB5/domains.json +1 -0
  191. package/out/_next/data/{jznFKGTbxJsAeYNZE4XtO → sTHntsHUajnk_njFTxiB5}/events/OrderComplete/logs.json +0 -0
  192. package/out/_next/data/sTHntsHUajnk_njFTxiB5/events/OrderComplete.json +1 -0
  193. package/out/_next/data/{jznFKGTbxJsAeYNZE4XtO → sTHntsHUajnk_njFTxiB5}/events/OrderConfirmed/logs.json +0 -0
  194. package/out/_next/data/sTHntsHUajnk_njFTxiB5/events/OrderConfirmed.json +1 -0
  195. package/out/_next/data/{jznFKGTbxJsAeYNZE4XtO → sTHntsHUajnk_njFTxiB5}/events/OrderRequested/logs.json +0 -0
  196. package/out/_next/data/sTHntsHUajnk_njFTxiB5/events/OrderRequested.json +1 -0
  197. package/out/_next/data/{jznFKGTbxJsAeYNZE4XtO → sTHntsHUajnk_njFTxiB5}/events/PaymentProcessed/logs.json +0 -0
  198. package/out/_next/data/sTHntsHUajnk_njFTxiB5/events/PaymentProcessed.json +1 -0
  199. package/out/_next/data/{jznFKGTbxJsAeYNZE4XtO → sTHntsHUajnk_njFTxiB5}/events/RemovedItemFromCart/logs.json +0 -0
  200. package/out/_next/data/sTHntsHUajnk_njFTxiB5/events/RemovedItemFromCart.json +1 -0
  201. package/out/_next/data/{jznFKGTbxJsAeYNZE4XtO → sTHntsHUajnk_njFTxiB5}/events/ShipmentDelivered/logs.json +0 -0
  202. package/out/_next/data/sTHntsHUajnk_njFTxiB5/events/ShipmentDelivered.json +1 -0
  203. package/out/_next/data/{jznFKGTbxJsAeYNZE4XtO → sTHntsHUajnk_njFTxiB5}/events/ShipmentDispatched/logs.json +0 -0
  204. package/out/_next/data/sTHntsHUajnk_njFTxiB5/events/ShipmentDispatched.json +1 -0
  205. package/out/_next/data/{jznFKGTbxJsAeYNZE4XtO → sTHntsHUajnk_njFTxiB5}/events/ShipmentPrepared/logs.json +0 -0
  206. package/out/_next/data/sTHntsHUajnk_njFTxiB5/events/ShipmentPrepared.json +1 -0
  207. package/out/_next/data/sTHntsHUajnk_njFTxiB5/events.json +1 -0
  208. package/out/_next/data/sTHntsHUajnk_njFTxiB5/overview.json +1 -0
  209. package/out/_next/data/sTHntsHUajnk_njFTxiB5/services/Basket Service.json +1 -0
  210. package/out/_next/data/sTHntsHUajnk_njFTxiB5/services/Data Lake.json +1 -0
  211. package/out/_next/data/sTHntsHUajnk_njFTxiB5/services/Payment Service.json +1 -0
  212. package/out/_next/data/sTHntsHUajnk_njFTxiB5/services/Shipping Service.json +1 -0
  213. package/out/_next/data/sTHntsHUajnk_njFTxiB5/services.json +1 -0
  214. package/out/_next/data/sTHntsHUajnk_njFTxiB5/users/dboyne.json +1 -0
  215. package/out/_next/data/sTHntsHUajnk_njFTxiB5/users/mSmith.json +1 -0
  216. package/out/_next/data/sTHntsHUajnk_njFTxiB5/visualiser.json +1 -0
  217. package/out/_next/static/chunks/109-716dea1303010b4f.js +1 -0
  218. package/out/_next/static/chunks/169-b33dfdaf2847d062.js +1 -0
  219. package/out/_next/static/chunks/178-e9a666e11fb7c88d.js +1 -0
  220. package/out/_next/static/chunks/585-aa9262ea1bcf9d5b.js +1 -0
  221. package/out/_next/static/chunks/650-555944cc1eb7714e.js +1 -0
  222. package/out/_next/static/chunks/962-17a425b16c23bd0f.js +1 -0
  223. package/out/_next/static/chunks/pages/_app-d88c877888678e85.js +1 -0
  224. package/out/_next/static/chunks/pages/domains/[domain]/events/[name]/logs-7317f2121b8f0d8c.js +1 -0
  225. package/out/_next/static/chunks/pages/domains/[domain]/events/[name]/v/[version]-a7fa6002267ccd3b.js +1 -0
  226. package/out/_next/static/chunks/pages/domains/[domain]/events/[name]-a5fb5b26471e703b.js +1 -0
  227. package/out/_next/static/chunks/pages/domains/[domain]/services/[name]-80d6d803e5466b81.js +1 -0
  228. package/out/_next/static/chunks/pages/domains/[domain]-e39d527b56fd45c8.js +1 -0
  229. package/out/_next/static/chunks/pages/domains-6ab78cb1bc2f4200.js +1 -0
  230. package/out/_next/static/chunks/pages/events/[name]/v/[version]-93d978734b0dc0a3.js +1 -0
  231. package/out/_next/static/chunks/pages/events/{[name]-813780e7042af288.js → [name]-d3d2a03948b8dfeb.js} +1 -1
  232. package/out/_next/static/chunks/pages/events-5a41c37b360b2fce.js +1 -0
  233. package/out/_next/static/chunks/pages/{overview-2f0bfad06c84e437.js → overview-dc5e91549c7e3d52.js} +1 -1
  234. package/out/_next/static/chunks/pages/services/[name]-148079bb388f8c53.js +1 -0
  235. package/out/_next/static/chunks/pages/services-7fe5a823f1b25f18.js +1 -0
  236. package/out/_next/static/chunks/pages/users/[id]-b255611073ef76e0.js +1 -0
  237. package/out/_next/static/chunks/pages/visualiser-2fc8224670ac5dff.js +1 -0
  238. package/out/_next/static/chunks/webpack-b17b8ef11b94ba66.js +1 -0
  239. package/{.next/static/css/4a01a08d48b115f7.css → out/_next/static/css/70ede87da43120f8.css} +1 -1
  240. package/out/_next/static/sTHntsHUajnk_njFTxiB5/_buildManifest.js +1 -0
  241. package/out/_next/static/{jznFKGTbxJsAeYNZE4XtO → sTHntsHUajnk_njFTxiB5}/_middlewareManifest.js +0 -0
  242. package/out/_next/static/sTHntsHUajnk_njFTxiB5/_ssgManifest.js +1 -0
  243. package/out/domains/Shopping/events/AddedItemToCart/index.html +65 -0
  244. package/out/domains/Shopping/events/AddedItemToCart/logs/index.html +1 -0
  245. package/out/domains/Shopping/events/AddedItemToCart/v/0.0.1/index.html +58 -0
  246. package/out/domains/Shopping/events/AddedItemToCart/v/0.0.2/index.html +65 -0
  247. package/out/domains/Shopping/index.html +2 -0
  248. package/out/domains/Shopping/services/Basket Service/index.html +2 -0
  249. package/out/domains/Shopping/services/Data Lake/index.html +2 -0
  250. package/out/domains/index.html +2 -0
  251. package/out/events/OrderComplete/index.html +2 -2
  252. package/out/events/OrderComplete/logs/index.html +1 -1
  253. package/out/events/OrderConfirmed/index.html +2 -2
  254. package/out/events/OrderConfirmed/logs/index.html +1 -1
  255. package/out/events/OrderRequested/index.html +2 -2
  256. package/out/events/OrderRequested/logs/index.html +1 -1
  257. package/out/events/PaymentProcessed/index.html +2 -2
  258. package/out/events/PaymentProcessed/logs/index.html +1 -1
  259. package/out/events/RemovedItemFromCart/index.html +2 -2
  260. package/out/events/RemovedItemFromCart/logs/index.html +1 -1
  261. package/out/events/ShipmentDelivered/index.html +2 -2
  262. package/out/events/ShipmentDelivered/logs/index.html +1 -1
  263. package/out/events/ShipmentDispatched/index.html +2 -2
  264. package/out/events/ShipmentDispatched/logs/index.html +1 -1
  265. package/out/events/ShipmentPrepared/index.html +2 -2
  266. package/out/events/ShipmentPrepared/logs/index.html +1 -1
  267. package/out/events/index.html +3 -3
  268. package/out/index.html +1 -1
  269. package/out/overview/index.html +1 -1
  270. package/out/services/Basket Service/index.html +1 -2
  271. package/out/services/Data Lake/index.html +1 -2
  272. package/out/services/Payment Service/index.html +2 -2
  273. package/out/services/Shipping Service/index.html +2 -2
  274. package/out/services/index.html +3 -3
  275. package/out/users/dboyne/index.html +6 -5
  276. package/out/users/mSmith/index.html +3 -3
  277. package/out/visualiser/index.html +4 -3
  278. package/package.json +2 -2
  279. package/pages/domains/[domain]/events/[name]/logs.tsx +29 -0
  280. package/pages/domains/[domain]/events/[name]/v/[version].tsx +39 -0
  281. package/pages/domains/[domain]/events/[name].tsx +46 -0
  282. package/pages/domains/[domain]/index.tsx +138 -0
  283. package/pages/domains/[domain]/services/[name].tsx +42 -0
  284. package/pages/domains.tsx +64 -0
  285. package/pages/events/[name]/logs.tsx +6 -4
  286. package/pages/events/[name]/v/[version].tsx +3 -2
  287. package/pages/events/[name].tsx +26 -12
  288. package/pages/events.tsx +59 -33
  289. package/pages/overview.tsx +3 -3
  290. package/pages/services/[name].tsx +8 -8
  291. package/pages/users/[id].tsx +15 -5
  292. package/pages/visualiser.tsx +98 -82
  293. package/scripts/move-schemas-for-download.js +25 -10
  294. package/tailwind.config.js +11 -1
  295. package/.next/server/pages/events/AddedItemToCart/logs.html +0 -1
  296. package/.next/server/pages/events/AddedItemToCart/v/0.0.1.html +0 -58
  297. package/.next/server/pages/events/AddedItemToCart/v/0.0.1.json +0 -1
  298. package/.next/server/pages/events/AddedItemToCart/v/0.0.2.html +0 -65
  299. package/.next/server/pages/events/AddedItemToCart/v/0.0.2.json +0 -1
  300. package/.next/server/pages/events/AddedItemToCart.html +0 -65
  301. package/.next/server/pages/events/AddedItemToCart.json +0 -1
  302. package/.next/static/chunks/109-a08539311d3d6672.js +0 -1
  303. package/.next/static/chunks/178-87f01d17ab32dd4f.js +0 -1
  304. package/.next/static/chunks/252-08ab418f9b6821dd.js +0 -1
  305. package/.next/static/chunks/650-343888e13f994a09.js +0 -1
  306. package/.next/static/chunks/962-20c87db3880df896.js +0 -1
  307. package/.next/static/chunks/pages/_app-f1bd719e11eb827e.js +0 -1
  308. package/.next/static/chunks/pages/events/[name]/v/[version]-33051dbc32f5fe4e.js +0 -1
  309. package/.next/static/chunks/pages/events-1f39499146c9c75f.js +0 -1
  310. package/.next/static/chunks/pages/services/[name]-142d7fa515cfc532.js +0 -1
  311. package/.next/static/chunks/pages/services-f52121c6dc1211aa.js +0 -1
  312. package/.next/static/chunks/pages/users/[id]-d3140bb155f8fb45.js +0 -1
  313. package/.next/static/chunks/pages/visualiser-e4e3757e74f19df7.js +0 -1
  314. package/.next/static/chunks/webpack-fb340c369157e229.js +0 -1
  315. package/.next/static/jznFKGTbxJsAeYNZE4XtO/_buildManifest.js +0 -1
  316. package/.next/static/jznFKGTbxJsAeYNZE4XtO/_ssgManifest.js +0 -1
  317. package/out/_next/data/jznFKGTbxJsAeYNZE4XtO/events/AddedItemToCart/v/0.0.1.json +0 -1
  318. package/out/_next/data/jznFKGTbxJsAeYNZE4XtO/events/AddedItemToCart/v/0.0.2.json +0 -1
  319. package/out/_next/data/jznFKGTbxJsAeYNZE4XtO/events/AddedItemToCart.json +0 -1
  320. package/out/_next/data/jznFKGTbxJsAeYNZE4XtO/events/OrderComplete.json +0 -1
  321. package/out/_next/data/jznFKGTbxJsAeYNZE4XtO/events/OrderConfirmed.json +0 -1
  322. package/out/_next/data/jznFKGTbxJsAeYNZE4XtO/events/OrderRequested.json +0 -1
  323. package/out/_next/data/jznFKGTbxJsAeYNZE4XtO/events/PaymentProcessed.json +0 -1
  324. package/out/_next/data/jznFKGTbxJsAeYNZE4XtO/events/RemovedItemFromCart.json +0 -1
  325. package/out/_next/data/jznFKGTbxJsAeYNZE4XtO/events/ShipmentDelivered.json +0 -1
  326. package/out/_next/data/jznFKGTbxJsAeYNZE4XtO/events/ShipmentDispatched.json +0 -1
  327. package/out/_next/data/jznFKGTbxJsAeYNZE4XtO/events/ShipmentPrepared.json +0 -1
  328. package/out/_next/data/jznFKGTbxJsAeYNZE4XtO/events.json +0 -1
  329. package/out/_next/data/jznFKGTbxJsAeYNZE4XtO/overview.json +0 -1
  330. package/out/_next/data/jznFKGTbxJsAeYNZE4XtO/services/Basket Service.json +0 -1
  331. package/out/_next/data/jznFKGTbxJsAeYNZE4XtO/services/Data Lake.json +0 -1
  332. package/out/_next/data/jznFKGTbxJsAeYNZE4XtO/services/Payment Service.json +0 -1
  333. package/out/_next/data/jznFKGTbxJsAeYNZE4XtO/services/Shipping Service.json +0 -1
  334. package/out/_next/data/jznFKGTbxJsAeYNZE4XtO/services.json +0 -1
  335. package/out/_next/data/jznFKGTbxJsAeYNZE4XtO/users/dboyne.json +0 -1
  336. package/out/_next/data/jznFKGTbxJsAeYNZE4XtO/users/mSmith.json +0 -1
  337. package/out/_next/data/jznFKGTbxJsAeYNZE4XtO/visualiser.json +0 -1
  338. package/out/_next/static/chunks/109-a08539311d3d6672.js +0 -1
  339. package/out/_next/static/chunks/178-87f01d17ab32dd4f.js +0 -1
  340. package/out/_next/static/chunks/252-08ab418f9b6821dd.js +0 -1
  341. package/out/_next/static/chunks/650-343888e13f994a09.js +0 -1
  342. package/out/_next/static/chunks/962-20c87db3880df896.js +0 -1
  343. package/out/_next/static/chunks/pages/_app-f1bd719e11eb827e.js +0 -1
  344. package/out/_next/static/chunks/pages/events/[name]/v/[version]-33051dbc32f5fe4e.js +0 -1
  345. package/out/_next/static/chunks/pages/events-1f39499146c9c75f.js +0 -1
  346. package/out/_next/static/chunks/pages/services/[name]-142d7fa515cfc532.js +0 -1
  347. package/out/_next/static/chunks/pages/services-f52121c6dc1211aa.js +0 -1
  348. package/out/_next/static/chunks/pages/users/[id]-d3140bb155f8fb45.js +0 -1
  349. package/out/_next/static/chunks/pages/visualiser-e4e3757e74f19df7.js +0 -1
  350. package/out/_next/static/chunks/webpack-fb340c369157e229.js +0 -1
  351. package/out/_next/static/jznFKGTbxJsAeYNZE4XtO/_buildManifest.js +0 -1
  352. package/out/_next/static/jznFKGTbxJsAeYNZE4XtO/_ssgManifest.js +0 -1
  353. package/out/events/AddedItemToCart/index.html +0 -65
  354. package/out/events/AddedItemToCart/logs/index.html +0 -1
  355. package/out/events/AddedItemToCart/v/0.0.1/index.html +0 -58
  356. package/out/events/AddedItemToCart/v/0.0.2/index.html +0 -65
@@ -48,8 +48,8 @@ click My_Service href "/docs/services/My Service" "Go to My Service" _self`);
48
48
  const event = {
49
49
  name: 'My Event',
50
50
  version: '0.0.1',
51
- producers: ['Service 1'],
52
- consumers: ['Service 2'],
51
+ producerNames: ['Service 1'],
52
+ consumerNames: ['Service 2'],
53
53
  };
54
54
 
55
55
  const result = buildMermaidFlowChartForEvent(event);
@@ -77,8 +77,8 @@ click My_Event href "/docs/events/My Event" "Go to My Event" _self`);
77
77
  const event = {
78
78
  name: 'My Event',
79
79
  version: '0.0.1',
80
- producers: ['Service 1 With Spaces'],
81
- consumers: [],
80
+ producerNames: ['Service 1 With Spaces'],
81
+ consumerNames: [],
82
82
  };
83
83
  const result = buildMermaidFlowChartForEvent(event);
84
84
  expect(result).toContain(`Service_1_With_Spaces[Service 1 With Spaces]:::producer-->My_Event[My Event]:::event`);
@@ -33,6 +33,7 @@ describe('services', () => {
33
33
  url: 'https://github.com/boyney123/pretend-basket-service',
34
34
  },
35
35
  subscribes: [],
36
+ domain: null,
36
37
  summary: 'CRUD based API to handle Basket interactions for users of the shopping website.\n',
37
38
  tags: [],
38
39
  },
@@ -40,6 +41,7 @@ describe('services', () => {
40
41
  name: 'Email Platform',
41
42
  summary: 'Internal Email system. Used to send emails to 1000s of customers. Hosted in AWS\n',
42
43
  owners: ['dboyne'],
44
+ domain: null,
43
45
  repository: {
44
46
  url: 'https://github.com/boyney123/EmailPlatform',
45
47
  language: 'JavaScript',
@@ -58,16 +60,36 @@ describe('services', () => {
58
60
  name: 'EmailSent',
59
61
  version: '0.0.1',
60
62
  summary: 'Tells us when an email has been sent\n',
61
- producers: ['Email Platform'],
62
- consumers: [],
63
+ producerNames: ['Email Platform'],
64
+ consumerNames: [],
63
65
  externalLinks: [],
64
66
  historicVersions: [],
67
+ domain: null,
65
68
  owners: ['dboyne', 'mSmith'],
66
69
  },
67
70
  ],
68
71
  subscribes: [],
69
72
  externalLinks: [],
70
73
  },
74
+ {
75
+ name: 'User Service',
76
+ summary: 'CRUD based API to handle User information\n',
77
+ domain: 'User',
78
+ owners: ['mSmith'],
79
+ repository: {
80
+ language: 'JavaScript',
81
+ url: 'https://github.com/boyney123/pretend-basket-service',
82
+ },
83
+ tags: [],
84
+ externalLinks: [
85
+ {
86
+ label: 'AsyncAPI Specification',
87
+ url: 'https://studio.asyncapi.com/#schema-lightMeasuredPayload',
88
+ },
89
+ ],
90
+ publishes: [],
91
+ subscribes: [],
92
+ },
71
93
  ]);
72
94
  });
73
95
  });
@@ -90,6 +112,7 @@ describe('services', () => {
90
112
  url: 'https://github.com/boyney123/EmailPlatform',
91
113
  language: 'JavaScript',
92
114
  },
115
+ domain: null,
93
116
  tags: [
94
117
  {
95
118
  label: 'defaultContentType:application/json',
@@ -104,9 +127,10 @@ describe('services', () => {
104
127
  name: 'EmailSent',
105
128
  version: '0.0.1',
106
129
  summary: 'Tells us when an email has been sent\n',
107
- producers: ['Email Platform'],
108
- consumers: [],
130
+ producerNames: ['Email Platform'],
131
+ consumerNames: [],
109
132
  historicVersions: [],
133
+ domain: null,
110
134
  externalLinks: [],
111
135
  owners: ['dboyne', 'mSmith'],
112
136
  },
@@ -120,12 +144,13 @@ describe('services', () => {
120
144
 
121
145
  describe('getServiceByName', () => {
122
146
  it('returns an event and markdown by the given event name', async () => {
123
- const { service, markdown } = await getServiceByName('Email Platform');
147
+ const { service, markdown } = await getServiceByName({ serviceName: 'Email Platform' });
124
148
 
125
149
  expect(service).toEqual({
126
150
  name: 'Email Platform',
127
151
  summary: 'Internal Email system. Used to send emails to 1000s of customers. Hosted in AWS\n',
128
152
  owners: ['dboyne'],
153
+ domain: null,
129
154
  repository: {
130
155
  url: 'https://github.com/boyney123/EmailPlatform',
131
156
  language: 'JavaScript',
@@ -144,9 +169,10 @@ describe('services', () => {
144
169
  name: 'EmailSent',
145
170
  version: '0.0.1',
146
171
  summary: 'Tells us when an email has been sent\n',
147
- producers: ['Email Platform'],
148
- consumers: [],
172
+ producerNames: ['Email Platform'],
173
+ consumerNames: [],
149
174
  historicVersions: [],
175
+ domain: null,
150
176
  externalLinks: [],
151
177
  owners: ['dboyne', 'mSmith'],
152
178
  },
@@ -158,5 +184,34 @@ describe('services', () => {
158
184
  // @ts-ignore
159
185
  expect(markdown.content).toMatchMarkdown('# Testing');
160
186
  });
187
+
188
+ describe('services within domains', () => {
189
+ it('returns an event and markdown by the given event name', async () => {
190
+ const { service, markdown } = await getServiceByName({ serviceName: 'User Service', domain: 'User' });
191
+
192
+ expect(service).toEqual({
193
+ name: 'User Service',
194
+ summary: 'CRUD based API to handle User information\n',
195
+ domain: 'User',
196
+ owners: ['mSmith'],
197
+ repository: {
198
+ language: 'JavaScript',
199
+ url: 'https://github.com/boyney123/pretend-basket-service',
200
+ },
201
+ tags: [],
202
+ externalLinks: [
203
+ {
204
+ label: 'AsyncAPI Specification',
205
+ url: 'https://studio.asyncapi.com/#schema-lightMeasuredPayload',
206
+ },
207
+ ],
208
+ publishes: [],
209
+ subscribes: [],
210
+ });
211
+
212
+ // @ts-ignore
213
+ expect(markdown.content).toMatchMarkdown('# Testing');
214
+ });
215
+ });
161
216
  });
162
217
  });
package/lib/domains.ts ADDED
@@ -0,0 +1,148 @@
1
+ import path from 'path';
2
+ import fs from 'fs';
3
+ import type { Event } from '@eventcatalog/types';
4
+ import { Domain } from '@eventcatalog/types';
5
+ import { serialize } from 'next-mdx-remote/serialize';
6
+ import { getAllEventsFromPath } from './events';
7
+ import { getAllServicesFromPath } from './services';
8
+ import { readMarkdownFile, getLastModifiedDateOfFile } from '@/lib/file-reader';
9
+
10
+ import { MarkdownFile } from '../types/index';
11
+
12
+ const buildDomain = (domainFrontMatter: any): Domain => {
13
+ const { name, summary, owners = [], tags = [], externalLinks = [] } = domainFrontMatter;
14
+ return { name, summary, owners, tags, externalLinks };
15
+ };
16
+
17
+ export const getUniqueDomainNamesFromEvents = (events: Event[]) => {
18
+ const allDomains = events.filter((event) => !!event.domain).map((event) => event.domain);
19
+ // @ts-ignore
20
+ return [...new Set(allDomains)];
21
+ };
22
+
23
+ export const getAllDomainsByOwnerId = async (ownerId): Promise<Domain[]> => {
24
+ const domainsWithMarkdown = await getAllDomains();
25
+
26
+ const domains = domainsWithMarkdown.map((item) => item.domain);
27
+ const domainsOwnedByUser = domains.filter((domain) => domain.owners.some((id) => id === ownerId));
28
+ return domainsOwnedByUser.map((domain) => ({
29
+ ...domain,
30
+ }));
31
+ };
32
+
33
+ export const getAllEventsFromDomains = () => {
34
+ const domainsDir = path.join(process.env.PROJECT_DIR, 'domains');
35
+
36
+ if (!fs.existsSync(domainsDir)) return [];
37
+
38
+ const domains = fs.readdirSync(domainsDir);
39
+
40
+ return domains.reduce((allEventsFromDomains, domainFolder) => {
41
+ const domainDir = path.join(domainsDir, domainFolder);
42
+ const eventsForDomainDir = path.join(domainDir, 'events');
43
+ const domainHasEvents = fs.existsSync(eventsForDomainDir);
44
+
45
+ if (domainHasEvents) {
46
+ const domainEvents = getAllEventsFromPath(eventsForDomainDir);
47
+
48
+ // Add domains onto events
49
+ const eventsWithDomain = domainEvents.map((event) => ({ ...event, domain: domainFolder }));
50
+
51
+ return [...allEventsFromDomains, ...eventsWithDomain];
52
+ }
53
+
54
+ return allEventsFromDomains;
55
+ }, []);
56
+ };
57
+
58
+ export const getAllServicesFromDomains = () => {
59
+ const domainsDir = path.join(process.env.PROJECT_DIR, 'domains');
60
+ if (!fs.existsSync(domainsDir)) return [];
61
+ const domains = fs.readdirSync(domainsDir);
62
+
63
+ return domains.reduce((allServicesFromDomains, domainFolder) => {
64
+ const domainDir = path.join(domainsDir, domainFolder);
65
+ const servicesForDomainDir = path.join(domainDir, 'services');
66
+ const domainHasServices = fs.existsSync(servicesForDomainDir);
67
+
68
+ if (domainHasServices) {
69
+ const domainServices = getAllServicesFromPath(servicesForDomainDir);
70
+
71
+ // Add domains onto events
72
+ const eventsWithDomain = domainServices.map((event) => ({ ...event, domain: domainFolder }));
73
+
74
+ return [...allServicesFromDomains, ...eventsWithDomain];
75
+ }
76
+
77
+ return allServicesFromDomains;
78
+ }, []);
79
+ };
80
+
81
+ export const getDomainByName = async ({
82
+ domainName,
83
+ }: {
84
+ domainName: string;
85
+ }): Promise<{ domain: Domain; markdown: MarkdownFile }> => {
86
+ try {
87
+ const domainsDir = path.join(process.env.PROJECT_DIR, 'domains');
88
+ const domainDirectory = path.join(domainsDir, domainName);
89
+
90
+ const { data, content } = readMarkdownFile(path.join(domainDirectory, `index.md`));
91
+ const domain = buildDomain(data);
92
+
93
+ const mdxSource = await serialize(content);
94
+
95
+ const eventsForDomain = getAllEventsFromPath(path.join(domainDirectory, 'events'));
96
+ const servicesForDomain = getAllServicesFromPath(path.join(domainDirectory, 'services'));
97
+
98
+ return {
99
+ // @ts-ignore
100
+ domain: {
101
+ ...domain,
102
+ events: eventsForDomain,
103
+ services: servicesForDomain,
104
+ },
105
+ markdown: {
106
+ content,
107
+ lastModifiedDate: getLastModifiedDateOfFile(path.join(domainDirectory, `index.md`)),
108
+ source: mdxSource,
109
+ },
110
+ };
111
+ } catch (error) {
112
+ console.log('Failed to get domain by name', domainName);
113
+ return Promise.reject();
114
+ }
115
+ };
116
+
117
+ export const getDomainByPath = async (domainDirectory: string): Promise<{ domain: Domain; markdown: MarkdownFile }> => {
118
+ const { data, content } = readMarkdownFile(path.join(domainDirectory, `index.md`));
119
+ const domain = buildDomain(data);
120
+
121
+ const mdxSource = await serialize(content);
122
+
123
+ const eventsForDomain = getAllEventsFromPath(path.join(domainDirectory, 'events'));
124
+ const servicesForDomain = getAllServicesFromPath(path.join(domainDirectory, 'services'));
125
+
126
+ return {
127
+ // @ts-ignore
128
+ domain: {
129
+ ...domain,
130
+ events: eventsForDomain,
131
+ services: servicesForDomain,
132
+ },
133
+ markdown: {
134
+ content,
135
+ lastModifiedDate: getLastModifiedDateOfFile(path.join(domainDirectory, `index.md`)),
136
+ source: mdxSource,
137
+ },
138
+ };
139
+ };
140
+
141
+ export const getAllDomainsFromPath = async (domainsDir: string) => {
142
+ if (!fs.existsSync(domainsDir)) return [];
143
+ const folders = fs.readdirSync(domainsDir);
144
+ const allDomains = folders.map((folder) => getDomainByPath(path.join(domainsDir, folder)));
145
+ return Promise.all(allDomains);
146
+ };
147
+
148
+ export const getAllDomains = () => getAllDomainsFromPath(path.join(process.env.PROJECT_DIR, 'domains'));
package/lib/events.ts CHANGED
@@ -9,11 +9,22 @@ import { MarkdownFile } from '@/types/index';
9
9
  import { extentionToLanguageMap } from './file-reader';
10
10
 
11
11
  import { getLastModifiedDateOfFile, getSchemaFromDir, readMarkdownFile } from '@/lib/file-reader';
12
- import { getAllServices } from './services';
12
+
13
+ import { getAllServices, hydrateEventProducersAndConsumers } from './services';
14
+ import { getAllEventsFromDomains } from './domains';
13
15
 
14
16
  const parseEventFrontMatterIntoEvent = (eventFrontMatter: any): Event => {
15
- const { name, version, summary, producers = [], consumers = [], owners = [], externalLinks = [] } = eventFrontMatter;
16
- return { name, version, summary, producers, consumers, owners, externalLinks };
17
+ const {
18
+ name,
19
+ version,
20
+ summary,
21
+ domain = null,
22
+ producers = [],
23
+ consumers = [],
24
+ owners = [],
25
+ externalLinks = [],
26
+ } = eventFrontMatter;
27
+ return { name, version, summary, domain, producerNames: producers, consumerNames: consumers, owners, externalLinks };
17
28
  };
18
29
 
19
30
  const versionsForEvents = (pathToEvent) => {
@@ -27,8 +38,13 @@ const versionsForEvents = (pathToEvent) => {
27
38
  return [];
28
39
  };
29
40
 
30
- export const getLogsForEvent = (eventName) => {
31
- const eventsDir = path.join(process.env.PROJECT_DIR, 'events');
41
+ export const getLogsForEvent = ({ eventName, domain }: { eventName: string; domain?: string }) => {
42
+ let eventsDir = path.join(process.env.PROJECT_DIR, 'events');
43
+
44
+ if (domain) {
45
+ eventsDir = path.join(process.env.PROJECT_DIR, 'domains', domain, 'events');
46
+ }
47
+
32
48
  const historicVersions = versionsForEvents(path.join(eventsDir, eventName));
33
49
 
34
50
  const allVersions = historicVersions.map((version) => ({
@@ -129,17 +145,28 @@ const getEventExamplesFromDir = (pathToExamples) => {
129
145
  return examples;
130
146
  };
131
147
 
132
- export const getAllEvents = (): Event[] => {
133
- const eventsDir = path.join(process.env.PROJECT_DIR, 'events');
148
+ export const getEventByPath = (eventDir: string): Event => {
149
+ const { data } = readMarkdownFile(path.join(eventDir, 'index.md'));
150
+ const historicVersions = versionsForEvents(path.join(eventDir));
151
+ return {
152
+ ...parseEventFrontMatterIntoEvent(data),
153
+ historicVersions,
154
+ };
155
+ };
156
+
157
+ export const getAllEventsFromPath = (eventsDir: string): Event[] => {
134
158
  const folders = fs.readdirSync(eventsDir);
135
- return folders.map((folder) => {
136
- const { data } = readMarkdownFile(path.join(eventsDir, folder, 'index.md'));
137
- const historicVersions = versionsForEvents(path.join(eventsDir, folder));
138
- return {
139
- ...parseEventFrontMatterIntoEvent(data),
140
- historicVersions,
141
- };
142
- });
159
+ return folders.map((folder) => getEventByPath(path.join(eventsDir, folder)));
160
+ };
161
+
162
+ export const getAllEvents = (): Event[] => {
163
+ const allEventsFromDomainFolders = getAllEventsFromDomains();
164
+ const eventsWithoutDomains = getAllEventsFromPath(path.join(process.env.PROJECT_DIR, 'events'));
165
+
166
+ const events = [...eventsWithoutDomains, ...allEventsFromDomainFolders];
167
+ const sortedEvents = events.sort((a, b) => a.name.localeCompare(b.name));
168
+
169
+ return sortedEvents;
143
170
  };
144
171
 
145
172
  export const getAllOwners = (): string[] => {
@@ -158,15 +185,30 @@ export const getAllEventsAndVersionsFlattened = () => {
158
185
  // eventsWithVersionsFlattened.push({ eventName: event.name, version: event.version })
159
186
 
160
187
  if (event.historicVersions) {
161
- event.historicVersions.forEach((version) => eventsWithVersionsFlattened.push({ eventName: event.name, version }));
188
+ event.historicVersions.forEach((version) =>
189
+ eventsWithVersionsFlattened.push({ eventName: event.name, version, domain: event.domain })
190
+ );
162
191
  }
163
192
 
164
193
  return eventsWithVersionsFlattened;
165
194
  }, []);
166
195
  };
167
196
 
168
- export const getEventByName = async (eventName: string, version?: string): Promise<{ event: Event; markdown: MarkdownFile }> => {
169
- const eventsDir = path.join(process.env.PROJECT_DIR, 'events');
197
+ export const getEventByName = async ({
198
+ eventName,
199
+ version,
200
+ domain,
201
+ }: {
202
+ eventName: string;
203
+ version?: string;
204
+ domain?: string;
205
+ }): Promise<{ event: Event; markdown: MarkdownFile }> => {
206
+ let eventsDir = path.join(process.env.PROJECT_DIR, 'events');
207
+
208
+ if (domain) {
209
+ eventsDir = path.join(process.env.PROJECT_DIR, 'domains', domain, 'events');
210
+ }
211
+
170
212
  const eventDirectory = path.join(eventsDir, eventName);
171
213
  let versionDirectory = null;
172
214
 
@@ -179,12 +221,16 @@ export const getEventByName = async (eventName: string, version?: string): Promi
179
221
  try {
180
222
  const { data, content } = readMarkdownFile(path.join(directoryToLoadForEvent, `index.md`));
181
223
  const event = parseEventFrontMatterIntoEvent(data);
224
+ const services = getAllServices();
225
+ const consumersAndProducersAsServices = hydrateEventProducersAndConsumers(event, services);
182
226
 
183
227
  const mdxSource = await serialize(content);
184
228
 
185
229
  return {
186
230
  event: {
187
231
  ...event,
232
+ ...consumersAndProducersAsServices,
233
+ domain: domain || null,
188
234
  historicVersions: versionsForEvents(eventDirectory),
189
235
  schema: getSchemaFromDir(directoryToLoadForEvent),
190
236
  examples: getEventExamplesFromDir(path.join(directoryToLoadForEvent, `examples`)),
@@ -204,8 +250,8 @@ export const getEventByName = async (eventName: string, version?: string): Promi
204
250
 
205
251
  export const getUniqueServicesNamesFromEvents = (events: Event[]) => {
206
252
  const allConsumersAndProducers = events.reduce((domains, event) => {
207
- const { consumers = [], producers = [] } = event;
208
- return domains.concat(consumers).concat(producers);
253
+ const { consumerNames = [], producerNames = [] } = event;
254
+ return domains.concat(consumerNames).concat(producerNames);
209
255
  }, []);
210
256
 
211
257
  const data = allConsumersAndProducers.map((service) => service);
@@ -225,8 +271,8 @@ export const getAllEventsThatHaveRelationshipWithService = (
225
271
  ): { publishes: Event[]; subscribes: Event[] } => {
226
272
  const relationshipsBetweenEvents = events.reduce(
227
273
  (data, event) => {
228
- const serviceSubscribesToEvent = event.consumers.some((id) => id === service.name);
229
- const servicePublishesEvent = event.producers.some((id) => id === service.name);
274
+ const serviceSubscribesToEvent = event.consumerNames.some((id) => id === service.name);
275
+ const servicePublishesEvent = event.producerNames.some((id) => id === service.name);
230
276
 
231
277
  return {
232
278
  publishes: servicePublishesEvent ? data.publishes.concat(event) : data.publishes,
package/lib/graphs.ts CHANGED
@@ -31,14 +31,17 @@ click ${centerNode.id} href "${centerNode.link}" "Go to ${centerNode.name}" _sel
31
31
  * @param {string} rootNodeColor of the root node
32
32
  * @returns {string} Mermaid Graph
33
33
  */
34
- export const buildMermaidFlowChartForEvent = ({ name: eventName, producers, consumers }: Event, rootNodeColor = '#2563eb') => {
34
+ export const buildMermaidFlowChartForEvent = (
35
+ { name: eventName, producerNames, consumerNames }: Event,
36
+ rootNodeColor = '#2563eb'
37
+ ) => {
35
38
  // Transforms services & event into a graph model
36
- const leftNodes = producers.map(truncateNode).map((node) => ({
39
+ const leftNodes = producerNames.map(truncateNode).map((node) => ({
37
40
  id: node.replace(/ /g, '_'),
38
41
  name: node,
39
42
  link: generateLink(node, 'services'),
40
43
  }));
41
- const rightNodes = consumers.map(truncateNode).map((node) => ({
44
+ const rightNodes = consumerNames.map(truncateNode).map((node) => ({
42
45
  id: node.replace(/ /g, '_'),
43
46
  name: node,
44
47
  link: generateLink(node, 'services'),
package/lib/services.ts CHANGED
@@ -1,33 +1,44 @@
1
1
  import fs from 'fs';
2
2
  import path from 'path';
3
3
  import { serialize } from 'next-mdx-remote/serialize';
4
- import { Service } from '@eventcatalog/types';
4
+ import { Service, Event } from '@eventcatalog/types';
5
5
  import { readMarkdownFile, getLastModifiedDateOfFile } from '@/lib/file-reader';
6
6
  import { MarkdownFile } from '../types/index';
7
7
 
8
8
  import { getAllEvents, getAllEventsThatHaveRelationshipWithService } from '@/lib/events';
9
+ import { getAllServicesFromDomains } from '@/lib/domains';
9
10
 
10
11
  const buildService = (eventFrontMatter: any): Service => {
11
- const { name, summary, owners = [], repository = {}, tags = [], externalLinks = [] } = eventFrontMatter;
12
- return { name, summary, owners, repository, tags, externalLinks };
12
+ const { name, summary, domain = null, owners = [], repository = {}, tags = [], externalLinks = [] } = eventFrontMatter;
13
+ return { name, summary, domain, owners, repository, tags, externalLinks };
13
14
  };
14
15
 
15
- export const getAllServices = (): Service[] => {
16
- const servicesDir = path.join(process.env.PROJECT_DIR, 'services');
16
+ export const getServiceByPath = (serviceDirPath: string): Service => {
17
+ const { data } = readMarkdownFile(path.join(serviceDirPath, 'index.md'));
18
+ return buildService(data);
19
+ };
17
20
 
18
- const folders = fs.readdirSync(servicesDir);
19
- const services = folders.map((folder) => readMarkdownFile(path.join(servicesDir, folder, 'index.md')));
21
+ export const getAllServicesFromPath = (serviceDir: string): Service[] => {
22
+ const folders = fs.readdirSync(serviceDir);
20
23
  const events = getAllEvents();
24
+ const services = folders.map((folder) => getServiceByPath(path.join(serviceDir, folder)));
21
25
 
22
- const parsedServices = services.map((frontMatter) => buildService(frontMatter.data));
23
-
24
- // @ts-ignore
25
- return parsedServices.map((service) => ({
26
+ // // @ts-ignore
27
+ return services.map((service) => ({
26
28
  ...service,
27
29
  ...getAllEventsThatHaveRelationshipWithService(service, events),
28
30
  }));
29
31
  };
30
32
 
33
+ export const getAllServices = (): Service[] => {
34
+ const allServicesFromDomainFolders = getAllServicesFromDomains();
35
+ const servicesWithoutDomains = getAllServicesFromPath(path.join(process.env.PROJECT_DIR, 'services'));
36
+
37
+ const services = [...allServicesFromDomainFolders, ...servicesWithoutDomains];
38
+ const sortedServices = services.sort((a, b) => a.name.localeCompare(b.name));
39
+ return sortedServices;
40
+ };
41
+
31
42
  export const getAllServicesByOwnerId = async (ownerId): Promise<Service[]> => {
32
43
  const services = await getAllServices();
33
44
  const servicesOwnedByUser = services.filter((service) => service.owners.some((id) => id === ownerId));
@@ -36,9 +47,20 @@ export const getAllServicesByOwnerId = async (ownerId): Promise<Service[]> => {
36
47
  }));
37
48
  };
38
49
 
39
- export const getServiceByName = async (serviceName): Promise<{ service: Service; markdown: MarkdownFile }> => {
50
+ export const getServiceByName = async ({
51
+ serviceName,
52
+ domain = null,
53
+ }: {
54
+ serviceName: string;
55
+ domain?: string;
56
+ }): Promise<{ service: Service; markdown: MarkdownFile }> => {
40
57
  try {
41
- const servicesDir = path.join(process.env.PROJECT_DIR, 'services');
58
+ let servicesDir = path.join(process.env.PROJECT_DIR, 'services');
59
+
60
+ if (domain) {
61
+ servicesDir = path.join(process.env.PROJECT_DIR, 'domains', domain, 'services');
62
+ }
63
+
42
64
  const serviceDirectory = path.join(servicesDir, serviceName);
43
65
  const { data, content } = readMarkdownFile(path.join(serviceDirectory, `index.md`));
44
66
  const service = buildService(data);
@@ -51,6 +73,7 @@ export const getServiceByName = async (serviceName): Promise<{ service: Service;
51
73
  // @ts-ignore
52
74
  service: {
53
75
  ...service,
76
+ domain,
54
77
  ...getAllEventsThatHaveRelationshipWithService(service, events),
55
78
  },
56
79
  markdown: {
@@ -64,3 +87,18 @@ export const getServiceByName = async (serviceName): Promise<{ service: Service;
64
87
  return Promise.reject();
65
88
  }
66
89
  };
90
+
91
+ export const hydrateEventProducersAndConsumers = (
92
+ event: Event,
93
+ services: Service[]
94
+ ): { producers: Service[]; consumers: Service[] } => {
95
+ const findServiceByName = (name) => services.find((service) => service.name === name);
96
+
97
+ const producers = event.producerNames.map((name) => findServiceByName(name)).filter((service) => !!service);
98
+ const consumers = event.consumerNames.map((name) => findServiceByName(name)).filter((service) => !!service);
99
+
100
+ return {
101
+ producers: producers.length > 0 ? producers : [],
102
+ consumers: consumers.length > 0 ? consumers : [],
103
+ };
104
+ };
@@ -1 +1 @@
1
- <!DOCTYPE html><html><head><meta name="viewport" content="width=device-width"/><meta charSet="utf-8"/><script src="//unpkg.com/three"></script><script src="//unpkg.com/three/examples/js/renderers/CSS2DRenderer.js"></script><link rel="stylesheet" href="https://cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.css"/><meta name="description" content="Discover, Explore and Document your Event Driven Architectures"/><link rel="icon" href="/favicon.ico"/><meta property="og:url" content="https://eventcatalog.dev/"/><meta property="og:type" content="website"/><meta property="og:title" content="EventCatalog"/><meta property="og:description" content="Discover, Explore and Document your Event Driven Architectures"/><meta property="og:image" content="https://eventcatalog.dev/img/opengraph.png"/><meta property="og:image:alt" content="EventCatalog | Discover, Explore and Document your Event Driven Architectures"/><meta property="og:image:width" content="1200"/><meta property="og:image:height" content="600"/><meta property="og:locale" content="en-GB"/><meta name="author" content="David Boyne"/><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.13.1/styles/atom-one-light.min.css"/><title>404: This page could not be found</title><meta name="next-head-count" content="19"/><link rel="preload" href="/_next/static/css/4a01a08d48b115f7.css" as="style"/><link rel="stylesheet" href="/_next/static/css/4a01a08d48b115f7.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-5cd94c89d3acac5f.js"></script><script src="/_next/static/chunks/webpack-fb340c369157e229.js" defer=""></script><script src="/_next/static/chunks/framework-576ec6a1c1386453.js" defer=""></script><script src="/_next/static/chunks/main-0015f560a7edeb35.js" defer=""></script><script src="/_next/static/chunks/pages/_app-f1bd719e11eb827e.js" defer=""></script><script src="/_next/static/chunks/pages/_error-5a714c45c50a8db4.js" defer=""></script><script src="/_next/static/jznFKGTbxJsAeYNZE4XtO/_buildManifest.js" defer=""></script><script src="/_next/static/jznFKGTbxJsAeYNZE4XtO/_ssgManifest.js" defer=""></script><script src="/_next/static/jznFKGTbxJsAeYNZE4XtO/_middlewareManifest.js" defer=""></script></head><body><div id="__next" data-reactroot=""><div class="bg-gray-800"><div class="max-w-7xl mx-auto "><div class="relative flex items-center justify-between h-16"><div class="flex-1 flex items-center justify-center sm:items-stretch sm:justify-start"><div class="flex-shrink-0 flex items-center text-white font-bold"><a class="flex items-center" href="/"><img alt="logo" class="text-white w-8 inline-block mr-3" src="/logo.svg"/><span class="text-xl">EventCatalog</span></a></div></div><div class="hidden sm:block sm:ml-6"><div class="flex space-x-4"><a class="text-gray-300 hover:bg-gray-700 hover:text-white px-3 py-2 rounded-md text-sm font-medium" href="/events/">Events</a><a class="text-gray-300 hover:bg-gray-700 hover:text-white px-3 py-2 rounded-md text-sm font-medium" href="/services/">Services</a><a class="text-gray-300 hover:bg-gray-700 hover:text-white px-3 py-2 rounded-md text-sm font-medium" href="/visualiser/">Visualiser</a><a class="text-gray-300 hover:bg-gray-700 hover:text-white px-3 py-2 rounded-md text-sm font-medium" href="/overview/">3D Node Graph</a></div></div></div></div></div><div style="color:#000;background:#fff;font-family:-apple-system, BlinkMacSystemFont, Roboto, &quot;Segoe UI&quot;, &quot;Fira Sans&quot;, Avenir, &quot;Helvetica Neue&quot;, &quot;Lucida Grande&quot;, sans-serif;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body { margin: 0 }</style><h1 style="display:inline-block;border-right:1px solid rgba(0, 0, 0,.3);margin:0;margin-right:20px;padding:10px 23px 10px 0;font-size:24px;font-weight:500;vertical-align:top">404</h1><div style="display:inline-block;text-align:left;line-height:49px;height:49px;vertical-align:middle"><h2 style="font-size:14px;font-weight:normal;line-height:inherit;margin:0;padding:0">This page could not be found<!-- -->.</h2></div></div></div><footer class="bg-gray-800"><div class="max-w-7xl mx-auto py-12 px-4 overflow-hidden sm:px-6 lg:px-8"><nav class="-mx-5 -my-2 flex flex-wrap justify-center" aria-label="Footer"><div class="px-5 py-2"><a href="/events" class="text-base text-gray-500 hover:text-gray-400">Events</a></div><div class="px-5 py-2"><a href="/services" class="text-base text-gray-500 hover:text-gray-400">Services</a></div><div class="px-5 py-2"><a href="/visualiser" class="text-base text-gray-500 hover:text-gray-400">Visualiser</a></div><div class="px-5 py-2"><a href="/overview" class="text-base text-gray-500 hover:text-gray-400">3D Node Graph</a></div><div class="px-5 py-2"><a href="https://github.com/boyney123/eventcatalog-demo/edit/master" class="text-base text-gray-500 hover:text-gray-400">GitHub</a></div></nav><p class="mt-8 text-center text-base text-gray-400">Copyright © <!-- -->2022<!-- --> <!-- -->Your Company<!-- -->. Built with<!-- --> <a class="underline" href="https://eventcatalog.dev" target="_blank" rel="noreferrer">EventCatalog.</a></p></div></footer></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":404}},"page":"/_error","query":{},"buildId":"jznFKGTbxJsAeYNZE4XtO","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
1
+ <!DOCTYPE html><html><head><meta name="viewport" content="width=device-width"/><meta charSet="utf-8"/><script src="//unpkg.com/three"></script><script src="//unpkg.com/three/examples/js/renderers/CSS2DRenderer.js"></script><link rel="stylesheet" href="https://cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.css"/><meta name="description" content="Discover, Explore and Document your Event Driven Architectures"/><link rel="icon" href="/favicon.ico"/><meta property="og:url" content="https://eventcatalog.dev/"/><meta property="og:type" content="website"/><meta property="og:title" content="EventCatalog"/><meta property="og:description" content="Discover, Explore and Document your Event Driven Architectures"/><meta property="og:image" content="https://eventcatalog.dev/img/opengraph.png"/><meta property="og:image:alt" content="EventCatalog | Discover, Explore and Document your Event Driven Architectures"/><meta property="og:image:width" content="1200"/><meta property="og:image:height" content="600"/><meta property="og:locale" content="en-GB"/><meta name="author" content="David Boyne"/><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.13.1/styles/atom-one-light.min.css"/><title>404: This page could not be found</title><meta name="next-head-count" content="19"/><link rel="preload" href="/_next/static/css/70ede87da43120f8.css" as="style"/><link rel="stylesheet" href="/_next/static/css/70ede87da43120f8.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-5cd94c89d3acac5f.js"></script><script src="/_next/static/chunks/webpack-b17b8ef11b94ba66.js" defer=""></script><script src="/_next/static/chunks/framework-576ec6a1c1386453.js" defer=""></script><script src="/_next/static/chunks/main-0015f560a7edeb35.js" defer=""></script><script src="/_next/static/chunks/pages/_app-d88c877888678e85.js" defer=""></script><script src="/_next/static/chunks/pages/_error-5a714c45c50a8db4.js" defer=""></script><script src="/_next/static/sTHntsHUajnk_njFTxiB5/_buildManifest.js" defer=""></script><script src="/_next/static/sTHntsHUajnk_njFTxiB5/_ssgManifest.js" defer=""></script><script src="/_next/static/sTHntsHUajnk_njFTxiB5/_middlewareManifest.js" defer=""></script></head><body><div id="__next" data-reactroot=""><div class="bg-gray-800"><div class="max-w-7xl mx-auto "><div class="relative flex items-center justify-between h-16"><div class="flex-1 flex items-center justify-center sm:items-stretch sm:justify-start"><div class="flex-shrink-0 flex items-center text-white font-bold"><a class="flex items-center" href="/"><img alt="logo" class="text-white w-8 inline-block mr-3" src="/logo.svg"/><span class="text-xl">EventCatalog</span></a></div></div><div class="hidden sm:block sm:ml-6"><div class="flex space-x-4"><a class="text-gray-300 hover:bg-gray-700 hover:text-white px-3 py-2 rounded-md text-sm font-medium" href="/events/">Events</a><a class="text-gray-300 hover:bg-gray-700 hover:text-white px-3 py-2 rounded-md text-sm font-medium" href="/services/">Services</a><a class="text-gray-300 hover:bg-gray-700 hover:text-white px-3 py-2 rounded-md text-sm font-medium" href="/domains/">Domains</a><a class="text-gray-300 hover:bg-gray-700 hover:text-white px-3 py-2 rounded-md text-sm font-medium" href="/visualiser/">Visualiser</a><a class="text-gray-300 hover:bg-gray-700 hover:text-white px-3 py-2 rounded-md text-sm font-medium" href="/overview/">3D Node Graph</a></div></div></div></div></div><div style="color:#000;background:#fff;font-family:-apple-system, BlinkMacSystemFont, Roboto, &quot;Segoe UI&quot;, &quot;Fira Sans&quot;, Avenir, &quot;Helvetica Neue&quot;, &quot;Lucida Grande&quot;, sans-serif;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body { margin: 0 }</style><h1 style="display:inline-block;border-right:1px solid rgba(0, 0, 0,.3);margin:0;margin-right:20px;padding:10px 23px 10px 0;font-size:24px;font-weight:500;vertical-align:top">404</h1><div style="display:inline-block;text-align:left;line-height:49px;height:49px;vertical-align:middle"><h2 style="font-size:14px;font-weight:normal;line-height:inherit;margin:0;padding:0">This page could not be found<!-- -->.</h2></div></div></div><footer class="bg-gray-800"><div class="max-w-7xl mx-auto py-12 px-4 overflow-hidden sm:px-6 lg:px-8"><nav class="-mx-5 -my-2 flex flex-wrap justify-center" aria-label="Footer"><div class="px-5 py-2"><a href="/events" class="text-base text-gray-500 hover:text-gray-400">Events</a></div><div class="px-5 py-2"><a href="/services" class="text-base text-gray-500 hover:text-gray-400">Services</a></div><div class="px-5 py-2"><a href="/visualiser" class="text-base text-gray-500 hover:text-gray-400">Visualiser</a></div><div class="px-5 py-2"><a href="/overview" class="text-base text-gray-500 hover:text-gray-400">3D Node Graph</a></div><div class="px-5 py-2"><a href="https://github.com/boyney123/eventcatalog-demo/edit/master" class="text-base text-gray-500 hover:text-gray-400">GitHub</a></div></nav><p class="mt-8 text-center text-base text-gray-400">Copyright © <!-- -->2022<!-- --> <!-- -->Your Company<!-- -->. Built with<!-- --> <a class="underline" href="https://eventcatalog.dev" target="_blank" rel="noreferrer">EventCatalog.</a></p></div></footer></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":404}},"page":"/_error","query":{},"buildId":"sTHntsHUajnk_njFTxiB5","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
@@ -0,0 +1 @@
1
+ {"pageProps":{"event":{"name":"AddedItemToCart","version":"0.0.1","summary":"Holds information about what the user added to their shopping cart.\n","domain":"Shopping","producerNames":["Basket Service"],"consumerNames":["Data Lake"],"owners":["dboyne","mSmith"],"externalLinks":[],"producers":[{"name":"Basket Service","summary":"CRUD based API to handle Basket interactions for users of the shopping website.\n","domain":"Shopping","owners":["dboyne"],"repository":{"language":"JavaScript","url":"https://github.com/boyney123/pretend-basket-service"},"tags":[],"externalLinks":[{"label":"AsyncAPI Specification","url":"https://studio.asyncapi.com/#schema-lightMeasuredPayload"}],"publishes":[{"name":"AddedItemToCart","version":"0.0.3","summary":"Holds information about what the user added to their shopping cart.\n","domain":"Shopping","producerNames":["Basket Service"],"consumerNames":["Data Lake"],"owners":["dboyne","mSmith"],"externalLinks":[{"label":"AsyncAPI Specification","url":"https://studio.asyncapi.com/#schema-lightMeasuredPayload"}],"historicVersions":["0.0.2","0.0.1"]},{"name":"OrderRequested","version":"0.0.1","summary":"Holds information about the customers order.\n","domain":null,"producerNames":["Basket Service"],"consumerNames":["Payment Service"],"owners":["dboyne","mSmith"],"externalLinks":[],"historicVersions":[]},{"name":"RemovedItemFromCart","version":"0.0.1","summary":"Holds information about what the user removed from their cart.\n","domain":null,"producerNames":["Basket Service"],"consumerNames":["Data Lake"],"owners":["dboyne","mSmith"],"externalLinks":[],"historicVersions":[]}],"subscribes":[]}],"consumers":[{"name":"Data Lake","summary":"Our internal datalake used by the data team and business analytics.\n","domain":"Shopping","owners":["dboyne"],"repository":{},"tags":[],"externalLinks":[],"publishes":[],"subscribes":[{"name":"AddedItemToCart","version":"0.0.3","summary":"Holds information about what the user added to their shopping cart.\n","domain":"Shopping","producerNames":["Basket Service"],"consumerNames":["Data Lake"],"owners":["dboyne","mSmith"],"externalLinks":[{"label":"AsyncAPI Specification","url":"https://studio.asyncapi.com/#schema-lightMeasuredPayload"}],"historicVersions":["0.0.2","0.0.1"]},{"name":"OrderComplete","version":"0.0.1","summary":"Event represents when an order has been complete. (Delivered and finished)\n","domain":null,"producerNames":["Orders Service"],"consumerNames":["Data Lake"],"owners":["dboyne","mSmith"],"externalLinks":[],"historicVersions":[]},{"name":"RemovedItemFromCart","version":"0.0.1","summary":"Holds information about what the user removed from their cart.\n","domain":null,"producerNames":["Basket Service"],"consumerNames":["Data Lake"],"owners":["dboyne","mSmith"],"externalLinks":[],"historicVersions":[]},{"name":"ShipmentDelivered","version":"0.0.1","summary":"Event represents when a shipment has been delivered and received.\n","domain":null,"producerNames":["Shipping Service"],"consumerNames":["Order Service","Data Lake"],"owners":["dboyne","mSmith"],"externalLinks":[],"historicVersions":[]}]}],"historicVersions":["0.0.2","0.0.1"],"schema":{"snippet":"{\n \"$id\": \"https://example.com/AddedItemToCart.json\",\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"title\": \"AddedItemToCart\",\n \"type\": \"object\",\n \"properties\": {\n \"metadata\": {\n \"type\": \"object\",\n \"properties\": {\n \"correlationId\": {\n \"type\": \"string\",\n \"description\": \"The ID of the user\"\n },\n \"domain\": {\n \"type\": \"string\",\n \"description\": \"The domain of the event\"\n },\n \"service\": {\n \"type\": \"string\",\n \"description\": \"The name of the service that triggered the event\"\n }\n },\n \"required\": [\"correlationId\", \"domain\"]\n },\n \"data\": {\n \"type\": \"object\",\n \"properties\": {\n \"userId\": {\n \"type\": \"string\",\n \"description\": \"The ID of the user\"\n },\n \"itemId\": {\n \"type\": \"string\",\n \"description\": \"The ID of the shopping item\"\n }\n }\n }\n }\n}","language":"json","extension":"json"},"examples":[]},"markdown":{"content":"\n<Admonition>When firing this event make sure you set the `correlation-id` in the headers. Our schemas have standard metadata make sure you read and follow it.</Admonition>\n\n### Details\n\nThis event can be triggered multiple times per customer. Everytime the customer adds an item to their shopping cart this event will be triggered.\n\nWe have a frontend application that allows users to buy things from our store. This front end interacts directly with the `Basket Service` to add items to the cart. The `Basket Service` will raise the events.\n\n\n### Consumer / Producer Diagram\n\n<Mermaid />\n\n<Schema />","source":{"compiledSource":"var c=Object.defineProperty,p=Object.defineProperties;var l=Object.getOwnPropertyDescriptors;var i=Object.getOwnPropertySymbols;var a=Object.prototype.hasOwnProperty,s=Object.prototype.propertyIsEnumerable;var d=(e,t,o)=>t in e?c(e,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[t]=o,r=(e,t)=>{for(var o in t||(t={}))a.call(t,o)&&d(e,o,t[o]);if(i)for(var o of i(t))s.call(t,o)&&d(e,o,t[o]);return e},m=(e,t)=>p(e,l(t));var h=(e,t)=>{var o={};for(var n in e)a.call(e,n)&&t.indexOf(n)<0&&(o[n]=e[n]);if(e!=null&&i)for(var n of i(e))t.indexOf(n)<0&&s.call(e,n)&&(o[n]=e[n]);return o};const makeShortcode=e=>function(o){return console.warn(\"Component \"+e+\" was not imported, exported, or provided by MDXProvider as global scope\"),mdx(\"div\",r({},o))},Admonition=makeShortcode(\"Admonition\"),Mermaid=makeShortcode(\"Mermaid\"),Schema=makeShortcode(\"Schema\"),layoutProps={},MDXLayout=\"wrapper\";function MDXContent(o){var n=o,{components:e}=n,t=h(n,[\"components\"]);return mdx(MDXLayout,m(r(r({},layoutProps),t),{components:e,mdxType:\"MDXLayout\"}),mdx(Admonition,{mdxType:\"Admonition\"},\"When firing this event make sure you set the `correlation-id` in the headers. Our schemas have standard metadata make sure you read and follow it.\"),mdx(\"h3\",null,\"Details\"),mdx(\"p\",null,\"This event can be triggered multiple times per customer. Everytime the customer adds an item to their shopping cart this event will be triggered.\"),mdx(\"p\",null,\"We have a frontend application that allows users to buy things from our store. This front end interacts directly with the \",mdx(\"inlineCode\",{parentName:\"p\"},\"Basket Service\"),\" to add items to the cart. The \",mdx(\"inlineCode\",{parentName:\"p\"},\"Basket Service\"),\" will raise the events.\"),mdx(\"h3\",null,\"Consumer / Producer Diagram\"),mdx(Mermaid,{mdxType:\"Mermaid\"}),mdx(Schema,{mdxType:\"Schema\"}))}MDXContent.isMDXComponent=!0;\n","scope":{}},"lastModifiedDate":"2022/2/28"},"eventPath":"/domains/Shopping/events/AddedItemToCart","breadCrumbs":[{"name":"Domain","href":"/events","current":false},{"name":"Shopping","href":"/domains/Shopping","current":false},{"name":"Events","href":"/events?domain=Shopping","current":false},{"name":"AddedItemToCart","href":"/domains/Shopping/events/AddedItemToCart","current":false},{"name":"v0.0.1","href":"/domains/Shopping/events/AddedItemToCart/v/0.0.1","current":true}],"loadedVersion":"0.0.1"},"__N_SSG":true}