@eventcatalog/core 2.55.1 → 2.55.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.
- 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-D4MIDRVV.js → chunk-6MWKM7BG.js} +1 -1
- package/dist/{chunk-Q3RTITUV.js → chunk-T5TRFXGX.js} +1 -1
- package/dist/{chunk-SKPKGCT7.js → chunk-WYTPPCGQ.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/MDX/SchemaViewer/SchemaViewer.astro +59 -3
- package/eventcatalog/src/pages/architecture/architecture.astro +3 -6
- package/eventcatalog/src/utils/collections/util.ts +8 -0
- package/eventcatalog/src/utils/commands.ts +26 -14
- package/eventcatalog/src/utils/events.ts +28 -16
- package/eventcatalog/src/utils/messages.ts +5 -4
- package/eventcatalog/src/utils/queries.ts +28 -16
- package/package.json +1 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
log_build_default
|
|
3
|
-
} from "../chunk-
|
|
4
|
-
import "../chunk-
|
|
5
|
-
import "../chunk-
|
|
3
|
+
} from "../chunk-6MWKM7BG.js";
|
|
4
|
+
import "../chunk-T5TRFXGX.js";
|
|
5
|
+
import "../chunk-WYTPPCGQ.js";
|
|
6
6
|
import "../chunk-UPONRQSN.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-PLNJC7NZ.js";
|
|
7
7
|
import {
|
|
8
8
|
log_build_default
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import "./chunk-
|
|
9
|
+
} from "./chunk-6MWKM7BG.js";
|
|
10
|
+
import "./chunk-T5TRFXGX.js";
|
|
11
11
|
import {
|
|
12
12
|
catalogToAstro,
|
|
13
13
|
checkAndConvertMdToMdx
|
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
import "./chunk-55D645EH.js";
|
|
16
16
|
import {
|
|
17
17
|
VERSION
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-WYTPPCGQ.js";
|
|
19
19
|
import {
|
|
20
20
|
getProjectOutDir,
|
|
21
21
|
isAuthEnabled,
|
|
@@ -37,6 +37,10 @@ function countProperties(obj: any): number {
|
|
|
37
37
|
if (obj.items) {
|
|
38
38
|
count += countProperties(obj.items);
|
|
39
39
|
}
|
|
40
|
+
// Handle root array items that have been processed
|
|
41
|
+
if (obj._isRootArrayItem && obj._rootArraySchema?.items) {
|
|
42
|
+
// Don't double count, we're already counting the properties above
|
|
43
|
+
}
|
|
40
44
|
return count;
|
|
41
45
|
}
|
|
42
46
|
|
|
@@ -213,10 +217,36 @@ function processSchema(schema: any, rootSchema?: any): any {
|
|
|
213
217
|
}
|
|
214
218
|
|
|
215
219
|
const processedSchema = processSchema(schema);
|
|
216
|
-
|
|
220
|
+
|
|
221
|
+
// Handle root-level array schemas
|
|
222
|
+
let displaySchema = processedSchema;
|
|
223
|
+
let isRootArray = false;
|
|
224
|
+
|
|
225
|
+
if (processedSchema.type === 'array' && processedSchema.items) {
|
|
226
|
+
isRootArray = true;
|
|
227
|
+
// For root arrays, we want to display the items' properties
|
|
228
|
+
if (processedSchema.items.type === 'object' && processedSchema.items.properties) {
|
|
229
|
+
displaySchema = {
|
|
230
|
+
...processedSchema.items,
|
|
231
|
+
description: processedSchema.description || processedSchema.items.description,
|
|
232
|
+
_isRootArrayItem: true,
|
|
233
|
+
_rootArraySchema: processedSchema,
|
|
234
|
+
};
|
|
235
|
+
} else if (processedSchema.items.allOf || processedSchema.items.oneOf || processedSchema.items.$ref) {
|
|
236
|
+
// Process complex array item schemas
|
|
237
|
+
displaySchema = {
|
|
238
|
+
...processSchema(processedSchema.items),
|
|
239
|
+
description: processedSchema.description || processedSchema.items.description,
|
|
240
|
+
_isRootArrayItem: true,
|
|
241
|
+
_rootArraySchema: processedSchema,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
const { description, properties, required = [], variants } = displaySchema;
|
|
217
247
|
|
|
218
248
|
// Count total properties after processing
|
|
219
|
-
const totalProperties = countProperties(
|
|
249
|
+
const totalProperties = countProperties(displaySchema);
|
|
220
250
|
|
|
221
251
|
// Generate a unique ID for this instance
|
|
222
252
|
const instanceId = `${id}-${Math.random().toString(36).substring(2, 9)}`;
|
|
@@ -293,6 +323,19 @@ const instanceId = `${id}-${Math.random().toString(36).substring(2, 9)}`;
|
|
|
293
323
|
</div>
|
|
294
324
|
)
|
|
295
325
|
}
|
|
326
|
+
{
|
|
327
|
+
isRootArray && (
|
|
328
|
+
<div class="mb-4 p-3 bg-blue-50 border border-blue-200 rounded-md">
|
|
329
|
+
<div class="flex items-center space-x-2">
|
|
330
|
+
<span class="text-blue-600 font-medium text-sm">Array Schema</span>
|
|
331
|
+
<span class="text-blue-500 font-mono text-xs">array[object]</span>
|
|
332
|
+
</div>
|
|
333
|
+
<p class="text-blue-700 text-xs mt-1">
|
|
334
|
+
This schema defines an array of objects. Each item in the array has the properties shown below.
|
|
335
|
+
</p>
|
|
336
|
+
</div>
|
|
337
|
+
)
|
|
338
|
+
}
|
|
296
339
|
{description && <p class="text-gray-600 text-xs mb-5">{description}</p>}
|
|
297
340
|
|
|
298
341
|
{
|
|
@@ -345,7 +388,20 @@ const instanceId = `${id}-${Math.random().toString(36).substring(2, 9)}`;
|
|
|
345
388
|
)
|
|
346
389
|
}
|
|
347
390
|
|
|
348
|
-
{!properties && <p class="text-gray-500 text-sm">Schema does not contain any properties.</p>}
|
|
391
|
+
{!properties && !isRootArray && <p class="text-gray-500 text-sm">Schema does not contain any properties.</p>}
|
|
392
|
+
{
|
|
393
|
+
!properties && isRootArray && (
|
|
394
|
+
<div class="text-center py-8">
|
|
395
|
+
<div class="text-gray-500 text-sm">
|
|
396
|
+
<p>
|
|
397
|
+
This array contains items of type:{' '}
|
|
398
|
+
<span class="font-mono text-blue-600">{processedSchema.items?.type || 'unknown'}</span>
|
|
399
|
+
</p>
|
|
400
|
+
{processedSchema.items?.description && <p class="text-xs mt-2 text-gray-600">{processedSchema.items.description}</p>}
|
|
401
|
+
</div>
|
|
402
|
+
</div>
|
|
403
|
+
)
|
|
404
|
+
}
|
|
349
405
|
</div>
|
|
350
406
|
</div>
|
|
351
407
|
|
|
@@ -7,6 +7,7 @@ import VerticalSideBarLayout from '@layouts/VerticalSideBarLayout.astro';
|
|
|
7
7
|
import DomainGrid from '@components/Grids/DomainGrid';
|
|
8
8
|
import ServiceGrid from '@components/Grids/ServiceGrid';
|
|
9
9
|
import MessageGrid from '@components/Grids/MessageGrid';
|
|
10
|
+
import { removeContentFromCollection } from '@utils/collections/util';
|
|
10
11
|
|
|
11
12
|
import type { CollectionEntry } from 'astro:content';
|
|
12
13
|
import type { CollectionMessageTypes } from '@types';
|
|
@@ -64,13 +65,9 @@ if (type === 'services') {
|
|
|
64
65
|
}) as unknown as Service[];
|
|
65
66
|
items = filteredServices;
|
|
66
67
|
} else if (type === 'messages') {
|
|
67
|
-
const { events, commands, queries } = await getMessages({ getAllVersions: false });
|
|
68
|
+
const { events, commands, queries } = await getMessages({ getAllVersions: false, hydrateServices: false });
|
|
68
69
|
const messages = [...events, ...commands, ...queries];
|
|
69
|
-
items = messages
|
|
70
|
-
...m,
|
|
71
|
-
body: undefined,
|
|
72
|
-
catalog: undefined,
|
|
73
|
-
})) as unknown as CollectionEntry<CollectionMessageTypes>[];
|
|
70
|
+
items = removeContentFromCollection(messages) as unknown as CollectionEntry<CollectionMessageTypes>[];
|
|
74
71
|
}
|
|
75
72
|
---
|
|
76
73
|
|
|
@@ -148,3 +148,11 @@ export const getDeprecatedDetails = (item: CollectionEntry<CollectionTypes>) =>
|
|
|
148
148
|
|
|
149
149
|
return options;
|
|
150
150
|
};
|
|
151
|
+
|
|
152
|
+
export const removeContentFromCollection = (collection: CollectionEntry<CollectionTypes>[]) => {
|
|
153
|
+
return collection.map((item) => ({
|
|
154
|
+
...item,
|
|
155
|
+
body: undefined,
|
|
156
|
+
catalog: undefined,
|
|
157
|
+
}));
|
|
158
|
+
};
|
|
@@ -15,6 +15,7 @@ type Command = CollectionEntry<'commands'> & {
|
|
|
15
15
|
|
|
16
16
|
interface Props {
|
|
17
17
|
getAllVersions?: boolean;
|
|
18
|
+
hydrateServices?: boolean;
|
|
18
19
|
}
|
|
19
20
|
|
|
20
21
|
// cache for build time
|
|
@@ -23,10 +24,10 @@ let cachedCommands: Record<string, Command[]> = {
|
|
|
23
24
|
currentVersions: [],
|
|
24
25
|
};
|
|
25
26
|
|
|
26
|
-
export const getCommands = async ({ getAllVersions = true }: Props = {}): Promise<Command[]> => {
|
|
27
|
+
export const getCommands = async ({ getAllVersions = true, hydrateServices = true }: Props = {}): Promise<Command[]> => {
|
|
27
28
|
const cacheKey = getAllVersions ? 'allVersions' : 'currentVersions';
|
|
28
29
|
|
|
29
|
-
if (cachedCommands[cacheKey].length > 0) {
|
|
30
|
+
if (cachedCommands[cacheKey].length > 0 && hydrateServices) {
|
|
30
31
|
return cachedCommands[cacheKey];
|
|
31
32
|
}
|
|
32
33
|
|
|
@@ -37,24 +38,35 @@ export const getCommands = async ({ getAllVersions = true }: Props = {}): Promis
|
|
|
37
38
|
const services = await getCollection('services');
|
|
38
39
|
const allChannels = await getCollection('channels');
|
|
39
40
|
|
|
41
|
+
// @ts-ignore
|
|
40
42
|
cachedCommands[cacheKey] = commands.map((command) => {
|
|
41
43
|
const { latestVersion, versions } = getVersionForCollectionItem(command, commands);
|
|
42
44
|
|
|
43
|
-
const producers = services
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
45
|
+
const producers = services
|
|
46
|
+
.filter((service) => {
|
|
47
|
+
return service.data.sends?.some((item) => {
|
|
48
|
+
if (item.id != command.data.id) return false;
|
|
49
|
+
if (item.version == 'latest' || item.version == undefined) return command.data.version == latestVersion;
|
|
50
|
+
return satisfies(command.data.version, item.version);
|
|
51
|
+
});
|
|
52
|
+
})
|
|
53
|
+
.map((service) => {
|
|
54
|
+
if (!hydrateServices) return { id: service.id, version: service.data.version };
|
|
55
|
+
return service;
|
|
48
56
|
});
|
|
49
|
-
});
|
|
50
57
|
|
|
51
|
-
const consumers = services
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
58
|
+
const consumers = services
|
|
59
|
+
.filter((service) => {
|
|
60
|
+
return service.data.receives?.some((item) => {
|
|
61
|
+
if (item.id != command.data.id) return false;
|
|
62
|
+
if (item.version == 'latest' || item.version == undefined) return command.data.version == latestVersion;
|
|
63
|
+
return satisfies(command.data.version, item.version);
|
|
64
|
+
});
|
|
65
|
+
})
|
|
66
|
+
.map((service) => {
|
|
67
|
+
if (!hydrateServices) return { id: service.id, version: service.data.version };
|
|
68
|
+
return service;
|
|
56
69
|
});
|
|
57
|
-
});
|
|
58
70
|
|
|
59
71
|
const messageChannels = command.data.channels || [];
|
|
60
72
|
const channelsForCommand = allChannels.filter((c) => messageChannels.some((channel) => c.data.id === channel.id));
|
|
@@ -15,6 +15,7 @@ type Event = CollectionEntry<'events'> & {
|
|
|
15
15
|
|
|
16
16
|
interface Props {
|
|
17
17
|
getAllVersions?: boolean;
|
|
18
|
+
hydrateServices?: boolean;
|
|
18
19
|
}
|
|
19
20
|
|
|
20
21
|
// cache for build time
|
|
@@ -23,10 +24,10 @@ let cachedEvents: Record<string, Event[]> = {
|
|
|
23
24
|
currentVersions: [],
|
|
24
25
|
};
|
|
25
26
|
|
|
26
|
-
export const getEvents = async ({ getAllVersions = true }: Props = {}): Promise<Event[]> => {
|
|
27
|
+
export const getEvents = async ({ getAllVersions = true, hydrateServices = true }: Props = {}): Promise<Event[]> => {
|
|
27
28
|
const cacheKey = getAllVersions ? 'allVersions' : 'currentVersions';
|
|
28
29
|
|
|
29
|
-
if (cachedEvents[cacheKey].length > 0) {
|
|
30
|
+
if (cachedEvents[cacheKey].length > 0 && hydrateServices) {
|
|
30
31
|
return cachedEvents[cacheKey];
|
|
31
32
|
}
|
|
32
33
|
|
|
@@ -37,24 +38,35 @@ export const getEvents = async ({ getAllVersions = true }: Props = {}): Promise<
|
|
|
37
38
|
const services = await getCollection('services');
|
|
38
39
|
const allChannels = await getCollection('channels');
|
|
39
40
|
|
|
41
|
+
// @ts-ignore
|
|
40
42
|
cachedEvents[cacheKey] = events.map((event) => {
|
|
41
43
|
const { latestVersion, versions } = getVersionForCollectionItem(event, events);
|
|
42
44
|
|
|
43
|
-
const producers = services
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
45
|
+
const producers = services
|
|
46
|
+
.filter((service) =>
|
|
47
|
+
service.data.sends?.some((item) => {
|
|
48
|
+
if (item.id != event.data.id) return false;
|
|
49
|
+
if (item.version == 'latest' || item.version == undefined) return event.data.version == latestVersion;
|
|
50
|
+
return satisfies(event.data.version, item.version);
|
|
51
|
+
})
|
|
52
|
+
)
|
|
53
|
+
.map((service) => {
|
|
54
|
+
if (!hydrateServices) return { id: service.id, version: service.data.version };
|
|
55
|
+
return service;
|
|
56
|
+
});
|
|
50
57
|
|
|
51
|
-
const consumers = services
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
+
const consumers = services
|
|
59
|
+
.filter((service) =>
|
|
60
|
+
service.data.receives?.some((item) => {
|
|
61
|
+
if (item.id != event.data.id) return false;
|
|
62
|
+
if (item.version == 'latest' || item.version == undefined) return event.data.version == latestVersion;
|
|
63
|
+
return satisfies(event.data.version, item.version);
|
|
64
|
+
})
|
|
65
|
+
)
|
|
66
|
+
.map((service) => {
|
|
67
|
+
if (!hydrateServices) return { id: service.id, version: service.data.version };
|
|
68
|
+
return service;
|
|
69
|
+
});
|
|
58
70
|
|
|
59
71
|
const messageChannels = event.data.channels || [];
|
|
60
72
|
const channelsForEvent = allChannels.filter((c) => messageChannels.some((channel) => c.data.id === channel.id));
|
|
@@ -8,6 +8,7 @@ export { getEvents } from '@utils/events';
|
|
|
8
8
|
|
|
9
9
|
interface Props {
|
|
10
10
|
getAllVersions?: boolean;
|
|
11
|
+
hydrateServices?: boolean;
|
|
11
12
|
}
|
|
12
13
|
|
|
13
14
|
type Messages = {
|
|
@@ -17,11 +18,11 @@ type Messages = {
|
|
|
17
18
|
};
|
|
18
19
|
|
|
19
20
|
// Main function that uses the imported functions
|
|
20
|
-
export const getMessages = async ({ getAllVersions = true }: Props = {}): Promise<Messages> => {
|
|
21
|
+
export const getMessages = async ({ getAllVersions = true, hydrateServices = true }: Props = {}): Promise<Messages> => {
|
|
21
22
|
const [commands, events, queries] = await Promise.all([
|
|
22
|
-
getCommands({ getAllVersions }),
|
|
23
|
-
getEvents({ getAllVersions }),
|
|
24
|
-
getQueries({ getAllVersions }),
|
|
23
|
+
getCommands({ getAllVersions, hydrateServices }),
|
|
24
|
+
getEvents({ getAllVersions, hydrateServices }),
|
|
25
|
+
getQueries({ getAllVersions, hydrateServices }),
|
|
25
26
|
]);
|
|
26
27
|
|
|
27
28
|
return {
|
|
@@ -15,6 +15,7 @@ type Query = CollectionEntry<'queries'> & {
|
|
|
15
15
|
|
|
16
16
|
interface Props {
|
|
17
17
|
getAllVersions?: boolean;
|
|
18
|
+
hydrateServices?: boolean;
|
|
18
19
|
}
|
|
19
20
|
|
|
20
21
|
// Cache for build time
|
|
@@ -23,10 +24,10 @@ let cachedQueries: Record<string, Query[]> = {
|
|
|
23
24
|
currentVersions: [],
|
|
24
25
|
};
|
|
25
26
|
|
|
26
|
-
export const getQueries = async ({ getAllVersions = true }: Props = {}): Promise<Query[]> => {
|
|
27
|
+
export const getQueries = async ({ getAllVersions = true, hydrateServices = true }: Props = {}): Promise<Query[]> => {
|
|
27
28
|
const cacheKey = getAllVersions ? 'allVersions' : 'currentVersions';
|
|
28
29
|
|
|
29
|
-
if (cachedQueries[cacheKey].length > 0) {
|
|
30
|
+
if (cachedQueries[cacheKey].length > 0 && hydrateServices) {
|
|
30
31
|
return cachedQueries[cacheKey];
|
|
31
32
|
}
|
|
32
33
|
|
|
@@ -37,24 +38,35 @@ export const getQueries = async ({ getAllVersions = true }: Props = {}): Promise
|
|
|
37
38
|
const services = await getCollection('services');
|
|
38
39
|
const allChannels = await getCollection('channels');
|
|
39
40
|
|
|
41
|
+
// @ts-ignore
|
|
40
42
|
cachedQueries[cacheKey] = queries.map((query) => {
|
|
41
43
|
const { latestVersion, versions } = getVersionForCollectionItem(query, queries);
|
|
42
44
|
|
|
43
|
-
const producers = services
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
45
|
+
const producers = services
|
|
46
|
+
.filter((service) =>
|
|
47
|
+
service.data.sends?.some((item) => {
|
|
48
|
+
if (item.id != query.data.id) return false;
|
|
49
|
+
if (item.version == 'latest' || item.version == undefined) return query.data.version == latestVersion;
|
|
50
|
+
return satisfies(query.data.version, item.version);
|
|
51
|
+
})
|
|
52
|
+
)
|
|
53
|
+
.map((service) => {
|
|
54
|
+
if (!hydrateServices) return { id: service.id, version: service.data.version };
|
|
55
|
+
return service;
|
|
56
|
+
});
|
|
50
57
|
|
|
51
|
-
const consumers = services
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
+
const consumers = services
|
|
59
|
+
.filter((service) =>
|
|
60
|
+
service.data.receives?.some((item) => {
|
|
61
|
+
if (item.id != query.data.id) return false;
|
|
62
|
+
if (item.version == 'latest' || item.version == undefined) return query.data.version == latestVersion;
|
|
63
|
+
return satisfies(query.data.version, item.version);
|
|
64
|
+
})
|
|
65
|
+
)
|
|
66
|
+
.map((service) => {
|
|
67
|
+
if (!hydrateServices) return { id: service.id, version: service.data.version };
|
|
68
|
+
return service;
|
|
69
|
+
});
|
|
58
70
|
|
|
59
71
|
const messageChannels = query.data.channels || [];
|
|
60
72
|
const channelsForQuery = allChannels.filter((c) => messageChannels.some((channel) => c.data.id === channel.id));
|