@eventcatalog/core 0.0.13 → 0.1.2

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 (253) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +39 -38
  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/export-detail.json +1 -0
  12. package/.next/next-server.js.nft.json +1 -1
  13. package/.next/prerender-manifest.json +1 -1
  14. package/.next/routes-manifest.json +1 -1
  15. package/.next/server/chunks/526.js +5 -5
  16. package/.next/server/chunks/565.js +6 -3
  17. package/.next/server/chunks/{959.js → 681.js} +126 -4
  18. package/.next/server/chunks/730.js +6 -7
  19. package/.next/server/chunks/938.js +18 -4
  20. package/.next/server/chunks/944.js +22 -27
  21. package/.next/server/pages/404.html +1 -1
  22. package/.next/server/pages/500.html +1 -1
  23. package/.next/server/pages/_app.js +14 -1
  24. package/.next/server/pages/events/AddedItemToCart/logs.html +1 -0
  25. package/.next/server/pages/events/AddedItemToCart/logs.json +1 -0
  26. package/.next/server/pages/events/AddedItemToCart/v/0.0.1.html +48 -0
  27. package/.next/server/pages/events/AddedItemToCart/v/0.0.1.json +1 -0
  28. package/.next/server/pages/events/AddedItemToCart/v/0.0.2.html +55 -0
  29. package/.next/server/pages/events/AddedItemToCart/v/0.0.2.json +1 -0
  30. package/.next/server/pages/events/AddedItemToCart.html +2 -2
  31. package/.next/server/pages/events/AddedItemToCart.json +1 -1
  32. package/.next/server/pages/events/OrderComplete/logs.html +1 -0
  33. package/.next/server/pages/events/OrderComplete/logs.json +1 -0
  34. package/.next/server/pages/events/OrderComplete.html +2 -2
  35. package/.next/server/pages/events/OrderComplete.json +1 -1
  36. package/.next/server/pages/events/OrderConfirmed/logs.html +1 -0
  37. package/.next/server/pages/events/OrderConfirmed/logs.json +1 -0
  38. package/.next/server/pages/events/OrderConfirmed.html +2 -2
  39. package/.next/server/pages/events/OrderConfirmed.json +1 -1
  40. package/.next/server/pages/events/OrderRequested/logs.html +1 -0
  41. package/.next/server/pages/events/OrderRequested/logs.json +1 -0
  42. package/.next/server/pages/events/OrderRequested.html +2 -2
  43. package/.next/server/pages/events/OrderRequested.json +1 -1
  44. package/.next/server/pages/events/PaymentProcessed/logs.html +1 -0
  45. package/.next/server/pages/events/PaymentProcessed/logs.json +1 -0
  46. package/.next/server/pages/events/PaymentProcessed.html +2 -2
  47. package/.next/server/pages/events/PaymentProcessed.json +1 -1
  48. package/.next/server/pages/events/RemovedItemFromCart/logs.html +1 -0
  49. package/.next/server/pages/events/RemovedItemFromCart/logs.json +1 -0
  50. package/.next/server/pages/events/RemovedItemFromCart.html +2 -2
  51. package/.next/server/pages/events/RemovedItemFromCart.json +1 -1
  52. package/.next/server/pages/events/ShipmentDelivered/logs.html +1 -0
  53. package/.next/server/pages/events/ShipmentDelivered/logs.json +1 -0
  54. package/.next/server/pages/events/ShipmentDelivered.html +2 -2
  55. package/.next/server/pages/events/ShipmentDelivered.json +1 -1
  56. package/.next/server/pages/events/ShipmentDispatched/logs.html +1 -0
  57. package/.next/server/pages/events/ShipmentDispatched/logs.json +1 -0
  58. package/.next/server/pages/events/ShipmentDispatched.html +2 -2
  59. package/.next/server/pages/events/ShipmentDispatched.json +1 -1
  60. package/.next/server/pages/events/ShipmentPrepared/logs.html +1 -0
  61. package/.next/server/pages/events/ShipmentPrepared/logs.json +1 -0
  62. package/.next/server/pages/events/ShipmentPrepared.html +2 -2
  63. package/.next/server/pages/events/ShipmentPrepared.json +1 -1
  64. package/.next/server/pages/events/[name]/logs.js +18 -4
  65. package/.next/server/pages/events/[name]/logs.js.nft.json +1 -1
  66. package/.next/server/pages/events/[name]/v/[version].js +25 -9
  67. package/.next/server/pages/events/[name]/v/[version].js.nft.json +1 -1
  68. package/.next/server/pages/events/[name].js +7 -7
  69. package/.next/server/pages/events/[name].js.nft.json +1 -1
  70. package/.next/server/pages/events.html +10 -0
  71. package/.next/server/pages/events.js +90 -38
  72. package/.next/server/pages/events.js.nft.json +1 -1
  73. package/.next/server/pages/events.json +1 -0
  74. package/.next/server/pages/index.html +1 -1
  75. package/.next/server/pages/overview.html +1 -0
  76. package/.next/server/pages/overview.js +12 -9
  77. package/.next/server/pages/overview.js.nft.json +1 -1
  78. package/.next/server/pages/overview.json +1 -0
  79. package/.next/server/pages/services/Basket Service.html +2 -2
  80. package/.next/server/pages/services/Basket Service.json +1 -1
  81. package/.next/server/pages/services/Data Lake.html +2 -2
  82. package/.next/server/pages/services/Data Lake.json +1 -1
  83. package/.next/server/pages/services/Payment Service.html +2 -2
  84. package/.next/server/pages/services/Payment Service.json +1 -1
  85. package/.next/server/pages/services/Shipping Service.html +2 -2
  86. package/.next/server/pages/services/Shipping Service.json +1 -1
  87. package/.next/server/pages/services/[name].js +5 -5
  88. package/.next/server/pages/services/[name].js.nft.json +1 -1
  89. package/.next/server/pages/services.html +5 -0
  90. package/.next/server/pages/services.js +68 -62
  91. package/.next/server/pages/services.js.nft.json +1 -1
  92. package/.next/server/pages/services.json +1 -0
  93. package/.next/server/pages/users/[id].js +20 -6
  94. package/.next/server/pages/users/[id].js.nft.json +1 -1
  95. package/.next/server/pages/users/dboyne.html +14 -0
  96. package/.next/server/pages/users/dboyne.json +1 -0
  97. package/.next/server/pages/users/mSmith.html +10 -0
  98. package/.next/server/pages/users/mSmith.json +1 -0
  99. package/.next/server/pages-manifest.json +0 -1
  100. package/.next/static/chunks/28-812913d1c0167bab.js +1 -0
  101. package/.next/static/chunks/{336-323c44d05b2ca502.js → 336-8b7da71a40e0c439.js} +1 -1
  102. package/.next/static/chunks/519-7c428c1e49c8e614.js +1 -0
  103. package/.next/static/chunks/873-8db237ddb872ef2b.js +1 -0
  104. package/.next/static/chunks/pages/_app-2b86b0fb5ed8c085.js +1 -0
  105. package/.next/static/chunks/pages/events/[name]/{logs-d159d7b82f44847f.js → logs-707da36de8222a98.js} +1 -1
  106. package/.next/static/chunks/pages/events/[name]/v/{[version]-963d3e8377b51e86.js → [version]-5652060e116d4a61.js} +1 -1
  107. package/.next/static/chunks/pages/events/{[name]-578828157369b5cd.js → [name]-146170e56a404524.js} +1 -1
  108. package/.next/static/chunks/pages/events-2bca09b458bde8ab.js +1 -0
  109. package/.next/static/chunks/pages/index-fe1a9e09c7f51e66.js +1 -0
  110. package/.next/static/chunks/pages/{overview-5ac749891cbe1922.js → overview-6bd5a86d5a28a942.js} +1 -1
  111. package/.next/static/chunks/pages/services/[name]-78378d531eb27bc2.js +1 -0
  112. package/.next/static/chunks/pages/services-1293e4d7df6174bf.js +1 -0
  113. package/.next/static/chunks/pages/users/[id]-5374b99d99fe576e.js +1 -0
  114. package/.next/static/chunks/{webpack-72d301851f531ed1.js → webpack-f27c5bb37992d94f.js} +1 -1
  115. package/.next/static/css/2532bb4d95ad483e.css +3 -0
  116. package/.next/static/xaomrFWnL7ZqGwNJOuVgS/_buildManifest.js +1 -0
  117. package/.next/static/{_xDKoQkSTiqn78cDjL9uS → xaomrFWnL7ZqGwNJOuVgS}/_middlewareManifest.js +0 -0
  118. package/.next/static/xaomrFWnL7ZqGwNJOuVgS/_ssgManifest.js +1 -0
  119. package/.next/trace +37 -37
  120. package/CHANGELOG.md +28 -0
  121. package/README.md +2 -1
  122. package/bin/eventcatalog.js +12 -0
  123. package/components/Grids/EventGrid.tsx +2 -2
  124. package/components/Grids/ServiceGrid.tsx +8 -1
  125. package/components/Header.tsx +4 -1
  126. package/components/NotFound/index.tsx +4 -3
  127. package/components/Sidebars/EventSidebar.tsx +45 -43
  128. package/components/Sidebars/ServiceSidebar.tsx +3 -3
  129. package/lib/events.ts +24 -0
  130. package/lib/graphs.ts +7 -3
  131. package/next.config.js +8 -0
  132. package/out/404.html +1 -0
  133. package/out/_next/data/xaomrFWnL7ZqGwNJOuVgS/events/AddedItemToCart/logs.json +1 -0
  134. package/out/_next/data/xaomrFWnL7ZqGwNJOuVgS/events/AddedItemToCart/v/0.0.1.json +1 -0
  135. package/out/_next/data/xaomrFWnL7ZqGwNJOuVgS/events/AddedItemToCart/v/0.0.2.json +1 -0
  136. package/out/_next/data/xaomrFWnL7ZqGwNJOuVgS/events/AddedItemToCart.json +1 -0
  137. package/out/_next/data/xaomrFWnL7ZqGwNJOuVgS/events/OrderComplete/logs.json +1 -0
  138. package/out/_next/data/xaomrFWnL7ZqGwNJOuVgS/events/OrderComplete.json +1 -0
  139. package/out/_next/data/xaomrFWnL7ZqGwNJOuVgS/events/OrderConfirmed/logs.json +1 -0
  140. package/out/_next/data/xaomrFWnL7ZqGwNJOuVgS/events/OrderConfirmed.json +1 -0
  141. package/out/_next/data/xaomrFWnL7ZqGwNJOuVgS/events/OrderRequested/logs.json +1 -0
  142. package/out/_next/data/xaomrFWnL7ZqGwNJOuVgS/events/OrderRequested.json +1 -0
  143. package/out/_next/data/xaomrFWnL7ZqGwNJOuVgS/events/PaymentProcessed/logs.json +1 -0
  144. package/out/_next/data/xaomrFWnL7ZqGwNJOuVgS/events/PaymentProcessed.json +1 -0
  145. package/out/_next/data/xaomrFWnL7ZqGwNJOuVgS/events/RemovedItemFromCart/logs.json +1 -0
  146. package/out/_next/data/xaomrFWnL7ZqGwNJOuVgS/events/RemovedItemFromCart.json +1 -0
  147. package/out/_next/data/xaomrFWnL7ZqGwNJOuVgS/events/ShipmentDelivered/logs.json +1 -0
  148. package/out/_next/data/xaomrFWnL7ZqGwNJOuVgS/events/ShipmentDelivered.json +1 -0
  149. package/out/_next/data/xaomrFWnL7ZqGwNJOuVgS/events/ShipmentDispatched/logs.json +1 -0
  150. package/out/_next/data/xaomrFWnL7ZqGwNJOuVgS/events/ShipmentDispatched.json +1 -0
  151. package/out/_next/data/xaomrFWnL7ZqGwNJOuVgS/events/ShipmentPrepared/logs.json +1 -0
  152. package/out/_next/data/xaomrFWnL7ZqGwNJOuVgS/events/ShipmentPrepared.json +1 -0
  153. package/out/_next/data/xaomrFWnL7ZqGwNJOuVgS/events.json +1 -0
  154. package/out/_next/data/xaomrFWnL7ZqGwNJOuVgS/overview.json +1 -0
  155. package/out/_next/data/xaomrFWnL7ZqGwNJOuVgS/services/Basket Service.json +1 -0
  156. package/out/_next/data/xaomrFWnL7ZqGwNJOuVgS/services/Data Lake.json +1 -0
  157. package/out/_next/data/xaomrFWnL7ZqGwNJOuVgS/services/Payment Service.json +1 -0
  158. package/out/_next/data/xaomrFWnL7ZqGwNJOuVgS/services/Shipping Service.json +1 -0
  159. package/out/_next/data/xaomrFWnL7ZqGwNJOuVgS/services.json +1 -0
  160. package/out/_next/data/xaomrFWnL7ZqGwNJOuVgS/users/dboyne.json +1 -0
  161. package/out/_next/data/xaomrFWnL7ZqGwNJOuVgS/users/mSmith.json +1 -0
  162. package/out/_next/static/chunks/020d8314.aea2d24215754e7b.js +1 -0
  163. package/out/_next/static/chunks/176cb4e4-8a0f6f010ef8accb.js +1 -0
  164. package/out/_next/static/chunks/274-11c4d093341d7201.js +1 -0
  165. package/out/_next/static/chunks/28-812913d1c0167bab.js +1 -0
  166. package/out/_next/static/chunks/336-8b7da71a40e0c439.js +1 -0
  167. package/out/_next/static/chunks/364-3cb3c8cf1d3c95de.js +1 -0
  168. package/out/_next/static/chunks/519-7c428c1e49c8e614.js +1 -0
  169. package/out/_next/static/chunks/638.d570519ae49c92c8.js +1 -0
  170. package/out/_next/static/chunks/873-8db237ddb872ef2b.js +1 -0
  171. package/out/_next/static/chunks/962-d5070461f6d4a478.js +1 -0
  172. package/out/_next/static/chunks/framework-576ec6a1c1386453.js +1 -0
  173. package/out/_next/static/chunks/main-0289ecbd51cd4cb4.js +1 -0
  174. package/out/_next/static/chunks/pages/_app-2b86b0fb5ed8c085.js +1 -0
  175. package/out/_next/static/chunks/pages/_error-5a714c45c50a8db4.js +1 -0
  176. package/out/_next/static/chunks/pages/events/[name]/logs-707da36de8222a98.js +1 -0
  177. package/out/_next/static/chunks/pages/events/[name]/v/[version]-5652060e116d4a61.js +1 -0
  178. package/out/_next/static/chunks/pages/events/[name]-146170e56a404524.js +1 -0
  179. package/out/_next/static/chunks/pages/events-2bca09b458bde8ab.js +1 -0
  180. package/out/_next/static/chunks/pages/index-fe1a9e09c7f51e66.js +1 -0
  181. package/out/_next/static/chunks/pages/overview-6bd5a86d5a28a942.js +1 -0
  182. package/out/_next/static/chunks/pages/services/[name]-78378d531eb27bc2.js +1 -0
  183. package/out/_next/static/chunks/pages/services-1293e4d7df6174bf.js +1 -0
  184. package/out/_next/static/chunks/pages/users/[id]-5374b99d99fe576e.js +1 -0
  185. package/out/_next/static/chunks/polyfills-5cd94c89d3acac5f.js +1 -0
  186. package/out/_next/static/chunks/webpack-f27c5bb37992d94f.js +1 -0
  187. package/out/_next/static/css/2532bb4d95ad483e.css +3 -0
  188. package/out/_next/static/css/5eeed9cb243ce668.css +1 -0
  189. package/out/_next/static/xaomrFWnL7ZqGwNJOuVgS/_buildManifest.js +1 -0
  190. package/out/_next/static/xaomrFWnL7ZqGwNJOuVgS/_middlewareManifest.js +1 -0
  191. package/out/_next/static/xaomrFWnL7ZqGwNJOuVgS/_ssgManifest.js +1 -0
  192. package/out/events/AddedItemToCart/logs.html +1 -0
  193. package/out/events/AddedItemToCart/v/0.0.1.html +48 -0
  194. package/out/events/AddedItemToCart/v/0.0.2.html +55 -0
  195. package/out/events/AddedItemToCart.html +73 -0
  196. package/out/events/OrderComplete/logs.html +1 -0
  197. package/out/events/OrderComplete.html +48 -0
  198. package/out/events/OrderConfirmed/logs.html +1 -0
  199. package/out/events/OrderConfirmed.html +48 -0
  200. package/out/events/OrderRequested/logs.html +1 -0
  201. package/out/events/OrderRequested.html +48 -0
  202. package/out/events/PaymentProcessed/logs.html +1 -0
  203. package/out/events/PaymentProcessed.html +52 -0
  204. package/out/events/RemovedItemFromCart/logs.html +1 -0
  205. package/out/events/RemovedItemFromCart.html +55 -0
  206. package/out/events/ShipmentDelivered/logs.html +1 -0
  207. package/out/events/ShipmentDelivered.html +53 -0
  208. package/out/events/ShipmentDispatched/logs.html +1 -0
  209. package/out/events/ShipmentDispatched.html +52 -0
  210. package/out/events/ShipmentPrepared/logs.html +1 -0
  211. package/out/events/ShipmentPrepared.html +52 -0
  212. package/out/events.html +10 -0
  213. package/out/favicon.ico +0 -0
  214. package/out/index.html +1 -0
  215. package/out/logo-random.svg +114 -0
  216. package/out/logo.svg +44 -0
  217. package/out/opengraph.png +0 -0
  218. package/out/overview.html +1 -0
  219. package/out/services/Basket Service.html +11 -0
  220. package/out/services/Data Lake.html +12 -0
  221. package/out/services/Payment Service.html +10 -0
  222. package/out/services/Shipping Service.html +14 -0
  223. package/out/services.html +5 -0
  224. package/out/users/dboyne.html +14 -0
  225. package/out/users/mSmith.html +10 -0
  226. package/package.json +4 -3
  227. package/pages/events/[name]/logs.tsx +12 -3
  228. package/pages/events/[name]/v/[version].tsx +14 -2
  229. package/pages/events/[name].tsx +2 -2
  230. package/pages/events.tsx +75 -31
  231. package/pages/index.tsx +4 -2
  232. package/pages/overview.tsx +8 -5
  233. package/pages/services/[name].tsx +1 -1
  234. package/pages/services.tsx +28 -15
  235. package/pages/users/[id].tsx +14 -3
  236. package/scripts/move-schemas-for-download.js +59 -0
  237. package/.next/server/chunks/596.js +0 -98
  238. package/.next/server/pages/api/event/[name]/download.js +0 -64
  239. package/.next/server/pages/api/event/[name]/download.js.nft.json +0 -1
  240. package/.next/server/webpack-api-runtime.js +0 -160
  241. package/.next/static/_xDKoQkSTiqn78cDjL9uS/_buildManifest.js +0 -1
  242. package/.next/static/_xDKoQkSTiqn78cDjL9uS/_ssgManifest.js +0 -1
  243. package/.next/static/chunks/519-7f22292093abd7c3.js +0 -1
  244. package/.next/static/chunks/873-31046e43f178cc08.js +0 -1
  245. package/.next/static/chunks/954-4d4a09c3269dda3f.js +0 -1
  246. package/.next/static/chunks/pages/_app-1adc361d4508683f.js +0 -1
  247. package/.next/static/chunks/pages/events-a38d51b4dd9dd7cf.js +0 -1
  248. package/.next/static/chunks/pages/index-3eeab7e4014a02ea.js +0 -1
  249. package/.next/static/chunks/pages/services/[name]-881a79d880506d8a.js +0 -1
  250. package/.next/static/chunks/pages/services-bcc61898062e1bf4.js +0 -1
  251. package/.next/static/chunks/pages/users/[id]-a2fec953b3532a74.js +0 -1
  252. package/.next/static/css/de0d3fef7340ebfc.css +0 -3
  253. package/pages/api/event/[name]/download.js +0 -28
