@eventcatalog/core 0.0.10 → 0.0.14

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 (101) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +31 -30
  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/526.js +1 -1
  15. package/.next/server/chunks/565.js +17 -5
  16. package/.next/server/chunks/730.js +8 -13
  17. package/.next/server/chunks/938.js +18 -4
  18. package/.next/server/chunks/944.js +31 -32
  19. package/.next/server/pages/404.html +1 -1
  20. package/.next/server/pages/500.html +1 -1
  21. package/.next/server/pages/_app.js +4 -0
  22. package/.next/server/pages/events/AddedItemToCart.html +5 -5
  23. package/.next/server/pages/events/AddedItemToCart.json +1 -1
  24. package/.next/server/pages/events/OrderComplete.html +3 -3
  25. package/.next/server/pages/events/OrderComplete.json +1 -1
  26. package/.next/server/pages/events/OrderConfirmed.html +3 -3
  27. package/.next/server/pages/events/OrderConfirmed.json +1 -1
  28. package/.next/server/pages/events/OrderRequested.html +3 -3
  29. package/.next/server/pages/events/OrderRequested.json +1 -1
  30. package/.next/server/pages/events/PaymentProcessed.html +3 -3
  31. package/.next/server/pages/events/PaymentProcessed.json +1 -1
  32. package/.next/server/pages/events/RemovedItemFromCart.html +3 -3
  33. package/.next/server/pages/events/RemovedItemFromCart.json +1 -1
  34. package/.next/server/pages/events/ShipmentDelivered.html +3 -3
  35. package/.next/server/pages/events/ShipmentDelivered.json +1 -1
  36. package/.next/server/pages/events/ShipmentDispatched.html +3 -3
  37. package/.next/server/pages/events/ShipmentDispatched.json +1 -1
  38. package/.next/server/pages/events/ShipmentPrepared.html +3 -3
  39. package/.next/server/pages/events/ShipmentPrepared.json +1 -1
  40. package/.next/server/pages/events/[name]/v/[version].js +1 -8
  41. package/.next/server/pages/events/[name]/v/[version].js.nft.json +1 -1
  42. package/.next/server/pages/events/[name].js +1 -8
  43. package/.next/server/pages/events/[name].js.nft.json +1 -1
  44. package/.next/server/pages/events.js +19 -37
  45. package/.next/server/pages/index.html +1 -1
  46. package/.next/server/pages/overview.js +9 -6
  47. package/.next/server/pages/services/Basket Service.html +2 -2
  48. package/.next/server/pages/services/Basket Service.json +1 -1
  49. package/.next/server/pages/services/Data Lake.html +2 -2
  50. package/.next/server/pages/services/Data Lake.json +1 -1
  51. package/.next/server/pages/services/Payment Service.html +2 -2
  52. package/.next/server/pages/services/Payment Service.json +1 -1
  53. package/.next/server/pages/services/Shipping Service.html +2 -2
  54. package/.next/server/pages/services/Shipping Service.json +1 -1
  55. package/.next/server/pages/services/[name].js +31 -39
  56. package/.next/server/pages/services/[name].js.nft.json +1 -1
  57. package/.next/server/pages/services.js +66 -60
  58. package/.next/server/pages/services.js.nft.json +1 -1
  59. package/.next/server/pages/users/[id].js +3 -3
  60. package/.next/server/pages/users/[id].js.nft.json +1 -1
  61. package/.next/static/DTt5tyVKdntQwbNsYqVj8/_buildManifest.js +1 -0
  62. package/.next/static/{yc3MsaLWgBvovlJpHpfqc → DTt5tyVKdntQwbNsYqVj8}/_middlewareManifest.js +0 -0
  63. package/.next/static/{yc3MsaLWgBvovlJpHpfqc → DTt5tyVKdntQwbNsYqVj8}/_ssgManifest.js +0 -0
  64. package/.next/static/chunks/336-8b7da71a40e0c439.js +1 -0
  65. package/.next/static/chunks/873-31046e43f178cc08.js +1 -0
  66. package/.next/static/chunks/954-4d4a09c3269dda3f.js +1 -0
  67. package/.next/static/chunks/pages/{_app-c9d3172cc09cf069.js → _app-1adc361d4508683f.js} +1 -1
  68. package/.next/static/chunks/pages/events/[name]/v/{[version]-dc146dc9bfa7362d.js → [version]-963d3e8377b51e86.js} +1 -1
  69. package/.next/static/chunks/pages/events/{[name]-fb77119f66a5793e.js → [name]-578828157369b5cd.js} +1 -1
  70. package/.next/static/chunks/pages/events-1eb91650cc339723.js +1 -0
  71. package/.next/static/chunks/pages/{overview-5ac749891cbe1922.js → overview-176af2f7c17b91c9.js} +1 -1
  72. package/.next/static/chunks/pages/services/[name]-78378d531eb27bc2.js +1 -0
  73. package/.next/static/chunks/pages/services-7557ffe917633232.js +1 -0
  74. package/.next/static/chunks/pages/users/[id]-c21144bb8aa7887b.js +1 -0
  75. package/.next/static/chunks/{webpack-afe52d4a9fcc5a75.js → webpack-895c2707d065aab1.js} +1 -1
  76. package/.next/static/css/fd7bcdba1dee3675.css +3 -0
  77. package/.next/trace +37 -37
  78. package/CHANGELOG.md +24 -0
  79. package/components/Grids/EventGrid.tsx +1 -1
  80. package/components/Grids/ServiceGrid.tsx +8 -1
  81. package/components/Mermaid/index.tsx +17 -4
  82. package/components/NotFound/index.tsx +17 -17
  83. package/components/Sidebars/ServiceSidebar.tsx +3 -3
  84. package/components/SyntaxHighlighter.tsx +1 -1
  85. package/lib/graphs.ts +7 -3
  86. package/package.json +1 -1
  87. package/pages/_app.tsx +2 -0
  88. package/pages/events/[name].tsx +6 -5
  89. package/pages/events.tsx +2 -15
  90. package/pages/overview.tsx +7 -4
  91. package/pages/services/[name].tsx +9 -5
  92. package/pages/services.tsx +27 -14
  93. package/.next/static/chunks/236-0acd5083c102a9cb.js +0 -1
  94. package/.next/static/chunks/336-5d9007a96aa8f2c7.js +0 -1
  95. package/.next/static/chunks/873-9d69271e4b2dd496.js +0 -1
  96. package/.next/static/chunks/pages/events-bcad8442f21d6b67.js +0 -1
  97. package/.next/static/chunks/pages/services/[name]-69692188d11304b7.js +0 -1
  98. package/.next/static/chunks/pages/services-bcc61898062e1bf4.js +0 -1
  99. package/.next/static/chunks/pages/users/[id]-2da54ccb6319b207.js +0 -1
  100. package/.next/static/css/b44e1178a88a93b4.css +0 -3
  101. package/.next/static/yc3MsaLWgBvovlJpHpfqc/_buildManifest.js +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,29 @@
