@eventcatalog/core 2.31.1 → 2.31.3

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.
@@ -37,7 +37,7 @@ var import_axios = __toESM(require("axios"), 1);
37
37
  var import_os = __toESM(require("os"), 1);
38
38
 
39
39
  // package.json
40
- var version = "2.31.1";
40
+ var version = "2.31.3";
41
41
 
42
42
  // src/constants.ts
43
43
  var VERSION = version;
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  raiseEvent
3
- } from "../chunk-GHBJ372G.js";
4
- import "../chunk-YUINCBLT.js";
3
+ } from "../chunk-34ONBQTK.js";
4
+ import "../chunk-4EXYGKM6.js";
5
5
  export {
6
6
  raiseEvent
7
7
  };
@@ -106,7 +106,7 @@ var import_axios = __toESM(require("axios"), 1);
106
106
  var import_os = __toESM(require("os"), 1);
107
107
 
108
108
  // package.json
109
- var version = "2.31.1";
109
+ var version = "2.31.3";
110
110
 
111
111
  // src/constants.ts
112
112
  var VERSION = version;
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  log_build_default
3
- } from "../chunk-QR5UTYCE.js";
4
- import "../chunk-GHBJ372G.js";
5
- import "../chunk-YUINCBLT.js";
3
+ } from "../chunk-KYLVZEB2.js";
4
+ import "../chunk-34ONBQTK.js";
5
+ import "../chunk-4EXYGKM6.js";
6
6
  import "../chunk-E7TXTI7G.js";
7
7
  export {
8
8
  log_build_default as default
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  VERSION
3
- } from "./chunk-YUINCBLT.js";
3
+ } from "./chunk-4EXYGKM6.js";
4
4
 
5
5
  // src/analytics/analytics.js
6
6
  import axios from "axios";
@@ -1,5 +1,5 @@
1
1
  // package.json
2
- var version = "2.31.1";
2
+ var version = "2.31.3";
3
3
 
4
4
  // src/constants.ts
5
5
  var VERSION = version;
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  raiseEvent
3
- } from "./chunk-GHBJ372G.js";
3
+ } from "./chunk-34ONBQTK.js";
4
4
  import {
5
5
  getEventCatalogConfigFile,
6
6
  verifyRequiredFieldsAreInCatalogConfigFile
@@ -25,7 +25,7 @@ __export(constants_exports, {
25
25
  module.exports = __toCommonJS(constants_exports);
26
26
 
27
27
  // package.json
28
- var version = "2.31.1";
28
+ var version = "2.31.3";
29
29
 
30
30
  // src/constants.ts
31
31
  var VERSION = version;
package/dist/constants.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  VERSION
3
- } from "./chunk-YUINCBLT.js";
3
+ } from "./chunk-4EXYGKM6.js";
4
4
  export {
5
5
  VERSION
6
6
  };
@@ -157,7 +157,7 @@ var import_axios = __toESM(require("axios"), 1);
157
157
  var import_os = __toESM(require("os"), 1);
158
158
 
159
159
  // package.json
160
- var version = "2.31.1";
160
+ var version = "2.31.3";
161
161
 
162
162
  // src/constants.ts
163
163
  var VERSION = version;
@@ -6,15 +6,15 @@ import {
6
6
  } from "./chunk-UKJ7F5WR.js";
7
7
  import {
8
8
  log_build_default
9
- } from "./chunk-QR5UTYCE.js";
10
- import "./chunk-GHBJ372G.js";
9
+ } from "./chunk-KYLVZEB2.js";
10
+ import "./chunk-34ONBQTK.js";
11
11
  import {
12
12
  catalogToAstro,
13
13
  checkAndConvertMdToMdx
14
14
  } from "./chunk-7SI5EVOX.js";
