@eventcatalog/core 3.28.2 → 3.28.4

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 = "3.28.2";
40
+ var version = "3.28.4";
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-LVGHWP4C.js";
4
- import "../chunk-5ZS4S6VX.js";
3
+ } from "../chunk-34MH7O22.js";
4
+ import "../chunk-45JFXFTE.js";
5
5
  export {
6
6
  raiseEvent
7
7
  };
@@ -111,7 +111,7 @@ var import_axios = __toESM(require("axios"), 1);
111
111
  var import_os = __toESM(require("os"), 1);
112
112
 
113
113
  // package.json
114
- var version = "3.28.2";
114
+ var version = "3.28.4";
115
115
 
116
116
  // src/constants.ts
117
117
  var VERSION = version;
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  log_build_default
3
- } from "../chunk-O4RPLUS4.js";
4
- import "../chunk-LVGHWP4C.js";
3
+ } from "../chunk-BGEC3Y5J.js";
4
+ import "../chunk-34MH7O22.js";
5
5
  import "../chunk-4UVFXLPI.js";
6
- import "../chunk-5ZS4S6VX.js";
6
+ import "../chunk-45JFXFTE.js";
7
7
  import "../chunk-5T63CXKU.js";
8
8
  export {
9
9
  log_build_default as default
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  VERSION
3
- } from "./chunk-5ZS4S6VX.js";
3
+ } from "./chunk-45JFXFTE.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 = "3.28.2";
2
+ var version = "3.28.4";
3
3
 
4
4
  // src/constants.ts
5
5
  var VERSION = version;
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  VERSION
3
- } from "./chunk-5ZS4S6VX.js";
3
+ } from "./chunk-45JFXFTE.js";
4
4
 
5
5
  // src/utils/cli-logger.ts
6
6
  import pc from "picocolors";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  raiseEvent
3
- } from "./chunk-LVGHWP4C.js";
3
+ } from "./chunk-34MH7O22.js";
4
4
  import {
5
5
  countResources,
6
6
  serializeCounts
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  logger
3
- } from "./chunk-3LXRFH5D.js";
3
+ } from "./chunk-4FMLF7P3.js";
4
4
  import {
5
5
  cleanup,
6
6
  getEventCatalogConfigFile
@@ -25,7 +25,7 @@ __export(constants_exports, {
25
25
  module.exports = __toCommonJS(constants_exports);
26
26
 
27
27
  // package.json
28
- var version = "3.28.2";
28
+ var version = "3.28.4";
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-5ZS4S6VX.js";
3
+ } from "./chunk-45JFXFTE.js";
4
4
  export {
5
5
  VERSION
6
6
  };
@@ -114,7 +114,7 @@ var verifyRequiredFieldsAreInCatalogConfigFile = async (projectDirectory) => {
114
114
  var import_picocolors = __toESM(require("picocolors"), 1);
115
115
 
116
116
  // package.json
117
- var version = "3.28.2";
117
+ var version = "3.28.4";
118
118
 
119
119
  // src/constants.ts
120
120
  var VERSION = version;
@@ -6,8 +6,8 @@ import {
6
6
  } from "./chunk-PLNJC7NZ.js";
7
7
  import {
8
8
  log_build_default
9
- } from "./chunk-O4RPLUS4.js";
10
- import "./chunk-LVGHWP4C.js";
9
+ } from "./chunk-BGEC3Y5J.js";
10
+ import "./chunk-34MH7O22.js";
11
11
  import "./chunk-4UVFXLPI.js";
12
12
  import {
13
13
  runMigrations
@@ -22,13 +22,13 @@ import {
22
22
  } from "./chunk-3KXCGYET.js";
23
23
  import {
24
24
  generate
25
- } from "./chunk-7HW6TPKN.js";
25
+ } from "./chunk-TSBHPGIL.js";
26
26
  import {
27
27
  logger
28
- } from "./chunk-3LXRFH5D.js";
28
+ } from "./chunk-4FMLF7P3.js";
29
29
  import {
30
30
  VERSION
31
- } from "./chunk-5ZS4S6VX.js";
31
+ } from "./chunk-45JFXFTE.js";
32
32
  import {
33
33
  getEventCatalogConfigFile,
34
34
  verifyRequiredFieldsAreInCatalogConfigFile
package/dist/generate.cjs CHANGED
@@ -78,7 +78,7 @@ var getEventCatalogConfigFile = async (projectDirectory) => {
78
78
  var import_picocolors = __toESM(require("picocolors"), 1);
79
79
 
80
80
  // package.json
81
- var version = "3.28.2";
81
+ var version = "3.28.4";
82
82
 
83
83
  // src/constants.ts
84
84
  var VERSION = version;
package/dist/generate.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  generate
3
- } from "./chunk-7HW6TPKN.js";
4
- import "./chunk-3LXRFH5D.js";
5
- import "./chunk-5ZS4S6VX.js";
3
+ } from "./chunk-TSBHPGIL.js";
4
+ import "./chunk-4FMLF7P3.js";
5
+ import "./chunk-45JFXFTE.js";
6
6
  import "./chunk-5T63CXKU.js";