1
1
  # @eventcatalog/core
2
2
 
3
+ ## 0.0.14
4
+
5
+ ### Patch Changes
6
+
7
+ - [`7c23703`](https://github.com/boyney123/eventcatalog/commit/7c237039535d7f5d6f229396cf59eb5cbf5b0645) [#109](https://github.com/boyney123/eventcatalog/pull/109) Thanks [@boyney123](https://github.com/boyney123)! - fix: issue with long names for services and events rendering incorrectly
8
+
9
+ ## 0.0.13
10
+
11
+ ### Patch Changes
12
+
13
+ - [`732dac2`](https://github.com/boyney123/eventcatalog/commit/732dac24c1de62537732083a53c2218c2794773a) [#102](https://github.com/boyney123/eventcatalog/pull/102) Thanks [@boyney123](https://github.com/boyney123)! - feat: allow default frontmatter when creating events
14
+
15
+ ## 0.0.12
16
+
17
+ ### Patch Changes
18
+
19
+ - [`dd1b29f`](https://github.com/boyney123/eventcatalog/commit/dd1b29f81658a3c5bea9ed92c1cf54265c7feb0b) [#98](https://github.com/boyney123/eventcatalog/pull/98) Thanks [@boyney123](https://github.com/boyney123)! - feat: adding more mermaid support in mdx
20
+
21
+ ## 0.0.11
22
+
23
+ ### Patch Changes
24
+
25
+ - [`97e447a`](https://github.com/boyney123/eventcatalog/commit/97e447aa0ec255b2c879eac7fa83d7b705230790) [#95](https://github.com/boyney123/eventcatalog/pull/95) Thanks [@boyney123](https://github.com/boyney123)! - fix: edit url is now optional in not found pages and no longer fetche…
26
+
3
27
  ## 0.0.10
4
28
 
5
29
  ### Patch Changes
@@ -38,7 +38,7 @@ function EventGrid({ events = [], showMermaidDiagrams = false }: EventGridProps)
38
38
  />
39
39
  <div className="w-full border-t border-r border-b border-gray-200 bg-white rounded-r-md ">
40
40
  <div className="p-4 text-sm space-y-2 flex flex-col justify-between h-full">
41
- <div className="text-gray-900 font-bold hover:text-gray-600">
41
+ <div className="text-gray-900 font-bold hover:text-gray-600 break-all">
42
42
  {event.name}
43
43
  <span className="ml-2 inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-yellow-100 text-yellow-800">
44
44
  v{event.version}
@@ -4,14 +4,16 @@ import Link from 'next/link';
4
4
  import { CubeIcon } from '@heroicons/react/outline';
5
5
 
6
6
  import { Service } from '@eventcatalog/types';
7
+ import Mermaid from '@/components/Mermaid';
7
8
 
8
9
  import getBackgroundColor from '@/utils/random-bg';
9
10
 
10
11
  interface ServiceGridProps {
11
12
  services: Service[];
13
+ showMermaidDiagrams?: boolean;
12
14
  }
13
15
 
14
- function ServiceGrid({ services = [] }: ServiceGridProps) {
16
+ function ServiceGrid({ services = [], showMermaidDiagrams = false }: ServiceGridProps) {
15
17
  return (
16
18
  <ul className="mt-3 grid grid-cols-1 gap-5 md:grid-cols-2">
17
19
  {services.map((service) => {
@@ -38,6 +40,11 @@ function ServiceGrid({ services = [] }: ServiceGridProps) {
38
40
  )}
39
41
  <div className="text-gray-500 text-xs font-normal mt-2 line-clamp-3">{service.summary}</div>
40
42
  </div>
43
+ {showMermaidDiagrams && (
44
+ <div className="h-full items-center flex">
45
+ <Mermaid source="service" data={service} rootNodeColor={getBackgroundColor(service.name)} />
46
+ </div>
47
+ )}
41
48
  <div className="flex space-x-4 text-xs pt-2 relative bottom-0 left-0">
42
49
  <div className=" font-medium text-gray-500">
43
50
  <CubeIcon className="h-4 w-4 text-green-400 inline-block mr-2" aria-hidden="true" />
@@ -30,17 +30,30 @@ interface MermaidProps {
30
30
  data: Event | Service;
31
31
  source: 'event' | 'service';
32
32
  rootNodeColor?: string;
33
+ charts?: string[];
33
34
  }
34
35
 
35
- function Mermaid({ data, source = 'event', rootNodeColor }: MermaidProps) {
36
+ function Mermaid({ data, source = 'event', rootNodeColor, charts }: MermaidProps) {
37
+ useEffect(() => {
38
+ mermaid.contentLoaded();
39
+ }, []);
40
+
41
+ if (charts) {
42
+ return (
43
+ <>
44
+ {charts.map((content, index) => (
45
+ <div key={`chart-${index}`} className="mermaid">
46
+ {content}
47
+ </div>
48
+ ))}
49
+ </>
50
+ );
51
+ }
36
52
  const mermaidChart =
37
53
  source === 'event'
38
54
  ? buildMermaidFlowChartForEvent(data as Event, rootNodeColor)
39
55
  : buildMermaidFlowChartForService(data as Service, rootNodeColor);
40
56
 
41
- useEffect(() => {
42
- mermaid.contentLoaded();
43
- }, []);
44
57
  return <div className="mermaid">{mermaidChart}</div>;
45
58
  }
46
59
 
@@ -1,17 +1,14 @@
1
1
  import { DocumentAddIcon } from '@heroicons/react/solid';
2
- import url from 'url';
3
2
 
4
3
  interface NotFoundProps {
5
4
  type: 'service' | 'event';
6
5
  name: string;
7
- editUrl: string;
6
+ editUrl?: string;
8
7
  }
9
8
 
10
9
  export default function Example(props: NotFoundProps) {
11
10
  const { type, name, editUrl } = props;
12
11
 
13
- const urlToAddPage = url.resolve(editUrl, `${type}/${name}`);
14
-
15
12
  return (
16
13
  <main className="min-h-full bg-cover bg-top sm:bg-top h-screen">
17
14
  <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">
@@ -19,21 +16,24 @@ export default function Example(props: NotFoundProps) {
19
16
  Failed to find {type}
20
17
  </p>
21
18
  <h1 className="mt-2 text-4xl font-extrabold text-gray-900 tracking-tight sm:text-5xl">Missing Documentation</h1>
22
- <p className="mt-2 text-lg font-medium text-gray-700 text-opacity-50">
23
- Documentation for {type} <span className="underline">{name}</span> is missing!
19
+ <p className="mt-2 text-lg font-medium text-gray-700 text-opacity-50 text-center ">
20
+ Documentation for {type} is missing!
21
+ <span className="block font-bold text-gray-800 underline break-all max-w-2xl mx-auto py-4">{name}</span>
24
22
  </p>
25
23
  <p className="mt-4 text-xs text-gray-400">Help the eco-system and add the documentation for others ❤️ </p>
26
- <div className="mt-12">
27
- <a
28
- href={urlToAddPage}
29
- target="_blank"
30
- className="inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md text-white bg-black bg-opacity-75 "
31
- rel="noreferrer"
32
- >
33
- <DocumentAddIcon className="-ml-1 mr-2 h-5 w-5" aria-hidden="true" />
34
- Add <span className="underline px-1">{name}</span> documentation
35
- </a>
36
- </div>
24
+ {editUrl && (
25
+ <div className="mt-12">
26
+ <a
27
+ href={editUrl}
28
+ target="_blank"
29
+ className="inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md text-white bg-black bg-opacity-75 "
30
+ rel="noreferrer"
31
+ >
32
+ <DocumentAddIcon className="-ml-1 mr-2 h-5 w-5" aria-hidden="true" />
33
+ Add missing <span className="underline px-1">{type}</span> documentation
34
+ </a>
35
+ </div>
36
+ )}
37
37
  </div>
38
38
  </main>
39
39
  );
@@ -42,13 +42,13 @@ function ServiceSidebar({ service }: ServiceSideBarProps) {
42
42
  </h2>
43
43
  <ul className="mt-2 leading-8">
44
44
  {publishes.map((event) => (
45
- <li className="inline" key={event.name}>
45
+ <li className="inline " key={event.name}>
46
46
  <Link href={`/events/${event.name}`}>
47
47
  <a href="#" className="relative inline-flex items-center rounded-full border border-gray-300 px-3 py-0.5">
48
48
  <div className="absolute flex-shrink-0 flex items-center justify-center">
49
49
  <span className="h-1.5 w-1.5 rounded-full bg-indigo-500 animate animate-pulse" aria-hidden="true" />
50
50
  </div>
51
- <div className="ml-3.5 text-sm font-medium text-gray-900">{event.name}</div>
51
+ <div className="ml-3.5 text-sm font-medium text-gray-900 truncate max-w-xs">{event.name}</div>
52
52
  </a>
53
53
  </Link>
54
54
  </li>
@@ -70,7 +70,7 @@ function ServiceSidebar({ service }: ServiceSideBarProps) {
70
70
  <div className="absolute flex-shrink-0 flex items-center justify-center">
71
71
  <span className="h-1.5 w-1.5 rounded-full bg-green-500 animate animate-pulse" aria-hidden="true" />
72
72
  </div>
73
- <div className="ml-3.5 text-sm font-medium text-gray-900">{event.name}</div>
73
+ <div className="ml-3.5 text-sm font-medium text-gray-900 truncate max-w-xs">{event.name}</div>
74
74
  </a>
75
75
  </Link>
76
76
  </li>
@@ -23,7 +23,7 @@ function SyntaxHighlighter({ language, name = '', ...props }: any) {
23
23
  >
24
24
  {showCopied ? 'Copied' : 'Copy'}
25
25
  </button>
26
- <PrismSyntaxHighlighter style={codeStyle} language={language} {...props} wrapLines>
26
+ <PrismSyntaxHighlighter style={codeStyle} language={language} {...props} wrapLines className="max-h-96 overflow-auto">
27
27
  {props.children.replace(regex, '\n')}
28
28
  </PrismSyntaxHighlighter>
29
29
  {name && <span className="-mb-2 block text-xs text-right font-bold">{name}</span>}
package/lib/graphs.ts CHANGED
@@ -1,11 +1,15 @@
1
1
  import type { Event, Service } from '@eventcatalog/types';
2
2
 
3
+ const MAX_LENGTH_FOR_NODES = '50';
4
+
5
+ const truncateNode = (value) => (value.length > MAX_LENGTH_FOR_NODES ? `${value.substring(0, MAX_LENGTH_FOR_NODES)}...` : value);
6
+
3
7
  const buildMermaid = (centerNode, leftNodes, rightNodes, rootNodeColor) => {
4
8
  // mermaid does not work with spaces in nodes
5
9
  const removeSpacesInNames = (nodes) => nodes.map((node) => node.replace(/ /g, '_'));
6
- const lNodes = removeSpacesInNames(leftNodes);
7
- const rNodes = removeSpacesInNames(rightNodes);
8
- const nodeValue = centerNode.replace(/ /g, '_');
10
+ const lNodes = removeSpacesInNames(leftNodes).map(truncateNode);
11
+ const rNodes = removeSpacesInNames(rightNodes).map(truncateNode);
12
+ const nodeValue = truncateNode(centerNode.replace(/ /g, '_'));
9
13
 
10
14
  return `flowchart LR
11
15
  ${lNodes.map((node) => `${node}:::producer-->${nodeValue}:::event\n`).join('')}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eventcatalog/core",
3
- "version": "0.0.10",
3
+ "version": "0.0.14",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
package/pages/_app.tsx CHANGED
@@ -12,6 +12,8 @@ export default ({ Component, pageProps }: AppProps) => (
12
12
  <script src="//unpkg.com/three" />
13
13
  <script src="//unpkg.com/three/examples/js/renderers/CSS2DRenderer.js" />
14
14
 
15
+ <link rel="stylesheet" href="https://cdn.bootcss.com/font-awesome/4.7.0/css/font-awesome.css" />
16
+
15
17
  <meta
16
18
  name="description"
17
19
  content="An open source project to Discover, Explore and Document your Event Driven Architectures."
@@ -2,7 +2,6 @@ import Head from 'next/head';
2
2
  import { MDXRemote } from 'next-mdx-remote';
3
3
 
4
4
  import { Event } from '@eventcatalog/types';
5
- import { editUrl } from '../../eventcatalog.config';
6
5
  import Admonition from '@/components/Mdx/Admonition';
7
6
  import Examples from '@/components/Mdx/Examples';
8
7
 
@@ -57,10 +56,10 @@ export const getComponents = ({ event, schema, examples }: any) => ({
57
56
  );
58
57
  return null;
59
58
  },
60
- Mermaid: ({ title }: { title: string }) => (
59
+ Mermaid: ({ title, charts }: { title: string; charts?: string[] }) => (
61
60
  <div className="mx-auto w-full py-10">
62
61
  {title && <h2 className="text-lg font-medium text-gray-900 underline">{title}</h2>}
63
- <Mermaid source="event" data={event} rootNodeColor={getBackgroundColor(event.name)} />
62
+ <Mermaid source="event" data={event} rootNodeColor={getBackgroundColor(event.name)} charts={charts} />
64
63
  </div>
65
64
  ),
66
65
  });
@@ -69,9 +68,11 @@ export default function Events(props: EventsPageProps) {
69
68
  const { event, markdown, loadedVersion, notFound } = props;
70
69
  const { getEditUrl, hasEditUrl } = useUrl();
71
70
 
72
- if (notFound) return <NotFound type="event" name={event.name} editUrl={editUrl} />;
73
-
74
71
  const { name, summary, draft, schema, examples, version } = event;
72
+
73
+ if (notFound)
74
+ return <NotFound type="event" name={event.name} editUrl={hasEditUrl ? getEditUrl(`/events/${name}/index.md`) : ''} />;
75
+
75
76
  const { lastModifiedDate } = markdown;
76
77
 
77
78
  const pages = [
package/pages/events.tsx CHANGED
@@ -2,8 +2,6 @@ import { Fragment, useState } from 'react';
2
2
  import Head from 'next/head';
3
3
  import type { Event, 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 EventGrid from '@/components/Grids/EventGrid';
@@ -28,7 +26,7 @@ export default function Page({ events, services }: PageProps) {
28
26
  const filters = [
29
27
  {
30
28
  id: 'services',
31
- name: 'Services',
29
+ name: 'Filter by Services',
32
30
  options: services.map((service) => ({
33
31
  value: service,
34
32
  label: service,
@@ -123,19 +121,8 @@ export default function Page({ events, services }: PageProps) {
123
121
  <div className="grid grid-cols-4 gap-x-8 gap-y-10">
124
122
  {/* Filters */}
125
123
  <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
-
137
124
  {filters.map((section: any) => (
138
- <div key={section.id} className="border-b border-gray-200 py-6">
125
+ <div key={section.id} className="border-b border-gray-200 pb-6">
139
126
  <h3 className="-my-3 flow-root">
140
127
  <div className="py-3 bg-white w-full flex items-center justify-between text-sm text-gray-400 hover:text-gray-500">
141
128
  <span className="font-medium text-gray-900">{section.name}</span>
@@ -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
 
@@ -1,7 +1,6 @@
1
1
  import Head from 'next/head';
2
2
  import { MDXRemote } from 'next-mdx-remote';
3
3
  import { Service } from '@eventcatalog/types';
4
- import { editUrl } from '../../eventcatalog.config.js';
5
4
  import ContentView from '@/components/ContentView';
6
5
  import { getAllServices, getServiceByName } from '@/lib/services';
7
6
 
@@ -21,25 +20,30 @@ interface ServicesPageProps {
21
20
  notFound?: boolean;
22
21
  }
23
22
 
24
- function MermaidComponent({ title, service }: { title: string; service: Service }) {
23
+ function MermaidComponent({ title, service, charts }: { title: string; service: Service; charts?: string[] }) {
25
24
  return (
26
25
  <div className="mx-auto w-full py-10">
27
26
  {title && <h2 className="text-lg font-medium text-gray-900 underline">{title}</h2>}
28
- <Mermaid source="service" data={service} rootNodeColor={getBackgroundColor(service.name)} />
27
+ <Mermaid source="service" data={service} rootNodeColor={getBackgroundColor(service.name)} charts={charts} />
29
28
  </div>
30
29
  );
31
30
  }
32
31
 
33
32
  const getComponents = (service) => ({
34
33
  Admonition,
35
- Mermaid: ({ title }: { title: string }) => <MermaidComponent service={service} title={title} />,
34
+ Mermaid: ({ title, charts }: { title: string; charts?: string[] }) => (
35
+ <MermaidComponent service={service} title={title} charts={charts} />
36
+ ),
36
37
  });
37
38
 
38
39
  export default function Services(props: ServicesPageProps) {
39
40
  const { service, markdown, notFound } = props;
40
41
  const { getEditUrl, hasEditUrl } = useUrl();
41
42
 
42
- if (notFound) return <NotFound type="service" name={service.name} editUrl={editUrl} />;
43
+ if (notFound)
44
+ return (
45
+ <NotFound type="service" name={service.name} editUrl={hasEditUrl ? getEditUrl(`/services/${service.name}/index.md`) : ''} />
46
+ );
43
47
 
44
48
  const { name, summary, draft } = service;
45
49
  const { lastModifiedDate } = markdown;
@@ -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>