15
15
  import {
16
16
  VERSION
17
- } from "./chunk-YUINCBLT.js";
17
+ } from "./chunk-4EXYGKM6.js";
18
18
  import {
19
19
  isBackstagePluginEnabled,
20
20
  isEventCatalogProEnabled
@@ -3,7 +3,7 @@ import { badge, ownerReference } from '../../shared-collections';
3
3
 
4
4
  export const customPagesSchema = z.object({
5
5
  title: z.string(),
6
- description: z.string(),
6
+ summary: z.string(),
7
7
  slug: z.string().optional(),
8
8
  sidebar: z
9
9
  .object({
@@ -8,6 +8,7 @@ import mdxComponents from '@components/MDX/components';
8
8
  import OwnersList from '@components/Lists/OwnersList';
9
9
  import { getOwner } from '@utils/collections/owners';
10
10
  import CustomDocsNav from '@components/SideNav/CustomDocsNav.astro';
11
+ import { getAdjacentPages } from '../utils/custom-docs';
11
12
 
12
13
  const props = Astro.props;
13
14
  const doc = props.data;
@@ -53,12 +54,7 @@ sidebar.forEach((section: SidebarSection) => {
53
54
  }
54
55
  });
55
56
 
56
- // Find current page index in flattened items
57
- const currentIndex = flattenedItems.findIndex((item) => currentSlug === item.slug);
58
-
59
- // Get previous and next items
60
- const prevItem = currentIndex > 0 ? flattenedItems[currentIndex - 1] : null;
61
- const nextItem = currentIndex < flattenedItems.length - 1 ? flattenedItems[currentIndex + 1] : null;
57
+ const { prev, next } = await getAdjacentPages(currentSlug.replace());
62
58
 
63
59
  const ownersRaw = doc?.owners || [];
64
60
  const owners = await Promise.all<ReturnType<typeof getOwner>>(ownersRaw.map(getOwner));
@@ -83,11 +79,12 @@ const badges = doc?.badges || [];
83
79
  </aside>
84
80
 
85
81
  <!-- Main Content Area - Independent scrolling -->
86
- <main class="sidebar-transition w-full max-h-content ml-[22em] 2xl:ml-[24em] mr-80 lg:mr-[26em] max-w-5xl mx-auto">
82
+ <main class="sidebar-transition w-full max-h-content ml-[22em] 2xl:ml-[24em] mr-80 lg:mr-[20em] max-w-5xl mx-auto">
87
83
  <div class="max-w-7xl mx-auto px-6 py-10">
88
84
  <div class="border-b border-gray-200 flex justify-between items-start md:pb-6">
89
85
  <div>
90
86
  <h2 id="doc-page-header" class="text-2xl md:text-4xl font-bold text-black">{doc.title}</h2>
87
+ <p class="text-lg pt-2 text-gray-500 font-light">{doc.summary}</p>
91
88
  {
92
89
  badges && (
93
90
  <div class="flex flex-wrap pt-4">
@@ -118,27 +115,27 @@ const badges = doc?.badges || [];
118
115
  <div class="py-8 border-t border-gray-200 mt-8">
119
116
  <div class="flex flex-col sm:flex-row justify-between w-full gap-4">
120
117
  {
121
- prevItem && (
118
+ prev && (
122
119
  <a
123
- href={buildUrl(`/docs/custom/${prevItem.slug}`)}
120
+ href={buildUrl(`/docs/custom/${prev.slug}`)}
124
121
  class="group flex flex-col border border-gray-200 rounded-lg p-4 hover:border-gray-300 hover:bg-gray-50 transition-colors w-full sm:w-1/2"
125
122
  >
126
123
  <span class="text-sm text-gray-500 mb-1">Previous</span>
127
- <span class="font-medium group-hover:text-primary-600 transition-colors">{prevItem.label}</span>
124
+ <span class="font-medium group-hover:text-primary-600 transition-colors">{prev.label}</span>
128
125
  </a>
129
126
  )
130
127
  }
131
128
 
132
- {!prevItem && <div class="w-full sm:w-1/2" />}
129
+ {!prev && <div class="w-full sm:w-1/2" />}
133
130
 
134
131
  {
135
- nextItem && (
132
+ next && (
136
133
  <a
137
- href={buildUrl(`/docs/custom/${nextItem.slug}`)}
134
+ href={buildUrl(`/docs/custom/${next.slug}`)}
138
135
  class="group flex flex-col items-end text-right border border-gray-200 rounded-lg p-4 hover:border-gray-300 hover:bg-gray-50 transition-colors w-full sm:w-1/2"
139
136
  >
140
137
  <span class="text-sm text-gray-500 mb-1">Next</span>
141
- <span class="font-medium group-hover:text-primary-600 transition-colors">{nextItem.label}</span>
138
+ <span class="font-medium group-hover:text-primary-600 transition-colors">{next.label}</span>
142
139
  </a>
143
140
  )
144
141
  }
@@ -149,7 +146,7 @@ const badges = doc?.badges || [];
149
146
 
150
147
  <!-- Right Sidebar TOC -->
151
148
  <aside
152
- class="fixed right-0 top-16 bottom-0 w-96 overflow-y-auto border-l border-gray-100 bg-white p-6 flex-shrink-0 hidden lg:block z-10"
149
+ class="fixed right-0 top-16 bottom-0 w-80 2xl:w-96 overflow-y-auto border-l border-gray-100 bg-white p-6 flex-shrink-0 hidden lg:block z-10"
153
150
  >
154
151
  <div>
155
152
  <div>
@@ -272,7 +269,6 @@ const badges = doc?.badges || [];
272
269
 
273
270
  // First try to find headings with IDs
274
271
  const headings = prose.querySelectorAll('h1[id], h2[id], h3[id]');
275
- console.log('Headings with IDs found:', headings.length);
276
272
 
277
273
  if (headings.length > 0) {
278
274
  headings.forEach((heading) => {
@@ -281,7 +277,6 @@ const badges = doc?.badges || [];
281
277
  } else {
282
278
  // Fallback: If no headings with IDs found, attach IDs to them
283
279
  const allHeadings = prose.querySelectorAll('h1, h2, h3');
284
- console.log('Total headings found:', allHeadings.length);
285
280
 
286
281
  allHeadings.forEach((heading) => {
287
282
  // Only add ID if it doesn't exist
@@ -29,6 +29,16 @@ type SideBarConfigurationItem = {
29
29
  collapsed?: boolean;
30
30
  };
31
31
 
32
+ type AdjacentPage = {
33
+ label: string;
34
+ slug: string;
35
+ };
36
+
37
+ type AdjacentPages = {
38
+ prev: AdjacentPage | null;
39
+ next: AdjacentPage | null;
40
+ };
41
+
32
42
  const DOCS_DIR = 'docs';
33
43
 
34
44
  /**
@@ -112,6 +122,72 @@ const processSidebarItems = async (items: SideBarConfigurationItem[]): Promise<S
112
122
  return processedItems;
113
123
  };
114
124
 
125
+ /**
126
+ * Flatten all navigation items into a single array of pages with slugs
127
+ * This is used to find previous and next pages for navigation
128
+ */
129
+ const flattenNavigationItems = (items: SidebarItem[]): AdjacentPage[] => {
130
+ const flatPages: AdjacentPage[] = [];
131
+
132
+ const processItem = (item: SidebarItem) => {
133
+ // Add the current item if it has a slug
134
+ if (item.slug) {
135
+ flatPages.push({
136
+ label: item.label,
137
+ slug: item.slug,
138
+ });
139
+ }
140
+
141
+ // Process nested items if they exist
142
+ if (item.items && item.items.length > 0) {
143
+ item.items.forEach(processItem);
144
+ }
145
+ };
146
+
147
+ items.forEach(processItem);
148
+ return flatPages;
149
+ };
150
+
151
+ /**
152
+ * Get the previous and next pages for a given slug
153
+ * Returns null for prev if it's the first page, and null for next if it's the last page
154
+ */
155
+ export const getAdjacentPages = async (slug: string): Promise<AdjacentPages> => {
156
+ const navigationItems = await getNavigationItems();
157
+ const flatPages = flattenNavigationItems(navigationItems);
158
+
159
+ // Normalize the slug by removing 'docs/' prefix if it exists
160
+ // and ensure consistent formatting with or without leading slash
161
+ let normalizedSlug = slug;
162
+ if (normalizedSlug.startsWith('docs/')) {
163
+ normalizedSlug = normalizedSlug.substring(5); // Remove 'docs/' prefix
164
+ }
165
+
166
+ // Find the current page by comparing normalized slugs
167
+ const currentIndex = flatPages.findIndex((page) => {
168
+ // Normalize page slug for comparison
169
+ let pageSlug = page.slug;
170
+ if (pageSlug.startsWith('/')) {
171
+ pageSlug = pageSlug.substring(1);
172
+ }
173
+
174
+ return pageSlug === normalizedSlug;
175
+ });
176
+
177
+ // If page not found, return null for both prev and next
178
+ if (currentIndex === -1) {
179
+ return { prev: null, next: null };
180
+ }
181
+
182
+ // Get previous page if it exists
183
+ const prev = currentIndex > 0 ? flatPages[currentIndex - 1] : null;
184
+
185
+ // Get next page if it exists
186
+ const next = currentIndex < flatPages.length - 1 ? flatPages[currentIndex + 1] : null;
187
+
188
+ return { prev, next };
189
+ };
190
+
115
191
  export const getNavigationItems = async (): Promise<SidebarItem[]> => {
116
192
  const configuredSidebar = config.customDocs.sidebar;
117
193
  return processSidebarItems(configuredSidebar as SideBarConfigurationItem[]);
@@ -16,10 +16,6 @@ export const getStaticPaths = (async () => {
16
16
  params: { path: doc.id.replace('docs/', '') },
17
17
  props: doc,
18
18
  }));
19
- console.log(
20
- 'paths',
21
- paths.map((path) => path.params.path)
22
- );
23
19
  return paths;
24
20
  }) satisfies GetStaticPaths;
25
21
 
@@ -0,0 +1,237 @@
1
+ ---
2
+ import VerticalSideBarLayout from '@layouts/VerticalSideBarLayout.astro';
3
+ import { Code } from 'astro-expressive-code/components';
4
+ import { isEventCatalogProEnabled } from '@utils/feature';
5
+
6
+ // Example for folder structure
7
+ const folderStructureExample = `my-catalog/
8
+ └── docs/
9
+ ├── getting-started/
10
+ │ ├── 01-introduction.mdx
11
+ │ └── 02-quick-start.mdx
12
+ ├── architecture-decisions/
13
+ │ ├── 01-what-are-architecture-decisions.mdx
14
+ │ ├── 02-how-to-create-architecture-decisions.mdx
15
+ │ ├── published/
16
+ │ │ ├── 01-adr-001-event-driven.mdx
17
+ │ │ └── 02-adr-002-api-first.mdx
18
+ │ └── drafts/
19
+ │ ├── 01-adr-003-microservices.mdx
20
+ │ └── 02-adr-004-monolith.mdx
21
+ └`;
22
+ // Example MDX file content
23
+ const mdxFileExample = `---
24
+ title: Getting Started
25
+ summary: How to get started with our event-driven architecture
26
+ ---
27
+
28
+ # Getting Started with our Event-Driven Architecture
29
+
30
+ This guide will help you understand how our services communicate using events.
31
+
32
+ ## Prerequisites
33
+
34
+ - Understanding of basic messaging patterns
35
+ - Node.js installed on your machine
36
+
37
+ ## Key Concepts
38
+
39
+ Events are the backbone of our architecture. They represent facts that have happened in our system.
40
+ `;
41
+
42
+ // Example config file
43
+ const configExample = `// eventcatalog.config.js
44
+
45
+ module.exports = {
46
+ // Your existing config...
47
+
48
+ customDocs: {
49
+ sidebar: [
50
+ {
51
+ label: 'Getting Started',
52
+ badge: {
53
+ text: 'New', color: 'green'
54
+ },
55
+ collapsed: false,
56
+ items: [
57
+ { label: 'Introduction', slug: 'getting-started/01-introduction' },
58
+ { label: 'Quick Start', slug: 'getting-started/02-quick-start' }
59
+ ]
60
+ },
61
+ {
62
+ label: 'Architecture Decisions',
63
+ badge: {
64
+ text: 'New', color: 'green'
65
+ },
66
+ collapsed: true,
67
+ items: [
68
+ {
69
+ label: 'What are Architecture Decisions?',
70
+ slug: 'architecture-decisions/01-what-are-architecture-decisions'
71
+ },
72
+ {
73
+ label: 'How to Create Architecture Decisions',
74
+ slug: 'architecture-decisions/02-how-to-create-architecture-decisions'
75
+ },
76
+ {
77
+ label: 'Published ADRs',
78
+ autogenerated: {
79
+ directory: 'architecture-decisions/published',
80
+ collapsed: true
81
+ }
82
+ },
83
+ {
84
+ label: 'Draft ADRs',
85
+ autogenerated: {
86
+ directory: 'architecture-decisions/drafts',
87
+ collapsed: true
88
+ }
89
+ }
90
+ ]
91
+ }
92
+ ]
93
+ }
94
+ }`;
95
+ ---
96
+
97
+ <VerticalSideBarLayout title="Custom Documentation">
98
+ <body class="min-h-screen font-inter">
99
+ <main class="container px-8 lg:px-8 mx-auto py-8 max-w-[80em]">
100
+ <div class="mb-12">
101
+ <div class="flex flex-col md:flex-row md:items-center md:justify-between gap-6">
102
+ <div>
103
+ <div class="flex flex-wrap items-center gap-3 mb-3">
104
+ <h1 class="text-4xl font-semibold text-gray-900 font-inter">Custom Documentation</h1>
105
+ <div
106
+ class="inline-flex items-center px-3 py-1.5 rounded-full text-xs font-medium bg-purple-100 text-purple-800 border border-purple-200 shadow-sm"
107
+ >
108
+ Pro feature
109
+ </div>
110
+ </div>
111
+ <p class="text-base mb-0 text-gray-600 max-w-3xl">
112
+ Add custom documentation to EventCatalog to create a unified source of truth for your team. Document your
113
+ architecture decisions, patterns, and guidelines.
114
+ </p>
115
+ </div>
116
+ <div class="flex space-x-4 shrink-0">
117
+ <a
118
+ href="https://www.eventcatalog.dev/docs/custom-documentation"
119
+ class="inline-flex items-center justify-center px-5 py-2 border border-gray-300 text-sm font-medium rounded-md text-gray-700 bg-white hover:bg-gray-50"
120
+ >
121
+ Read documentation &rarr;
122
+ </a>
123
+ {
124
+ !isEventCatalogProEnabled() && (
125
+ <a
126
+ href="https://www.eventcatalog.dev/pro/trial"
127
+ class="inline-flex items-center justify-center px-5 py-2 border border-transparent text-sm font-medium rounded-md text-white bg-gradient-to-r from-purple-500 to-purple-700 hover:from-purple-600 hover:to-purple-800 shadow-sm"
128
+ >
129
+ Start 14-day trial
130
+ </a>
131
+ )
132
+ }
133
+ </div>
134
+ </div>
135
+ </div>
136
+
137
+ <h2 class="text-2xl font-semibold mb-2 text-gray-900">Setup Guide</h2>
138
+ <p class="text-gray-600 mb-8 max-w-3xl">
139
+ Custom documentation let's you bring any documentation into EventCatalog. This is useful for documenting your architecture
140
+ decisions, patterns, and guidelines. Follow these steps to get started:
141
+ </p>
142
+
143
+ <div class="space-y-10 mb-12">
144
+ <div class="bg-white p-6 rounded-lg shadow-sm border border-gray-200">
145
+ <div class="flex items-start gap-4">
146
+ <div
147
+ class="inline-flex items-center justify-center w-8 h-8 rounded-full bg-blue-100 text-blue-600 text-lg font-medium shrink-0 mt-1"
148
+ >
149
+ 1
150
+ </div>
151
+ <div class="w-full">
152
+ <h3 class="text-xl font-semibold text-gray-900 mb-3">Create the content structure</h3>
153
+ <p class="text-gray-600 mb-4">Create a folder structure in your directory to organize your documentation.</p>
154
+ <Code code={folderStructureExample} lang="bash" frame="terminal" />
155
+ </div>
156
+ </div>
157
+ </div>
158
+
159
+ <div class="bg-white p-6 rounded-lg shadow-sm border border-gray-200">
160
+ <div class="flex items-start gap-4">
161
+ <div
162
+ class="inline-flex items-center justify-center w-8 h-8 rounded-full bg-blue-100 text-blue-600 text-lg font-medium shrink-0 mt-1"
163
+ >
164
+ 2
165
+ </div>
166
+ <div class="w-full">
167
+ <h3 class="text-xl font-semibold text-gray-900 mb-3">Add MDX files</h3>
168
+ <p class="text-gray-600 mb-4">Create MDX files with frontmatter and markdown content.</p>
169
+ <Code code={mdxFileExample} lang="mdx" frame="terminal" />
170
+ </div>
171
+ </div>
172
+ </div>
173
+
174
+ <div class="bg-white p-6 rounded-lg shadow-sm border border-gray-200">
175
+ <div class="flex items-start gap-4">
176
+ <div
177
+ class="inline-flex items-center justify-center w-8 h-8 rounded-full bg-blue-100 text-blue-600 text-lg font-medium shrink-0 mt-1"
178
+ >
179
+ 3
180
+ </div>
181
+ <div class="w-full">
182
+ <h3 class="text-xl font-semibold text-gray-900 mb-3">Update your eventcatalog.config.js file</h3>
183
+ <p class="text-gray-600 mb-4">
184
+ Add the customDocs configuration to your eventcatalog.config.js file to define your sidebar structure.
185
+ </p>
186
+ <Code code={configExample} lang="js" frame="terminal" />
187
+ <p class="text-gray-600 mt-4">This configuration defines the sidebar structure for your custom documentation:</p>
188
+ <ul class="list-disc list-inside text-gray-600 mt-2 ml-2 space-y-1">
189
+ <li>
190
+ <strong>label</strong>: The display name for each sidebar section
191
+ </li>
192
+ <li>
193
+ <strong>badge</strong>: Optional badge to highlight new sections
194
+ </li>
195
+ <li>
196
+ <strong>collapsed</strong>: Whether the section is collapsed by default
197
+ </li>
198
+ <li>
199
+ <strong>autogenerated</strong>: Automatically generate sidebar items from a directory
200
+ </li>
201
+ <li>
202
+ <strong>slug</strong>: Direct link to a specific page
203
+ </li>
204
+ </ul>
205
+ </div>
206
+ </div>
207
+ </div>
208
+
209
+ <div class="bg-white p-6 rounded-lg shadow-sm border border-gray-200">
210
+ <div class="flex items-start gap-4">
211
+ <div
212
+ class="inline-flex items-center justify-center w-8 h-8 rounded-full bg-blue-100 text-blue-600 text-lg font-medium shrink-0 mt-1"
213
+ >
214
+ 4
215
+ </div>
216
+ <div class="w-full">
217
+ <h3 class="text-xl font-semibold text-gray-900 mb-3">Restart EventCatalog</h3>
218
+ <p class="text-gray-600 mb-4">
219
+ After configuring your documentation, restart EventCatalog to see your custom documentation.
220
+ </p>
221
+ <div class="mb-4">
222
+ <Code code="npm run dev" lang="bash" frame="terminal" />
223
+ </div>
224
+ <p class="text-gray-600 mb-4">
225
+ Once restarted, you'll see your custom documentation displayed with the sidebar structure you defined:
226
+ </p>
227
+ <div class="border border-gray-200 rounded-lg overflow-hidden">
228
+ <img src="/images/custom-docs-placeholder.png" alt="Example of custom documentation interface" class="w-full" />
229
+ </div>
230
+ </div>
231
+ </div>
232
+ </div>
233
+ </div>
234
+ </main>
235
+ </body>
236
+ </VerticalSideBarLayout>
237
+ )
package/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "url": "https://github.com/event-catalog/eventcatalog.git"
7
7
  },
8
8
  "type": "module",
9
- "version": "2.31.1",
9
+ "version": "2.31.3",
10
10
  "publishConfig": {
11
11
  "access": "public"
12
12
  },