7
7
  export {
8
8
  generate
@@ -36,7 +36,7 @@ module.exports = __toCommonJS(cli_logger_exports);
36
36
  var import_picocolors = __toESM(require("picocolors"), 1);
37
37
 
38
38
  // package.json
39
- var version = "3.28.2";
39
+ var version = "3.28.4";
40
40
 
41
41
  // src/constants.ts
42
42
  var VERSION = version;
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  logger
3
- } from "../chunk-3LXRFH5D.js";
4
- import "../chunk-5ZS4S6VX.js";
3
+ } from "../chunk-4FMLF7P3.js";
4
+ import "../chunk-45JFXFTE.js";
5
5
  export {
6
6
  logger
7
7
  };
@@ -19,6 +19,18 @@ interface SchemaPropertyProps {
19
19
  expand: boolean;
20
20
  }
21
21
 
22
+ // JSON Schema allows `type` to be a string or an array of strings (e.g. ["object", "null"]).
23
+ // These helpers normalise both forms so the rest of the viewer can treat type checks uniformly.
24
+ function hasType(type: any, candidate: string): boolean {
25
+ if (Array.isArray(type)) return type.includes(candidate);
26
+ return type === candidate;
27
+ }
28
+
29
+ function formatType(type: any): string {
30
+ if (Array.isArray(type)) return type.join(' | ');
31
+ return type ?? '';
32
+ }
33
+
22
34
  // Helper function to count properties recursively
