@eventcatalog/core 2.50.0 → 2.50.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.
- package/dist/analytics/analytics.cjs +1 -1
- package/dist/analytics/analytics.js +2 -2
- package/dist/analytics/log-build.cjs +1 -1
- package/dist/analytics/log-build.js +3 -3
- package/dist/{chunk-5VLU23SZ.js → chunk-6DT6JYDR.js} +1 -1
- package/dist/{chunk-URM4QMOV.js → chunk-L3RINLLN.js} +1 -1
- package/dist/{chunk-O4GURJKI.js → chunk-PRZAFM4L.js} +1 -1
- package/dist/constants.cjs +1 -1
- package/dist/constants.js +1 -1
- package/dist/eventcatalog.cjs +1 -1
- package/dist/eventcatalog.js +3 -3
- package/eventcatalog/src/components/CopyAsMarkdown.tsx +150 -52
- package/eventcatalog/src/components/MDX/SchemaViewer/SchemaViewerRoot.astro +1 -1
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/index.astro +10 -13
- package/eventcatalog/src/utils/files.ts +29 -3
- package/package.json +5 -5
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
log_build_default
|
|
3
|
-
} from "../chunk-
|
|
4
|
-
import "../chunk-
|
|
5
|
-
import "../chunk-
|
|
3
|
+
} from "../chunk-6DT6JYDR.js";
|
|
4
|
+
import "../chunk-PRZAFM4L.js";
|
|
5
|
+
import "../chunk-L3RINLLN.js";
|
|
6
6
|
import "../chunk-E7TXTI7G.js";
|
|
7
7
|
export {
|
|
8
8
|
log_build_default as default
|
package/dist/constants.cjs
CHANGED
package/dist/constants.js
CHANGED
package/dist/eventcatalog.cjs
CHANGED
package/dist/eventcatalog.js
CHANGED
|
@@ -6,8 +6,8 @@ import {
|
|
|
6
6
|
} from "./chunk-XE6PFSH5.js";
|
|
7
7
|
import {
|
|
8
8
|
log_build_default
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import "./chunk-
|
|
9
|
+
} from "./chunk-6DT6JYDR.js";
|
|
10
|
+
import "./chunk-PRZAFM4L.js";
|
|
11
11
|
import {
|
|
12
12
|
catalogToAstro,
|
|
13
13
|
checkAndConvertMdToMdx
|
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
import "./chunk-LDBRNJIL.js";
|
|
16
16
|
import {
|
|
17
17
|
VERSION
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-L3RINLLN.js";
|
|
19
19
|
import {
|
|
20
20
|
isAuthEnabled,
|
|
21
21
|
isBackstagePluginEnabled,
|
|
@@ -47,18 +47,78 @@ export function CopyPageMenu({
|
|
|
47
47
|
chatQuery,
|
|
48
48
|
chatEnabled = false,
|
|
49
49
|
editUrl,
|
|
50
|
+
markdownDownloadEnabled = false,
|
|
50
51
|
}: {
|
|
51
52
|
schemas: Schema[];
|
|
52
53
|
chatQuery?: string;
|
|
53
54
|
chatEnabled: boolean;
|
|
54
55
|
editUrl: string;
|
|
56
|
+
markdownDownloadEnabled: boolean;
|
|
55
57
|
}) {
|
|
56
|
-
|
|
58
|
+
// Define available actions
|
|
59
|
+
const availableActions = {
|
|
60
|
+
copyMarkdown: markdownDownloadEnabled,
|
|
61
|
+
editPage: !!editUrl,
|
|
62
|
+
copySchemas: schemas.length > 0,
|
|
63
|
+
viewMarkdown: markdownDownloadEnabled,
|
|
64
|
+
chat: chatEnabled,
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
// Check if any actions are available
|
|
68
|
+
const hasAnyActions = Object.values(availableActions).some(Boolean);
|
|
69
|
+
|
|
70
|
+
// If no actions are available, return null
|
|
71
|
+
if (!hasAnyActions) {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
57
74
|
|
|
58
75
|
// get the url of the current page
|
|
59
76
|
const url = window.location.href;
|
|
60
77
|
const markdownUrl = url + '.mdx';
|
|
61
78
|
|
|
79
|
+
// Determine the default action based on what's available
|
|
80
|
+
const getDefaultAction = () => {
|
|
81
|
+
if (availableActions.copyMarkdown) {
|
|
82
|
+
return {
|
|
83
|
+
type: 'copyMarkdown',
|
|
84
|
+
text: 'Copy page',
|
|
85
|
+
icon: Copy,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
if (availableActions.editPage) {
|
|
89
|
+
return {
|
|
90
|
+
type: 'editPage',
|
|
91
|
+
text: 'Edit page',
|
|
92
|
+
icon: PenSquareIcon,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
if (availableActions.copySchemas) {
|
|
96
|
+
return {
|
|
97
|
+
type: 'copySchemas',
|
|
98
|
+
text: 'Copy schema',
|
|
99
|
+
icon: FileText,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
if (availableActions.viewMarkdown) {
|
|
103
|
+
return {
|
|
104
|
+
type: 'viewMarkdown',
|
|
105
|
+
text: 'View Markdown',
|
|
106
|
+
icon: FileText,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
if (availableActions.chat) {
|
|
110
|
+
return {
|
|
111
|
+
type: 'chat',
|
|
112
|
+
text: 'Open Chat',
|
|
113
|
+
icon: MessageCircleQuestion,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
return null;
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
const defaultAction = getDefaultAction();
|
|
120
|
+
const [buttonText, setButtonText] = useState(defaultAction?.text || 'Action');
|
|
121
|
+
|
|
62
122
|
// Fetch the markdown from the url + .mdx
|
|
63
123
|
const copyMarkdownToClipboard = async () => {
|
|
64
124
|
console.log('Copying markdown to clipboard');
|
|
@@ -70,11 +130,11 @@ export function CopyPageMenu({
|
|
|
70
130
|
}
|
|
71
131
|
const markdown = await response.text();
|
|
72
132
|
await navigator.clipboard.writeText(markdown);
|
|
73
|
-
setTimeout(() => setButtonText(
|
|
133
|
+
setTimeout(() => setButtonText(defaultAction?.text || 'Action'), 3000); // Revert after 3 seconds
|
|
74
134
|
} catch (error) {
|
|
75
135
|
console.error('Failed to copy markdown:', error);
|
|
76
136
|
setButtonText('Copy failed'); // Provide feedback on failure
|
|
77
|
-
setTimeout(() => setButtonText(
|
|
137
|
+
setTimeout(() => setButtonText(defaultAction?.text || 'Action'), 3000);
|
|
78
138
|
}
|
|
79
139
|
};
|
|
80
140
|
|
|
@@ -91,25 +151,52 @@ export function CopyPageMenu({
|
|
|
91
151
|
}
|
|
92
152
|
const schemaContent = await response.text(); // Or response.json() if it's always JSON
|
|
93
153
|
await navigator.clipboard.writeText(schemaContent);
|
|
94
|
-
setTimeout(() => setButtonText(
|
|
154
|
+
setTimeout(() => setButtonText(defaultAction?.text || 'Action'), 3000); // Revert after 3 seconds
|
|
95
155
|
} catch (error) {
|
|
96
156
|
console.error('Failed to copy schema:', error);
|
|
97
157
|
setButtonText('Copy failed'); // Provide feedback on failure
|
|
98
|
-
setTimeout(() => setButtonText(
|
|
158
|
+
setTimeout(() => setButtonText(defaultAction?.text || 'Action'), 3000);
|
|
99
159
|
}
|
|
100
160
|
};
|
|
101
161
|
|
|
162
|
+
// Handle the default action based on type
|
|
163
|
+
const handleDefaultAction = () => {
|
|
164
|
+
if (!defaultAction) return;
|
|
165
|
+
|
|
166
|
+
switch (defaultAction.type) {
|
|
167
|
+
case 'copyMarkdown':
|
|
168
|
+
copyMarkdownToClipboard();
|
|
169
|
+
break;
|
|
170
|
+
case 'editPage':
|
|
171
|
+
window.open(editUrl, '_blank');
|
|
172
|
+
break;
|
|
173
|
+
case 'copySchemas':
|
|
174
|
+
copySchemaToClipboard(schemas[0]);
|
|
175
|
+
break;
|
|
176
|
+
case 'viewMarkdown':
|
|
177
|
+
window.open(markdownUrl, '_blank');
|
|
178
|
+
break;
|
|
179
|
+
case 'chat':
|
|
180
|
+
window.open(buildUrl(`/chat?query=${chatQuery}`));
|
|
181
|
+
break;
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
if (!defaultAction) {
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
|
|
102
189
|
return (
|
|
103
190
|
<DropdownMenu.Root>
|
|
104
191
|
{/* Container for the split button */}
|
|
105
192
|
<div className="inline-flex rounded-md shadow-sm border border-gray-300">
|
|
106
|
-
{/* Left Button:
|
|
193
|
+
{/* Left Button: Default Action */}
|
|
107
194
|
<button
|
|
108
195
|
type="button"
|
|
109
|
-
onClick={
|
|
196
|
+
onClick={handleDefaultAction}
|
|
110
197
|
className="inline-flex items-center justify-center gap-1 px-3 py-1.5 text-sm font-medium text-gray-700 bg-white rounded-l-md hover:bg-gray-50 focus:z-10 focus:outline-none focus:ring-1 focus:ring-indigo-500"
|
|
111
198
|
>
|
|
112
|
-
<
|
|
199
|
+
<defaultAction.icon className="w-4 h-4" />
|
|
113
200
|
{buttonText}
|
|
114
201
|
</button>
|
|
115
202
|
{/* Right Button: Dropdown Trigger */}
|
|
@@ -130,14 +217,16 @@ export function CopyPageMenu({
|
|
|
130
217
|
sideOffset={5}
|
|
131
218
|
align="end"
|
|
132
219
|
>
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
220
|
+
{availableActions.copyMarkdown && (
|
|
221
|
+
<DropdownMenu.Item
|
|
222
|
+
className="cursor-pointer hover:bg-gray-100 focus:outline-none focus:bg-gray-100"
|
|
223
|
+
onSelect={() => copyMarkdownToClipboard()}
|
|
224
|
+
>
|
|
225
|
+
<MenuItemContent icon={Copy} title="Copy page" description="Copy page as Markdown for LLMs" />
|
|
226
|
+
</DropdownMenu.Item>
|
|
227
|
+
)}
|
|
139
228
|
|
|
140
|
-
{
|
|
229
|
+
{availableActions.editPage && (
|
|
141
230
|
<DropdownMenu.Item
|
|
142
231
|
className="cursor-pointer hover:bg-gray-100 focus:outline-none focus:bg-gray-100"
|
|
143
232
|
onSelect={() => window.open(editUrl, '_blank')}
|
|
@@ -151,49 +240,58 @@ export function CopyPageMenu({
|
|
|
151
240
|
</DropdownMenu.Item>
|
|
152
241
|
)}
|
|
153
242
|
|
|
154
|
-
{
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
243
|
+
{availableActions.copySchemas &&
|
|
244
|
+
schemas.map((schema) => {
|
|
245
|
+
const title =
|
|
246
|
+
schema.format === 'asyncapi'
|
|
247
|
+
? 'Copy AsyncAPI specification'
|
|
248
|
+
: schema.format === 'openapi'
|
|
249
|
+
? 'Copy OpenAPI specification'
|
|
250
|
+
: 'Copy schema';
|
|
251
|
+
const type =
|
|
252
|
+
schema.format === 'asyncapi' || schema.format === 'openapi'
|
|
253
|
+
? 'specification'
|
|
254
|
+
: `${schema.format.toUpperCase()} schema`;
|
|
255
|
+
|
|
256
|
+
const Icon =
|
|
257
|
+
schema.format === 'asyncapi' ? (
|
|
258
|
+
<img src={buildUrl('/icons/asyncapi.svg', true)} className="w-4 h-4" />
|
|
259
|
+
) : schema.format === 'openapi' ? (
|
|
260
|
+
<img src={buildUrl('/icons/openapi.svg', true)} className="w-4 h-4" />
|
|
261
|
+
) : (
|
|
262
|
+
FileText
|
|
263
|
+
);
|
|
264
|
+
|
|
265
|
+
return (
|
|
266
|
+
<DropdownMenu.Item
|
|
267
|
+
key={schema.url}
|
|
268
|
+
className="cursor-pointer hover:bg-gray-100 focus:outline-none focus:bg-gray-100"
|
|
269
|
+
onSelect={() => copySchemaToClipboard(schema)}
|
|
270
|
+
>
|
|
271
|
+
<MenuItemContent icon={Icon} title={title} description={`Copy ${type} to clipboard`} />
|
|
272
|
+
</DropdownMenu.Item>
|
|
173
273
|
);
|
|
274
|
+
})}
|
|
174
275
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
</DropdownMenu.Item>
|
|
191
|
-
{chatEnabled && (
|
|
276
|
+
{availableActions.viewMarkdown && (
|
|
277
|
+
<DropdownMenu.Item
|
|
278
|
+
className="cursor-pointer hover:bg-gray-100 focus:outline-none focus:bg-gray-100"
|
|
279
|
+
onSelect={() => window.open(markdownUrl, '_blank')}
|
|
280
|
+
>
|
|
281
|
+
<MenuItemContent
|
|
282
|
+
icon={FileText}
|
|
283
|
+
title="View as Markdown"
|
|
284
|
+
description="View this page as plain text"
|
|
285
|
+
external={true}
|
|
286
|
+
/>
|
|
287
|
+
</DropdownMenu.Item>
|
|
288
|
+
)}
|
|
289
|
+
|
|
290
|
+
{availableActions.chat && (
|
|
192
291
|
<DropdownMenu.Item
|
|
193
292
|
className="cursor-pointer hover:bg-gray-100 focus:outline-none focus:bg-gray-100"
|
|
194
293
|
onSelect={() => window.open(buildUrl(`/chat?query=${chatQuery}`))}
|
|
195
294
|
>
|
|
196
|
-
{/* Using MessageCircleQuestion as a placeholder for Claude logo */}
|
|
197
295
|
<MenuItemContent
|
|
198
296
|
icon={MessageCircleQuestion}
|
|
199
297
|
title="Open in EventCatalog Chat"
|
|
@@ -12,7 +12,7 @@ import { getAbsoluteFilePathForAstroFile } from '@utils/files';
|
|
|
12
12
|
let schemas = [];
|
|
13
13
|
|
|
14
14
|
try {
|
|
15
|
-
const absoluteFilePath = getAbsoluteFilePathForAstroFile(filePath);
|
|
15
|
+
const absoluteFilePath = getAbsoluteFilePathForAstroFile(filePath, filePath.split(path.sep).pop());
|
|
16
16
|
const file = await fs.readFile(absoluteFilePath, 'utf-8');
|
|
17
17
|
const schemaViewers = getMDXComponentsByName(file, 'SchemaViewer');
|
|
18
18
|
|
|
@@ -212,19 +212,16 @@ nodeGraphs.push({
|
|
|
212
212
|
{props.data.name}
|
|
213
213
|
<span class="">(v{props.data.version})</span>
|
|
214
214
|
</h2>
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
</div>
|
|
226
|
-
)
|
|
227
|
-
}
|
|
215
|
+
<div class="hidden lg:block">
|
|
216
|
+
<CopyAsMarkdown
|
|
217
|
+
client:only="react"
|
|
218
|
+
schemas={schemasForResource}
|
|
219
|
+
chatQuery={generatePromptForResource(props)}
|
|
220
|
+
chatEnabled={isEventCatalogChatEnabled()}
|
|
221
|
+
markdownDownloadEnabled={isMarkdownDownloadEnabled()}
|
|
222
|
+
editUrl={editUrl}
|
|
223
|
+
/>
|
|
224
|
+
</div>
|
|
228
225
|
</div>
|
|
229
226
|
{
|
|
230
227
|
isMarkedAsDeprecated && hasDeprecated && (
|
|
@@ -2,6 +2,11 @@ import path from 'node:path';
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Using the Astro filePath, this returns the absolute path to the file
|
|
5
|
+
*
|
|
6
|
+
* The astro file path does not return the absolute path to the file, it returns the relative path to the file.
|
|
7
|
+
*
|
|
8
|
+
* This function will return the absolute path to the file, and it will also remove any overlapping path segments, issues seen with local development and also docker
|
|
9
|
+
*
|
|
5
10
|
* @param filePath
|
|
6
11
|
* @returns
|
|
7
12
|
*/
|
|
@@ -9,9 +14,30 @@ export const getAbsoluteFilePathForAstroFile = (filePath: string, fileName?: str
|
|
|
9
14
|
const PROJECT_DIR = process.env.PROJECT_DIR || process.cwd();
|
|
10
15
|
|
|
11
16
|
if (fileName) {
|
|
12
|
-
const
|
|
13
|
-
|
|
17
|
+
const safeRelativePath = path.posix.relative('/', path.resolve('/', filePath));
|
|
18
|
+
|
|
19
|
+
// Check for overlapping path segments
|
|
20
|
+
const projectDirSegments = PROJECT_DIR.split(path.sep);
|
|
21
|
+
const relativePathSegments = safeRelativePath.split(path.posix.sep);
|
|
22
|
+
|
|
23
|
+
// Find the longest matching suffix of PROJECT_DIR with prefix of relative path
|
|
24
|
+
let overlapLength = 0;
|
|
25
|
+
for (let i = 1; i <= Math.min(projectDirSegments.length, relativePathSegments.length); i++) {
|
|
26
|
+
const projectSuffix = projectDirSegments.slice(-i);
|
|
27
|
+
const relativPrefix = relativePathSegments.slice(0, i);
|
|
28
|
+
|
|
29
|
+
if (projectSuffix.join(path.sep) === relativPrefix.join(path.posix.sep)) {
|
|
30
|
+
overlapLength = i;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Remove overlapping segments from the relative path
|
|
35
|
+
const cleanedRelativePath = relativePathSegments.slice(overlapLength).join(path.posix.sep);
|
|
36
|
+
const absoluteFilePath = path.join(PROJECT_DIR, cleanedRelativePath);
|
|
37
|
+
|
|
38
|
+
const directory = path.dirname(absoluteFilePath || '');
|
|
39
|
+
return path.join(directory, fileName);
|
|
14
40
|
}
|
|
15
41
|
|
|
16
|
-
return path.join(PROJECT_DIR,
|
|
42
|
+
return path.join(PROJECT_DIR, filePath);
|
|
17
43
|
};
|
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.50.
|
|
9
|
+
"version": "2.50.2",
|
|
10
10
|
"publishConfig": {
|
|
11
11
|
"access": "public"
|
|
12
12
|
},
|
|
@@ -24,9 +24,9 @@
|
|
|
24
24
|
"@ai-sdk/anthropic": "^1.2.11",
|
|
25
25
|
"@ai-sdk/google": "^1.2.17",
|
|
26
26
|
"@ai-sdk/openai": "^1.3.16",
|
|
27
|
-
"@astrojs/markdown-remark": "^6.3.
|
|
28
|
-
"@astrojs/mdx": "^4.3.
|
|
29
|
-
"@astrojs/node": "^9.
|
|
27
|
+
"@astrojs/markdown-remark": "^6.3.3",
|
|
28
|
+
"@astrojs/mdx": "^4.3.1",
|
|
29
|
+
"@astrojs/node": "^9.3.0",
|
|
30
30
|
"@astrojs/react": "^4.3.0",
|
|
31
31
|
"@astrojs/rss": "^4.0.12",
|
|
32
32
|
"@astrojs/tailwind": "^6.0.2",
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
"@tanstack/react-table": "^8.17.3",
|
|
57
57
|
"@xyflow/react": "^12.3.6",
|
|
58
58
|
"ai": "^4.3.9",
|
|
59
|
-
"astro": "^5.
|
|
59
|
+
"astro": "^5.12.0",
|
|
60
60
|
"astro-compress": "^2.3.8",
|
|
61
61
|
"astro-expressive-code": "^0.40.1",
|
|
62
62
|
"astro-pagefind": "^1.6.0",
|