package/pages/events.tsx CHANGED
@@ -1,11 +1,10 @@
1
- import { Fragment, useState } from 'react';
1
+ import { Fragment, useState, useCallback, useEffect } from 'react';
2
2
  import Head from 'next/head';
3
3
  import type { Event, Service } from '@eventcatalog/types';
4
-
5
- import Link from 'next/link';
4
+ import debounce from 'lodash.debounce';
6
5
 
7
6
  import { Menu, Transition } from '@headlessui/react';
8
- import { ChevronDownIcon } from '@heroicons/react/solid';
7
+ import { ChevronDownIcon, SearchIcon } from '@heroicons/react/solid';
9
8
  import EventGrid from '@/components/Grids/EventGrid';
10
9
  import { getAllEvents, getUniqueServicesNamesFromEvents } from '@/lib/events';
11
10
 
@@ -20,7 +19,7 @@ const sortOptions = [
20
19
  ];
21
20
 
22
21
  export interface PageProps {
23
- events: [Event];
22
+ events: Event[];
24
23
  services: [Service];
25
24
  }
26
25
 
@@ -28,7 +27,7 @@ export default function Page({ events, services }: PageProps) {
28
27
  const filters = [
29
28
  {
30
29
  id: 'services',
31
- name: 'Services',
30
+ name: `Filter by Services (${services.length})`,
32
31
  options: services.map((service) => ({
33
32
  value: service,
34
33
  label: service,
@@ -39,6 +38,8 @@ export default function Page({ events, services }: PageProps) {
39
38
 
40
39
  const [selectedFilters, setSelectedFilters] = useState({ services: [] });
41
40
  const [showMermaidDiagrams, setShowMermaidDiagrams] = useState(false);
41
+ const [eventsToRender, setEventsToRender] = useState(events);
42
+ const [searchFilter, setSearchFilter] = useState('');
42
43
 
43
44
  const handleFilterSelection = (option, type, event) => {
44
45
  if (event.target.checked) {
@@ -50,19 +51,44 @@ export default function Page({ events, services }: PageProps) {
50
51
  }
51
52
  };
52
53
 
53
- let eventsToRender = events;
54
+ const getFilteredEvents = (): any => {
55
+ if (!selectedFilters.services && !searchFilter) return events;
56
+
57
+ let filteredEvents = events;
58
+
59
+ if (selectedFilters.services.length > 0) {
60
+ // @ts-ignore
61
+ filteredEvents = filteredEvents.filter((event) => {
62
+ const { services: serviceFilters } = selectedFilters;
63
+
64
+ const hasConsumersFromFilters = event.consumers.some((consumerId) => serviceFilters.indexOf(consumerId) > -1);
65
+ const hasProducersFromFilters = event.producers.some((producerId) => serviceFilters.indexOf(producerId) > -1);
54
66
 
55
- if (selectedFilters.services.length > 0) {
56
- // @ts-ignore
57
- eventsToRender = eventsToRender.filter((event) => {
58
- const { services: serviceFilters } = selectedFilters;
67
+ return hasConsumersFromFilters || hasProducersFromFilters;
68
+ });
69
+ }
59
70
 
60
- const hasConsumersFromFilters = event.consumers.some((consumerId) => serviceFilters.indexOf(consumerId) > -1);
61
- const hasProducersFromFilters = event.producers.some((producerId) => serviceFilters.indexOf(producerId) > -1);
71
+ if (searchFilter) {
72
+ filteredEvents = filteredEvents.filter((event) => event.name.toLowerCase().includes(searchFilter.toLowerCase()));
73
+ }
62
74
 
63
- return hasConsumersFromFilters || hasProducersFromFilters;
64
- });
65
- }
75
+ return filteredEvents;
76
+ };
77
+
78
+ useEffect(() => {
79
+ setEventsToRender(getFilteredEvents());
80
+ // eslint-disable-next-line react-hooks/exhaustive-deps
81
+ }, [selectedFilters, searchFilter]);
82
+
83
+ // eslint-disable-next-line react-hooks/exhaustive-deps
84
+ const debouncedFilter = useCallback(
85
+ debounce((e) => {
86
+ setSearchFilter(e.target.value);
87
+ }, 500),
88
+ [eventsToRender]
89
+ );
90
+
91
+ const filtersApplied = !!searchFilter || selectedFilters.services.length > 0;
66
92
 
67
93
  return (
68
94
  <>
@@ -123,22 +149,28 @@ export default function Page({ events, services }: PageProps) {
123
149
  <div className="grid grid-cols-4 gap-x-8 gap-y-10">
124
150
  {/* Filters */}
125
151
  <form className="hidden lg:block">
126
- <span className="text-sm font-bold text-gray-900 mb-4 block">Events</span>
127
- <ul className=" text-sm text-gray-600 space-y-4 pb-6 border-b border-gray-200 items-stretch">
128
- {events.map((event) => (
129
- <li key={event.name}>
130
- <Link href={`/events/${event.name}`}>
131
- <a>{event.name}</a>
132
- </Link>
133
- </li>
134
- ))}
135
- </ul>
136
-
152
+ <div className="border-b border-gray-200 pb-6">
153
+ <label htmlFor="event" className="font-bold block text-sm font-medium text-gray-700">
154
+ Search Events
155
+ </label>
156
+ <div className="mt-1 relative rounded-md shadow-sm">
157
+ <div className="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none">
158
+ <SearchIcon className="h-5 w-5 text-gray-400" aria-hidden="true" />
159
+ </div>
160
+ <input
161
+ type="text"
162
+ name="event"
163
+ id="event"
164
+ onChange={debouncedFilter}
165
+ className="focus:ring-gray-500 focus:border-gray-500 block w-full pl-10 sm:text-sm border-gray-300 rounded-md"
166
+ />
167
+ </div>
168
+ </div>
137
169
  {filters.map((section: any) => (
138
170
  <div key={section.id} className="border-b border-gray-200 py-6">
139
171
  <h3 className="-my-3 flow-root">
140
172
  <div className="py-3 bg-white w-full flex items-center justify-between text-sm text-gray-400 hover:text-gray-500">
141
- <span className="font-medium text-gray-900">{section.name}</span>
173
+ <span className="font-bold font-medium text-gray-900">{section.name}</span>
142
174
  </div>
143
175
  </h3>
144
176
  <div className="pt-6">
@@ -167,7 +199,7 @@ export default function Page({ events, services }: PageProps) {
167
199
  <div className="border-b border-gray-200 py-6">
168
200
  <h3 className="-my-3 flow-root">
169
201
  <div className="py-3 bg-white w-full flex items-center justify-between text-sm text-gray-400 hover:text-gray-500">
170
- <span className="font-medium text-gray-900">Features</span>
202
+ <span className="font-bold font-medium text-gray-900">Features</span>
171
203
  </div>
172
204
  </h3>
173
205
  <div className="pt-6">
@@ -191,8 +223,20 @@ export default function Page({ events, services }: PageProps) {
191
223
 
192
224
  <div className="col-span-4 lg:col-span-3">
193
225
  <div>
194
- <h2 className="text-gray-500 text-xs font-medium uppercase tracking-wide">Events ({eventsToRender.length})</h2>
226
+ <h2 className="text-gray-500 text-xs font-medium uppercase tracking-wide">
227
+ {filtersApplied
228
+ ? `Filtered Events (${eventsToRender.length}/${events.length})`
229
+ : `All Events (${events.length})`}
230
+ </h2>
195
231
  <EventGrid events={eventsToRender} showMermaidDiagrams={showMermaidDiagrams} />
232
+ {eventsToRender.length === 0 && (
233
+ <div className="text-gray-400 flex h-96 justify-center items-center">
234
+ <div>
235
+ <SearchIcon className="w-6 h-6 inline-block mr-1" />
236
+ No events found.
237
+ </div>
238
+ </div>
239
+ )}
196
240
  </div>
197
241
  </div>
198
242
  </div>
@@ -202,7 +246,7 @@ export default function Page({ events, services }: PageProps) {
202
246
  );
203
247
  }
204
248
 
205
- export const getServerSideProps = () => {
249
+ export const getStaticProps = () => {
206
250
  const events = getAllEvents();
207
251
  const services = getUniqueServicesNamesFromEvents(events);
208
252
 
package/pages/index.tsx CHANGED
@@ -1,17 +1,19 @@
1
1
  /* This example requires Tailwind CSS v2.0+ */
2
2
 
3
3
  import Link from 'next/link';
4
+ import getConfig from 'next/config';
4
5
  import { useConfig } from '@/hooks/EventCatalog';
5
6
 
6
7
  export default function Example() {
7
8
  const { title, tagline, logo } = useConfig();
8
9
 
9
- const logoToLoad = logo || { alt: 'EventCatalog Logo', src: '/logo.svg' };
10
+ const { publicRuntimeConfig: { basePath = '' } = {} } = getConfig();
11
+ const logoToLoad = logo || { alt: 'EventCatalog Logo', src: `logo.svg` };
10
12
 
11
13
  return (
12
14
  <main className="sm:bg-top md:min-h-screen bg-gradient-to-t from-blue-700 to-gray-800">
13
15
  <div className="max-w-7xl mx-auto px-4 py-16 text-center sm:px-6 sm:py-24 lg:px-8 lg:py-48">
14
- <img src={logoToLoad.src} alt={logoToLoad.alt} style={{ height: '85px' }} className="mx-auto" />
16
+ <img src={`${basePath}/${logoToLoad.src}`} alt={logoToLoad.alt} style={{ height: '85px' }} className="mx-auto" />
15
17
  <h1 className="mt-2 text-4xl font-extrabold text-white tracking-tight sm:text-5xl">{title}</h1>
16
18
  {tagline && <p className="mt-2 text-lg font-medium text-white">{tagline}</p>}
17
19
  <div className="mt-5 max-w-md mx-auto sm:flex sm:justify-center md:mt-8">
@@ -12,15 +12,18 @@ function NodeElement({ node: { id } }: { node: { id: string } }) {
12
12
  return <div className={`text-sm text-center p-1 rounded-md `}>{id}</div>;
13
13
  }
14
14
 
15
+ const MAX_LENGTH_FOR_NODES = 30;
16
+ const truncateNode = (value) => (value.length > MAX_LENGTH_FOR_NODES ? `${value.substring(0, MAX_LENGTH_FOR_NODES)}...` : value);
17
+
15
18
  const graph = ({ events, services }) => {
16
- const eventNodes = events.map(({ name: event }) => ({ id: event, group: 1, type: 'event' }));
17
- const serviceNodes = services.map((service) => ({ id: service, group: 2, type: 'service' }));
19
+ const eventNodes = events.map(({ name: event }) => ({ id: truncateNode(event), group: 1, type: 'event' }));
20
+ const serviceNodes = services.map((service) => ({ id: truncateNode(service), group: 2, type: 'service' }));
18
21
 
19
22
  // Create all links
20
23
  const links = events.reduce((nodes, event) => {
21
24
  const { consumers = [], producers = [], name } = event;
22
- const consumerNodes = consumers.map((consumer) => ({ source: name, target: consumer }));
23
- const producerNodes = producers.map((producer) => ({ source: producer, target: name }));
25
+ const consumerNodes = consumers.map((consumer) => ({ source: truncateNode(name), target: truncateNode(consumer) }));
26
+ const producerNodes = producers.map((producer) => ({ source: truncateNode(producer), target: truncateNode(name) }));
24
27
  return nodes.concat(consumerNodes).concat(producerNodes);
25
28
  }, []);
26
29
 
@@ -63,7 +66,7 @@ const graph = ({ events, services }) => {
63
66
 
64
67
  export default graph;
65
68
 
66
- export const getServerSideProps = () => {
69
+ export const getStaticProps = () => {
67
70
  const events = getAllEvents();
68
71
  const services = getUniqueServicesNamesFromEvents(events);
69
72
 
@@ -101,6 +101,6 @@ export async function getStaticPaths() {
101
101
  const paths = services.map((service) => ({ params: { name: service.name } }));
102
102
  return {
103
103
  paths,
104
- fallback: 'blocking',
104
+ fallback: false,
105
105
  };
106
106
  }
@@ -1,9 +1,7 @@
1
- import { Fragment } from 'react';
1
+ import { Fragment, useState } from 'react';
2
2
  import Head from 'next/head';
3
3
  import { Service } from '@eventcatalog/types';
4
4
 
5
- import Link from 'next/link';
6
-
7
5
  import { Menu, Transition } from '@headlessui/react';
8
6
  import { ChevronDownIcon } from '@heroicons/react/solid';
9
7
  import ServiceGrid from '@/components/Grids/ServiceGrid';
@@ -24,6 +22,8 @@ export interface PageProps {
24
22
  }
25
23
 
26
24
  export default function Page({ services }: PageProps) {
25
+ const [showMermaidDiagrams, setShowMermaidDiagrams] = useState(false);
26
+
27
27
  return (
28
28
  <>
29
29
  <Head>
@@ -83,22 +83,35 @@ export default function Page({ services }: PageProps) {
83
83
  <div className="grid grid-cols-4 gap-x-8 gap-y-10">
84
84
  {/* Filters */}
85
85
  <form className="hidden lg:block">
86
- <span className="text-sm font-bold text-gray-900 mb-4 block">Services</span>
87
- <ul className=" text-sm font-medium text-gray-900 space-y-4 pb-6 border-b border-gray-200 items-stretch">
88
- {services.map((service) => (
89
- <li key={service.name}>
90
- <Link href={`/services/${service.name}`}>
91
- <a>{service.name}</a>
92
- </Link>
93
- </li>
94
- ))}
95
- </ul>
86
+ <div className="border-b border-gray-200 pb-6">
87
+ <h3 className="-my-3 flow-root">
88
+ <div className="py-3 bg-white w-full flex items-center justify-between text-sm text-gray-400 hover:text-gray-500">
89
+ <span className="font-medium text-gray-900">Features</span>
90
+ </div>
91
+ </h3>
92
+ <div className="pt-6">
93
+ <div className="space-y-4">
94
+ <div className="flex items-center">
95
+ <input
96
+ id="show-mermaid"
97
+ type="checkbox"
98
+ onChange={(e) => setShowMermaidDiagrams(e.target.checked)}
99
+ defaultChecked={showMermaidDiagrams}
100
+ className="h-4 w-4 border-gray-300 rounded text-gray-600 focus:ring-gray-500"
101
+ />
102
+ <label htmlFor="show-mermaid" className="ml-3 text-sm text-gray-600">
103
+ Show Mermaid Diagrams
104
+ </label>
105
+ </div>
106
+ </div>
107
+ </div>
108
+ </div>
96
109
  </form>
97
110
 
98
111
  <div className="col-span-4 lg:col-span-3">
99
112
  <div>
100
113
  <h2 className="text-gray-500 text-xs font-medium uppercase tracking-wide">Services</h2>
101
- <ServiceGrid services={services} />
114
+ <ServiceGrid services={services} showMermaidDiagrams={showMermaidDiagrams} />
102
115
  </div>
103
116
  </div>
104
117
  </div>
@@ -108,7 +121,7 @@ export default function Page({ services }: PageProps) {
108
121
  );
109
122
  }
110
123
 
111
- export async function getServerSideProps() {
124
+ export async function getStaticProps() {
112
125
  const services = getAllServices();
113
126
 
114
127
  return {
@@ -1,7 +1,7 @@
1
1
  import { Event, Service } from '@eventcatalog/types';
2
2
  import EventGrid from '@/components/Grids/EventGrid';
3
3
  import ServiceGrid from '@/components/Grids/ServiceGrid';
4
- import { getAllEventsByOwnerId } from '@/lib/events';
4
+ import { getAllEventsByOwnerId, getAllOwners } from '@/lib/events';
5
5
  import { getAllServicesByOwnerId } from '@/lib/services';
6
6
 
7
7
  import { useUser } from '@/hooks/EventCatalog';
@@ -59,8 +59,8 @@ export default function UserPage({ events, services, userId }: UserPageProps) {
59
59
  );
60
60
  }
61
61
 
62
- export const getServerSideProps = async (req) => {
63
- const { id: userId } = req.query;
62
+ export const getStaticProps = async ({ params }) => {
63
+ const { id: userId } = params;
64
64
  const userEvents = await getAllEventsByOwnerId(userId);
65
65
  const services = await getAllServicesByOwnerId(userId);
66
66
 
@@ -72,3 +72,14 @@ export const getServerSideProps = async (req) => {
72
72
  },
73
73
  };
74
74
  };
75
+
76
+ export async function getStaticPaths() {
77
+ const owners = getAllOwners();
78
+
79
+ const paths = owners.map((owner) => ({ params: { id: owner } }));
80
+
81
+ return {
82
+ paths,
83
+ fallback: false,
84
+ };
85
+ }
@@ -0,0 +1,59 @@
1
+ const path = require('path');
2
+ const fs = require('fs');
3
+
4
+ const getAllEventsAndSchemaPaths = (directory) => {
5
+ const folders = fs.readdirSync(directory);
6
+ return folders.map((folder) => {
7
+ const allFilesInEventFolder = fs.readdirSync(path.join(directory, folder));
8
+ const schemaFileName = allFilesInEventFolder.find((fileName) => fileName.includes('schema'));
9
+ const eventHasVersions = !!allFilesInEventFolder.find((fileName) => fileName.includes('versioned'));
10
+ let versions = [];
11
+
12
+ if (eventHasVersions) {
13
+ versions = getAllEventsAndSchemaPaths(path.join(directory, folder, 'versioned'));
14
+ }
15
+
16
+ return {
17
+ name: folder,
18
+ schemaFileName,
19
+ schemaContent: schemaFileName ? fs.readFileSync(path.join(directory, folder, schemaFileName), 'utf-8') : null,
20
+ versions,
21
+ };
22
+ });
23
+ };
24
+
25
+ const main = async () => {
26
+ const publicDir = path.join(__dirname, '../public');
27
+ const publicSchemaDir = path.join(publicDir, 'schemas');
28
+
29
+ if (fs.existsSync(publicSchemaDir)) {
30
+ fs.rmSync(publicSchemaDir, { recursive: true, force: true });
31
+ }
32
+ fs.mkdirSync(publicSchemaDir);
33
+
34
+ const eventsWithSchemaPaths = getAllEventsAndSchemaPaths(path.join(process.env.PROJECT_DIR, 'events'));
35
+ const eventsWithSchemas = eventsWithSchemaPaths.filter((event) => !!event.schemaContent);
36
+
37
+ eventsWithSchemas.forEach((event) => {
38
+ const eventDir = path.join(publicSchemaDir, event.name);
39
+
40
+ if (!fs.existsSync(eventDir)) {
41
+ fs.mkdirSync(eventDir);
42
+ }
43
+
44
+ const eventVersions = event.versions;
45
+ const versionsWithSchemas = eventVersions.filter((version) => !!version.schemaContent);
46
+
47
+ versionsWithSchemas.forEach((version) => {
48
+ const versionDir = path.join(eventDir, version.name);
49
+ if (!fs.existsSync(versionDir)) {
50
+ fs.mkdirSync(versionDir);
51
+ }
52
+ fs.writeFileSync(path.join(versionDir, version.schemaFileName), version.schemaContent);
53
+ });
54
+
55
+ fs.writeFileSync(path.join(eventDir, event.schemaFileName), event.schemaContent);
56
+ });
57
+ };
58
+
59
+ main();
@@ -1,98 +0,0 @@
1
- "use strict";
2
- exports.id = 596;
3
- exports.ids = [596];
4
- exports.modules = {
5
-
6
- /***/ 9596:
7
- /***/ ((module, __webpack_exports__, __webpack_require__) => {
8
-
9
- __webpack_require__.a(module, async (__webpack_handle_async_dependencies__) => {
10
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
11
- /* harmony export */ "UV": () => (/* binding */ getAllServices),
12
- /* harmony export */ "vY": () => (/* binding */ getAllServicesByOwnerId),
13
- /* harmony export */ "in": () => (/* binding */ getServiceByName)
14
- /* harmony export */ });
15
- /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(7147);
16
- /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_0__);
17
- /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1017);
18
- /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_1__);
19
- /* harmony import */ var next_mdx_remote_serialize__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(7112);
20
- /* harmony import */ var next_mdx_remote_serialize__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(next_mdx_remote_serialize__WEBPACK_IMPORTED_MODULE_2__);
21
- /* harmony import */ var _lib_file_reader__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(2432);
22
- /* harmony import */ var _lib_events__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(9959);
23
- var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([_lib_events__WEBPACK_IMPORTED_MODULE_4__]);
24
- _lib_events__WEBPACK_IMPORTED_MODULE_4__ = (__webpack_async_dependencies__.then ? await __webpack_async_dependencies__ : __webpack_async_dependencies__)[0];
25
-
26
-
27
-
28
-
29
-
30
- const buildService = (eventFrontMatter)=>{
31
- const { name , summary , owners =[] , repository ={
32
- } , tags =[] , externalLinks =[] } = eventFrontMatter;
33
- return {
34
- name,
35
- summary,
36
- owners,
37
- repository,
38
- tags,
39
- externalLinks
40
- };
41
- };
42
- const getAllServices = ()=>{
43
- const servicesDir = path__WEBPACK_IMPORTED_MODULE_1___default().join(process.env.PROJECT_DIR, 'services');
44
- const folders = fs__WEBPACK_IMPORTED_MODULE_0___default().readdirSync(servicesDir);
45
- const services = folders.map((folder)=>(0,_lib_file_reader__WEBPACK_IMPORTED_MODULE_3__/* .readMarkdownFile */ .ws)(path__WEBPACK_IMPORTED_MODULE_1___default().join(servicesDir, folder, 'index.md'))
46
- );
47
- const events = (0,_lib_events__WEBPACK_IMPORTED_MODULE_4__/* .getAllEvents */ .IP)();
48
- const parsedServices = services.map((frontMatter)=>buildService(frontMatter.data)
49
- );
50
- // @ts-ignore
51
- return parsedServices.map((service)=>({
52
- ...service,
53
- ...(0,_lib_events__WEBPACK_IMPORTED_MODULE_4__/* .getAllEventsThatHaveRelationshipWithService */ .X4)(service, events)
54
- })
55
- );
56
- };
57
- const getAllServicesByOwnerId = async (ownerId)=>{
58
- const services = await getAllServices();
59
- const servicesOwnedByUser = services.filter((service)=>service.owners.some((id)=>id === ownerId
60
- )
61
- );
62
- return servicesOwnedByUser.map((service)=>({
63
- ...service
64
- })
65
- );
66
- };
67
- const getServiceByName = async (serviceName)=>{
68
- try {
69
- const servicesDir = path__WEBPACK_IMPORTED_MODULE_1___default().join(process.env.PROJECT_DIR, 'services');
70
- const serviceDirectory = path__WEBPACK_IMPORTED_MODULE_1___default().join(servicesDir, serviceName);
71
- const { data , content } = (0,_lib_file_reader__WEBPACK_IMPORTED_MODULE_3__/* .readMarkdownFile */ .ws)(path__WEBPACK_IMPORTED_MODULE_1___default().join(serviceDirectory, `index.md`));
72
- const service = buildService(data);
73
- const events = (0,_lib_events__WEBPACK_IMPORTED_MODULE_4__/* .getAllEvents */ .IP)();
74
- const mdxSource = await (0,next_mdx_remote_serialize__WEBPACK_IMPORTED_MODULE_2__.serialize)(content);
75
- return {
76
- // @ts-ignore
77
- service: {
78
- ...service,
79
- ...(0,_lib_events__WEBPACK_IMPORTED_MODULE_4__/* .getAllEventsThatHaveRelationshipWithService */ .X4)(service, events)
80
- },
81
- markdown: {
82
- content,
83
- lastModifiedDate: (0,_lib_file_reader__WEBPACK_IMPORTED_MODULE_3__/* .getLastModifiedDateOfFile */ .cn)(path__WEBPACK_IMPORTED_MODULE_1___default().join(serviceDirectory, `index.md`)),
84
- source: mdxSource
85
- }
86
- };
87
- } catch (error) {
88
- console.log('Failed to get service by name', serviceName);
89
- return Promise.reject();
90
- }
91
- };
92
-
93
- });
94
-
95
- /***/ })
96
-
97
- };
98
- ;
@@ -1,64 +0,0 @@
1
- "use strict";
2
- (() => {
3
- var exports = {};
4
- exports.id = 148;
5
- exports.ids = [148];
6
- exports.modules = {
7
-
8
- /***/ 2374:
9
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
10
-
11
- // ESM COMPAT FLAG
12
- __webpack_require__.r(__webpack_exports__);
13
-
14
- // EXPORTS
15
- __webpack_require__.d(__webpack_exports__, {
16
- "default": () => (/* binding */ download)
17
- });
18
-
19
- ;// CONCATENATED MODULE: external "fs"
20
- const external_fs_namespaceObject = require("fs");
21
- var external_fs_default = /*#__PURE__*/__webpack_require__.n(external_fs_namespaceObject);
22
- ;// CONCATENATED MODULE: external "path"
23
- const external_path_namespaceObject = require("path");
24
- var external_path_default = /*#__PURE__*/__webpack_require__.n(external_path_namespaceObject);
25
- ;// CONCATENATED MODULE: ./pages/api/event/[name]/download.js
26
-
27
-
28
- // eslint-disable-next-line func-names
29
- /* harmony default export */ function download(req, res) {
30
- const { name: eventName } = req.query;
31
- const eventDir = external_path_default().join(process.env.PROJECT_DIR, 'events', eventName);
32
- try {
33
- const filesInEventDir = external_fs_default().readdirSync(eventDir);
34
- const schemaFileName = filesInEventDir.find((fileName)=>fileName.indexOf('schema.') > -1
35
- );
36
- if (schemaFileName) {
37
- const extension = schemaFileName.split('.').pop();
38
- const schemaFile = external_fs_default().readFileSync(external_path_default().join(eventDir, schemaFileName));
39
- res.send({
40
- schema: schemaFile.toString(),
41
- fileName: `${eventName}.${extension}`
42
- });
43
- }
44
- res.status(404).end();
45
- } catch (error) {
46
- console.log(error);
47
- res.status(404).end();
48
- }
49
- };
50
-
51
-
52
- /***/ })
53
-
54
- };
55
- ;
56
-
57
- // load runtime
58
- var __webpack_require__ = require("../../../../webpack-api-runtime.js");
59
- __webpack_require__.C(exports);
60
- var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId))
61
- var __webpack_exports__ = (__webpack_exec__(2374));
62
- module.exports = __webpack_exports__;
63
-
64
- })();
@@ -1 +0,0 @@
1
- {"version":1,"files":["../../../../webpack-api-runtime.js","../../../../../../package.json","../../../../../../package.json"]}