23
35
  function countProperties(obj: any): number {
24
36
  if (!obj || typeof obj !== 'object') return 0;
@@ -196,7 +208,7 @@ function processSchema(schema: any, rootSchema?: any): any {
196
208
  }
197
209
 
198
210
  // Process array items
199
- if (schema.type === 'array' && schema.items) {
211
+ if (hasType(schema.type, 'array') && schema.items) {
200
212
  schema = { ...schema, items: processSchema(schema.items, root) };
201
213
  }
202
214
 
@@ -269,11 +281,11 @@ const SchemaProperty = ({ name, details, isRequired, level, isListItem = false,
269
281
  setIsExpanded(expand);
270
282
  }, [expand]);
271
283
 
272
- const hasNestedProperties = details.type === 'object' && details.properties && Object.keys(details.properties).length > 0;
273
- const hasArrayItems = details.type === 'array' && details.items;
284
+ const hasNestedProperties = hasType(details.type, 'object') && details.properties && Object.keys(details.properties).length > 0;
285
+ const hasArrayItems = hasType(details.type, 'array') && details.items;
274
286
  const hasArrayItemProperties =
275
287
  hasArrayItems &&
276
- ((details.items.type === 'object' && details.items.properties) ||
288
+ ((hasType(details.items.type, 'object') && details.items.properties) ||
277
289
  details.items.allOf ||
278
290
  details.items.oneOf ||
279
291
  details.items.anyOf ||
@@ -307,8 +319,8 @@ const SchemaProperty = ({ name, details, isRequired, level, isListItem = false,
307
319
  <div>
308
320
  <span className="font-semibold text-[rgb(var(--ec-page-text))] text-sm">{name}</span>
309
321
  <span className="ml-1.5 text-[rgb(var(--ec-accent))] font-mono text-xs">
310
- {hasVariants ? (details.variantType === 'anyOf' ? 'anyOf' : 'oneOf') : details.type}
311
- {details.type === 'array' && details.items?.type ? `[${details.items.type}]` : ''}
322
+ {hasVariants ? (details.variantType === 'anyOf' ? 'anyOf' : 'oneOf') : formatType(details.type)}
323
+ {hasType(details.type, 'array') && details.items?.type ? `[${formatType(details.items.type)}]` : ''}
312
324
  {details.format ? `<${details.format}>` : ''}
313
325
  {details._refPath && (
314
326
  <span className="text-blue-600 dark:text-blue-400 ml-1">→ {details._refName || details._refPath}</span>
@@ -513,9 +525,9 @@ export default function JSONSchemaViewer({
513
525
  let display = processedSchema;
514
526
  let isArray = false;
515
527
 
516
- if (processedSchema.type === 'array' && processedSchema.items) {
528
+ if (hasType(processedSchema.type, 'array') && processedSchema.items) {
517
529
  isArray = true;
518
- if (processedSchema.items.type === 'object' && processedSchema.items.properties) {
530
+ if (hasType(processedSchema.items.type, 'object') && processedSchema.items.properties) {
519
531
  display = {
520
532
  ...processedSchema.items,
521
533
  description: processedSchema.description || processedSchema.items.description,
@@ -838,7 +850,9 @@ export default function JSONSchemaViewer({
838
850
  <div className="text-[rgb(var(--ec-page-text-muted))] text-sm">
839
851
  <p>
840
852
  This array contains items of type:{' '}
841
- <span className="font-mono text-blue-600 dark:text-blue-400">{processedSchema.items?.type || 'unknown'}</span>
853
+ <span className="font-mono text-blue-600 dark:text-blue-400">
854
+ {processedSchema.items?.type ? formatType(processedSchema.items.type) : 'unknown'}
855
+ </span>
842
856
  </p>
843
857
  {processedSchema.items?.description && (
844
858
  <p className="text-xs mt-2 text-[rgb(var(--ec-page-text-muted))]">{processedSchema.items.description}</p>
@@ -0,0 +1,75 @@
1
+ // Exposes the raw markdown for a resource doc.
2
+ // Example: /docs/services/OrdersService/1.0.0/adrs/01-some-decision.md
3
+ // Used by llms.txt so LLMs can fetch the markdown directly.
4
+
5
+ import type { APIRoute } from 'astro';
6
+ import fs from 'fs';
7
+ import { isLLMSTxtEnabled, isResourceDocsEnabled, isSSR } from '@utils/feature';
8
+ import { getResourceDocs, getResourceDocsForResource, type ResourceCollection } from '@utils/collections/resource-docs';
9
+
10
+ const supportedResourceCollections = new Set<ResourceCollection>([
11
+ 'domains',
12
+ 'services',
13
+ 'events',
14
+ 'commands',
15
+ 'queries',
16
+ 'flows',
17
+ 'containers',
18
+ 'channels',
19
+ 'entities',
20
+ 'data-products',
21
+ ]);
22
+
23
+ export async function getStaticPaths() {
24
+ if (isSSR() || !isLLMSTxtEnabled() || !isResourceDocsEnabled()) {
25
+ return [];
26
+ }
27
+
28
+ const docs = await getResourceDocs();
29
+ const latestDocs = docs.filter((doc) => doc.data.version === doc.data.latestVersion);
30
+
31
+ return latestDocs.map((doc) => ({
32
+ params: {
33
+ type: doc.data.resourceCollection,
34
+ id: doc.data.resourceId,
35
+ version: doc.data.resourceVersion,
36
+ docType: doc.data.type,
37
+ docId: doc.data.id,
38
+ },
39
+ props: { filePath: doc.filePath },
40
+ }));
41
+ }
42
+
43
+ export const GET: APIRoute = async ({ params, props }) => {
44
+ if (!isLLMSTxtEnabled()) {
45
+ return new Response('llms.txt is not enabled for this Catalog.', { status: 404 });
46
+ }
47
+
48
+ if (!isResourceDocsEnabled()) {
49
+ return new Response('Resource docs are not enabled for this Catalog.', { status: 404 });
50
+ }
51
+
52
+ let filePath = (props as { filePath?: string } | undefined)?.filePath;
53
+
54
+ if (!filePath && isSSR()) {
55
+ const type = params.type as ResourceCollection | undefined;
56
+ if (!type || !supportedResourceCollections.has(type)) {
57
+ return new Response('Not found', { status: 404 });
58
+ }
59
+ const docsForResource = await getResourceDocsForResource(type, params.id ?? '', params.version ?? '');
60
+ const doc = docsForResource.find(
61
+ (resourceDoc) =>
62
+ resourceDoc.data.type === params.docType &&
63
+ resourceDoc.data.id === params.docId &&
64
+ resourceDoc.data.version === resourceDoc.data.latestVersion
65
+ );
66
+ filePath = doc?.filePath;
67
+ }
68
+
69
+ if (!filePath) {
70
+ return new Response('Not found', { status: 404 });
71
+ }
72
+
73
+ const file = fs.readFileSync(filePath, 'utf8');
74
+ return new Response(file, { status: 200, headers: { 'Content-Type': 'text/markdown; charset=utf-8' } });
75
+ };
@@ -0,0 +1,75 @@
1
+ // Exposes the raw mdx for a resource doc.
2
+ // Example: /docs/services/OrdersService/1.0.0/adrs/01-some-decision.mdx
3
+ // Used by llms.txt so LLMs can fetch the markdown directly.
4
+
5
+ import type { APIRoute } from 'astro';
6
+ import fs from 'fs';
7
+ import { isLLMSTxtEnabled, isResourceDocsEnabled, isSSR } from '@utils/feature';
8
+ import { getResourceDocs, getResourceDocsForResource, type ResourceCollection } from '@utils/collections/resource-docs';
9
+
10
+ const supportedResourceCollections = new Set<ResourceCollection>([
11
+ 'domains',
12
+ 'services',
13
+ 'events',
14
+ 'commands',
15
+ 'queries',
16
+ 'flows',
17
+ 'containers',
18
+ 'channels',
19
+ 'entities',
20
+ 'data-products',
21
+ ]);
22
+
23
+ export async function getStaticPaths() {
24
+ if (isSSR() || !isLLMSTxtEnabled() || !isResourceDocsEnabled()) {
25
+ return [];
26
+ }
27
+
28
+ const docs = await getResourceDocs();
29
+ const latestDocs = docs.filter((doc) => doc.data.version === doc.data.latestVersion);
30
+
31
+ return latestDocs.map((doc) => ({
32
+ params: {
33
+ type: doc.data.resourceCollection,
34
+ id: doc.data.resourceId,
35
+ version: doc.data.resourceVersion,
36
+ docType: doc.data.type,
37
+ docId: doc.data.id,
38
+ },
39
+ props: { filePath: doc.filePath },
40
+ }));
41
+ }
42
+
43
+ export const GET: APIRoute = async ({ params, props }) => {
44
+ if (!isLLMSTxtEnabled()) {
45
+ return new Response('llms.txt is not enabled for this Catalog.', { status: 404 });
46
+ }
47
+
48
+ if (!isResourceDocsEnabled()) {
49
+ return new Response('Resource docs are not enabled for this Catalog.', { status: 404 });
50
+ }
51
+
52
+ let filePath = (props as { filePath?: string } | undefined)?.filePath;
53
+
54
+ if (!filePath && isSSR()) {
55
+ const type = params.type as ResourceCollection | undefined;
56
+ if (!type || !supportedResourceCollections.has(type)) {
57
+ return new Response('Not found', { status: 404 });
58
+ }
59
+ const docsForResource = await getResourceDocsForResource(type, params.id ?? '', params.version ?? '');
60
+ const doc = docsForResource.find(
61
+ (resourceDoc) =>
62
+ resourceDoc.data.type === params.docType &&
63
+ resourceDoc.data.id === params.docId &&
64
+ resourceDoc.data.version === resourceDoc.data.latestVersion
65
+ );
66
+ filePath = doc?.filePath;
67
+ }
68
+
69
+ if (!filePath) {
70
+ return new Response('Not found', { status: 404 });
71
+ }
72
+
73
+ const file = fs.readFileSync(filePath, 'utf8');
74
+ return new Response(file, { status: 200, headers: { 'Content-Type': 'text/markdown; charset=utf-8' } });
75
+ };
@@ -1,7 +1,7 @@
1
1
  import { getCollection, type CollectionEntry } from 'astro:content';
2
2
  import type { APIRoute } from 'astro';
3
3
  import fs from 'fs';
4
- import { isCustomDocsEnabled } from '@utils/feature';
4
+ import { isCustomDocsEnabled, isResourceDocsEnabled, isLLMSTxtEnabled } from '@utils/feature';
5
5
  import { addSchemaToMarkdown } from '@utils/llms';
6
6
 
7
7
  type AllowedCollections =
@@ -30,8 +30,7 @@ const channels = await getCollection('channels');
30
30
  const flows = await getCollection('flows');
31
31
  const containers = await getCollection('containers');
32
32
  const customDocs = await getCollection('customPages');
33
-
34
- import { isLLMSTxtEnabled } from '@utils/feature';
33
+ const resourceDocs = isResourceDocsEnabled() ? await getCollection('resourceDocs') : [];
35
34
 
36
35
  export const GET: APIRoute = async ({ params, request }) => {
37
36
  if (!isLLMSTxtEnabled()) {
@@ -56,6 +55,10 @@ export const GET: APIRoute = async ({ params, request }) => {
56
55
  resources.push(...(customDocs as CollectionEntry<AllowedCollections>[]));
57
56
  }
58
57
 
58
+ if (isResourceDocsEnabled()) {
59
+ resources.push(...(resourceDocs as CollectionEntry<AllowedCollections>[]));
60
+ }
61
+
59
62
  const content = resources
60
63
  .map((item) => {
61
64
  if (!item.filePath) return '';
@@ -2,8 +2,9 @@ import { getCollection } from 'astro:content';
2
2
  import config from '@config';
3
3
  import type { APIRoute } from 'astro';
4
4
 
5
- import { isCustomDocsEnabled } from '@utils/feature';
5
+ import { isCustomDocsEnabled, isResourceDocsEnabled } from '@utils/feature';
6
6
  import { getUbiquitousLanguage } from '@utils/collections/domains';
7
+ import { getResourceDocs } from '@utils/collections/resource-docs';
7
8
 
8
9
  const events = await getCollection('events');
9
10
  const commands = await getCollection('commands');
@@ -22,6 +23,7 @@ const containers = await getCollection('containers');
22
23
  const entities = await getCollection('entities');
23
24
 
24
25
  const customDocs = await getCollection('customPages');
26
+ const resourceDocsList = isResourceDocsEnabled() ? await getResourceDocs() : [];
25
27
 
26
28
  const ubiquitousLanguages: Record<string, { id: string; version: string; properties: any }[]> = {};
27
29
 
@@ -94,6 +96,36 @@ export const GET: APIRoute = async ({ params, request }) => {
94
96
  const formatCustomDoc = (item: any, route: string) =>
95
97
  `- [${item.data.title}](${baseUrl}/${route}/${item.id.replace('docs\/', '')}.mdx) - ${item.data.summary || ''}`;
96
98
 
99
+ const formatResourceDoc = (doc: any) => {
100
+ const { resourceCollection, resourceId, resourceVersion, type, id } = doc.data;
101
+ const title = doc.data.title || id || doc.id;
102
+ const docUrl = `${baseUrl}/docs/${resourceCollection}/${resourceId}/${resourceVersion}/${type}/${id}.mdx`;
103
+ return `- [${title}](${docUrl})${doc.data.summary ? ` - ${doc.data.summary}` : ''}`;
104
+ };
105
+
106
+ const renderResourceDocs = () => {
107
+ const grouped = new Map<string, { resourceCollection: string; resourceId: string; resourceVersion: string; docs: any[] }>();
108
+
109
+ for (const doc of resourceDocsList) {
110
+ const { resourceCollection, resourceId, resourceVersion } = doc.data;
111
+ const key = `${resourceCollection}:${resourceId}:${resourceVersion}`;
112
+ let group = grouped.get(key);
113
+ if (!group) {
114
+ group = { resourceCollection, resourceId, resourceVersion, docs: [] };
115
+ grouped.set(key, group);
116
+ }
117
+ group.docs.push(doc);
118
+ }
119
+
120
+ return Array.from(grouped.values())
121
+ .map((group) => {
122
+ const parentUrl = `${baseUrl}/docs/${group.resourceCollection}/${group.resourceId}/${group.resourceVersion}.mdx`;
123
+ const heading = `### [${group.resourceId}](${parentUrl}) (${group.resourceCollection})`;
124
+ return [heading, group.docs.map(formatResourceDoc).join('\n')].join('\n');
125
+ })
126
+ .join('\n\n');
127
+ };
128
+
97
129
  const content = [
98
130
  `# ${config.organizationName} EventCatalog Documentation\n`,
99
131
  `> ${config.tagline}\n`,
@@ -127,6 +159,7 @@ export const GET: APIRoute = async ({ params, request }) => {
127
159
  ...(isCustomDocsEnabled()
128
160
  ? ['\n## Custom Docs', customDocs.map((item) => formatCustomDoc(item, 'docs/custom')).join('\n')]
129
161
  : []),
162
+ ...(isResourceDocsEnabled() && resourceDocsList.length > 0 ? ['\n## Resource Docs', renderResourceDocs()] : []),
130
163
  ].join('\n');
131
164
 
132
165
  return new Response(content, {
@@ -1,6 +1,13 @@
1
1
  import { getCollection, type CollectionEntry } from 'astro:content';
2
2
  import dagre from 'dagre';
3
- import { createDagreGraph, calculatedNodes, DEFAULT_NODE_WIDTH, DEFAULT_NODE_HEIGHT } from '@utils/node-graphs/utils/utils';
3
+ import {
4
+ createDagreGraph,
5
+ calculatedNodes,
6
+ DEFAULT_NODE_WIDTH,
7
+ DEFAULT_NODE_HEIGHT,
8
+ buildContextMenuForResource,
9
+ buildContextMenuForService,
10
+ } from '@utils/node-graphs/utils/utils';
4
11
  import { MarkerType } from '@xyflow/react';
5
12
  import type { Node as NodeType } from '@xyflow/react';
6
13
  import { createVersionedMap, findInMap } from '@utils/collections/util';
@@ -101,9 +108,31 @@ export const getNodesAndEdges = async ({ id, defaultFlow, version, mode = 'simpl
101
108
  type: step.type,
102
109
  } as NodeType;
103
110
 
104
- if (step.service) node.data.service = { ...step.service, ...step.service.data };
105
- if (step.flow) node.data.flow = { ...step.flow, ...step.flow.data };
106
- if (step.message) node.data.message = { ...step.message, ...step.message.data };
111
+ if (step.service) {
112
+ node.data.service = { ...step.service, ...step.service.data };
113
+ node.data.contextMenu = buildContextMenuForService({
114
+ id: step.service.data.id,
115
+ version: step.service.data.version,
116
+ specifications: step.service.data.specifications,
117
+ repository: step.service.data.repository,
118
+ });
119
+ }
120
+ if (step.flow) {
121
+ node.data.flow = { ...step.flow, ...step.flow.data };
122
+ node.data.contextMenu = buildContextMenuForResource({
123
+ collection: 'flows',
124
+ id: step.flow.data.id,
125
+ version: step.flow.data.version,
126
+ });
127
+ }
128
+ if (step.message) {
129
+ node.data.message = { ...step.message, ...step.message.data };
130
+ node.data.contextMenu = buildContextMenuForResource({
131
+ collection: step.message.collection,
132
+ id: step.message.data.id,
133
+ version: step.message.data.version,
134
+ });
135
+ }
107
136
  if (step.actor) {
108
137
  node.data.actor = { ...step.actor, ...step.actor.data };
109
138
  node.data = { ...node.data, ...step.actor };
package/package.json CHANGED
@@ -7,7 +7,7 @@
7
7
  },
8
8
  "license": "SEE LICENSE IN LICENSE",
9
9
  "type": "module",
10
- "version": "3.28.2",
10
+ "version": "3.28.4",
11
11
  "publishConfig": {
12
12
  "access": "public"
13
13
  },
@@ -103,9 +103,9 @@
103
103
  "update-notifier": "^7.3.1",
104
104
  "uuid": "^10.0.0",
105
105
  "zod": "^4.3.6",
106
- "@eventcatalog/linter": "1.0.21",
107
- "@eventcatalog/visualiser": "^3.18.3",
108
- "@eventcatalog/sdk": "2.20.0"
106
+ "@eventcatalog/sdk": "2.20.0",
107
+ "@eventcatalog/visualiser": "^3.18.4",
108
+ "@eventcatalog/linter": "1.0.21"
109
109
  },
110
110
  "devDependencies": {
111
111
  "@astrojs/check": "^0.9.8",