@eventcatalog/core 4.12.2 → 5.0.0-beta.0

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 (268) hide show
  1. package/LICENSE +226 -95
  2. package/NOTICE +30 -0
  3. package/README.md +3 -2
  4. package/dist/analytics/analytics.cjs +1 -1
  5. package/dist/analytics/analytics.js +2 -2
  6. package/dist/analytics/log-build.cjs +43 -16
  7. package/dist/analytics/log-build.d.cts +6 -5
  8. package/dist/analytics/log-build.d.ts +6 -5
  9. package/dist/analytics/log-build.js +4 -3
  10. package/dist/{chunk-U4YJSTGV.js → chunk-AYNZXUB5.js} +2 -10
  11. package/dist/{chunk-IVVM67LN.js → chunk-CR6AK5LR.js} +1 -1
  12. package/dist/{chunk-GTIC4R74.js → chunk-LR7AGRHN.js} +13 -16
  13. package/dist/chunk-TQLRG35T.js +203 -0
  14. package/dist/{chunk-WK4J6FP3.js → chunk-TWN43V4T.js} +1 -1
  15. package/dist/{chunk-ZW3MYAWF.js → chunk-WAIADKQE.js} +1 -1
  16. package/dist/{chunk-RPVA2SZY.js → chunk-ZHKEARLJ.js} +1 -1
  17. package/dist/constants.cjs +1 -1
  18. package/dist/constants.js +1 -1
  19. package/dist/eventcatalog.cjs +407 -291
  20. package/dist/eventcatalog.config.d.cts +2 -3
  21. package/dist/eventcatalog.config.d.ts +2 -3
  22. package/dist/eventcatalog.js +30 -93
  23. package/dist/federation/content-cache.d.cts +0 -5
  24. package/dist/federation/content-cache.d.ts +0 -5
  25. package/dist/federation/diagnostics.d.cts +0 -5
  26. package/dist/federation/diagnostics.d.ts +0 -5
  27. package/dist/federation/federate.cjs +0 -9
  28. package/dist/federation/federate.d.cts +0 -5
  29. package/dist/federation/federate.d.ts +0 -5
  30. package/dist/federation/federate.js +2 -3
  31. package/dist/federation/filesystem-source-provider.d.cts +0 -5
  32. package/dist/federation/filesystem-source-provider.d.ts +0 -5
  33. package/dist/federation/github-source-provider.d.cts +0 -5
  34. package/dist/federation/github-source-provider.d.ts +0 -5
  35. package/dist/federation/output-transaction.d.cts +0 -4
  36. package/dist/federation/output-transaction.d.ts +0 -4
  37. package/dist/federation/public-assets.d.cts +0 -5
  38. package/dist/federation/public-assets.d.ts +0 -5
  39. package/dist/federation/source-provider.d.cts +0 -5
  40. package/dist/federation/source-provider.d.ts +0 -5
  41. package/dist/federation/types.d.cts +0 -5
  42. package/dist/federation/types.d.ts +0 -5
  43. package/dist/generate.cjs +1 -1
  44. package/dist/generate.js +3 -3
  45. package/dist/license-C1y-56bb.d.cts +23 -0
  46. package/dist/license-C1y-56bb.d.ts +23 -0
  47. package/dist/runtime-dependencies/@eventcatalog__visualiser__layout.mjs +3 -0
  48. package/dist/runtime-dependencies/@modelcontextprotocol__ext-apps.mjs +3 -0
  49. package/dist/runtime-dependencies/@modelcontextprotocol__ext-apps__react.mjs +3 -0
  50. package/dist/runtime-dependencies/@modelcontextprotocol__ext-apps__server.mjs +3 -0
  51. package/dist/runtime-dependencies/@modelcontextprotocol__sdk__types.js.mjs +3 -0
  52. package/dist/runtime-dependencies/manifest.json +12 -1
  53. package/dist/runtime-dependencies/react-syntax-highlighter__dist__esm__languages__prism__graphql.mjs +3 -0
  54. package/dist/runtime-dependencies/react-syntax-highlighter__dist__esm__languages__prism__json.mjs +3 -0
  55. package/dist/runtime-dependencies/react-syntax-highlighter__dist__esm__languages__prism__markup.mjs +3 -0
  56. package/dist/runtime-dependencies/react-syntax-highlighter__dist__esm__languages__prism__protobuf.mjs +3 -0
  57. package/dist/runtime-dependencies/react-syntax-highlighter__dist__esm__languages__prism__yaml.mjs +3 -0
  58. package/dist/runtime-dependencies/react-syntax-highlighter__dist__esm__styles__prism__one-dark.mjs +3 -0
  59. package/dist/runtime-dependencies/react-syntax-highlighter__dist__esm__styles__prism__one-light.mjs +3 -0
  60. package/dist/utils/cli-logger.cjs +1 -1
  61. package/dist/utils/cli-logger.js +2 -2
  62. package/dist/utils/license-status.cjs +240 -0
  63. package/dist/utils/license-status.d.cts +28 -0
  64. package/dist/utils/license-status.d.ts +28 -0
  65. package/dist/utils/license-status.js +12 -0
  66. package/eventcatalog/astro.config.mjs +1 -1
  67. package/eventcatalog/integrations/eventcatalog-runtime.mjs +1 -1
  68. package/eventcatalog/src/components/ChatPanel/ChatPanel.tsx +29 -19
  69. package/eventcatalog/src/components/ChatPanel/OfflineReply.tsx +74 -0
  70. package/eventcatalog/src/components/FieldsExplorer/FieldFilters.tsx +24 -28
  71. package/eventcatalog/src/components/FieldsExplorer/FieldNodeGraph.tsx +16 -11
  72. package/eventcatalog/src/components/FieldsExplorer/FieldsExplorer.tsx +4 -218
  73. package/eventcatalog/src/components/FieldsExplorer/FieldsTable.tsx +27 -36
  74. package/eventcatalog/src/components/Header.astro +43 -58
  75. package/eventcatalog/src/components/Lists/PillListFlat.styles.css +17 -17
  76. package/eventcatalog/src/components/MDX/EntityMap/EntityMap.astro +1 -1
  77. package/eventcatalog/src/components/MDX/Flow/Flow.astro +4 -0
  78. package/eventcatalog/src/components/MDX/NodeGraph/AstroNodeGraph.tsx +14 -0
  79. package/eventcatalog/src/components/MDX/NodeGraph/NodeGraph.astro +49 -18
  80. package/eventcatalog/src/components/MDX/RemoteFile.astro +2 -24
  81. package/eventcatalog/src/components/SchemaExplorer/ApiAccessSection.tsx +59 -93
  82. package/eventcatalog/src/components/SchemaExplorer/ApiContentViewer.tsx +1 -32
  83. package/eventcatalog/src/components/SchemaExplorer/DiffViewer.tsx +20 -67
  84. package/eventcatalog/src/components/SchemaExplorer/SchemaContentViewer.tsx +2 -11
  85. package/eventcatalog/src/components/SchemaExplorer/SchemaDetailsPanel.tsx +11 -60
  86. package/eventcatalog/src/components/SchemaExplorer/SchemaExplorer.tsx +1 -3
  87. package/eventcatalog/src/components/SchemaExplorer/SchemaPageViewer.tsx +0 -3
  88. package/eventcatalog/src/components/SchemaExplorer/VersionHistoryModal.tsx +2 -9
  89. package/eventcatalog/src/components/SchemaExplorer/parse-schema.ts +46 -0
  90. package/eventcatalog/src/components/SchemaExplorer/utils.ts +11 -0
  91. package/eventcatalog/src/components/Settings/AssistantSettingsForm.tsx +2 -9
  92. package/eventcatalog/src/components/Settings/LicenseSettings.tsx +288 -0
  93. package/eventcatalog/src/components/Settings/LlmAccessSettingsForm.tsx +3 -19
  94. package/eventcatalog/src/components/Settings/McpSettingsForm.tsx +85 -30
  95. package/eventcatalog/src/components/Settings/SettingsShared.tsx +7 -75
  96. package/eventcatalog/src/components/SideNav/CustomDocsNav.astro +2 -2
  97. package/eventcatalog/src/components/TrialBadge.astro +82 -0
  98. package/eventcatalog/src/content.config.ts +9 -90
  99. package/eventcatalog/src/{enterprise → features}/ai/chat-api.ts +22 -34
  100. package/eventcatalog/src/{enterprise → features}/analytics/adapters/ga4.ts +0 -5
  101. package/eventcatalog/src/{enterprise → features}/analytics/adapters/gtm.ts +0 -5
  102. package/eventcatalog/src/{enterprise → features}/analytics/adapters/posthog.ts +0 -5
  103. package/eventcatalog/src/{enterprise → features}/analytics/components/AnalyticsHead.astro +2 -4
  104. package/eventcatalog/src/{enterprise → features}/analytics/components/AnalyticsTracker.astro +2 -4
  105. package/eventcatalog/src/{enterprise → features}/analytics/tracker.ts +0 -5
  106. package/eventcatalog/src/{enterprise → features}/api/catalog.ts +0 -5
  107. package/eventcatalog/src/{enterprise → features}/auth/[...auth].ts +0 -5
  108. package/eventcatalog/src/{enterprise → features}/auth/middleware/middleware-auth.ts +0 -5
  109. package/eventcatalog/src/{enterprise → features}/auth/middleware/middleware.ts +0 -5
  110. package/eventcatalog/src/{enterprise → features}/collections/custom-pages.ts +0 -5
  111. package/eventcatalog/src/{enterprise → features}/collections/index.ts +0 -5
  112. package/eventcatalog/src/{enterprise → features}/collections/resource-docs.ts +0 -5
  113. package/eventcatalog/src/{enterprise → features}/custom-documentation/collection.ts +0 -5
  114. package/eventcatalog/src/features/custom-documentation/components/CustomDocsNav/CustomDocsNav.astro +9 -0
  115. package/eventcatalog/src/{enterprise → features}/custom-documentation/components/CustomDocsNav/CustomDocsNavWrapper.tsx +0 -5
  116. package/eventcatalog/src/{enterprise → features}/custom-documentation/components/CustomDocsNav/components/NestedItem.tsx +1 -6
  117. package/eventcatalog/src/{enterprise → features}/custom-documentation/components/CustomDocsNav/components/NoResultsFound.tsx +0 -5
  118. package/eventcatalog/src/{enterprise → features}/custom-documentation/components/CustomDocsNav/index.tsx +1 -6
  119. package/eventcatalog/src/{enterprise → features}/custom-documentation/components/CustomDocsNav/types.ts +0 -5
  120. package/eventcatalog/src/{enterprise/custom-documentation/pages/docs/custom/index.astro → features/custom-documentation/components/CustomDocumentationPage.astro} +5 -5
  121. package/eventcatalog/src/{enterprise → features}/custom-documentation/utils/badge-styles.ts +0 -5
  122. package/eventcatalog/src/{enterprise → features}/custom-documentation/utils/custom-docs.ts +1 -6
  123. package/eventcatalog/src/{enterprise → features}/custom-documentation/utils/docs-search.ts +0 -5
  124. package/eventcatalog/src/{enterprise → features}/custom-pages/routes.ts +0 -5
  125. package/eventcatalog/src/{enterprise → features}/directory/user-team-directory.ts +0 -5
  126. package/eventcatalog/src/{enterprise → features}/fields/field-extractor.ts +0 -5
  127. package/eventcatalog/src/{enterprise → features}/fields/field-indexer.ts +0 -5
  128. package/eventcatalog/src/{enterprise → features}/fields/fields-db.ts +0 -5
  129. package/eventcatalog/src/{enterprise → features}/fields/pages/api/fields.ts +1 -6
  130. package/eventcatalog/src/{enterprise → features}/fields/pages/fields.astro +1 -2
  131. package/eventcatalog/src/{enterprise → features}/integrations/eventcatalog-features.ts +17 -75
  132. package/eventcatalog/src/features/mcp/apps/architecture-diagram/links.ts +59 -0
  133. package/eventcatalog/src/features/mcp/apps/architecture-diagram/node-chat.tsx +299 -0
  134. package/eventcatalog/src/features/mcp/apps/architecture-diagram/shared.ts +14 -0
  135. package/eventcatalog/src/features/mcp/apps/architecture-diagram/view.tsx +454 -0
  136. package/eventcatalog/src/features/mcp/apps/generated/viewer.html +432 -0
  137. package/eventcatalog/src/features/mcp/apps/mermaid-stub.ts +10 -0
  138. package/eventcatalog/src/features/mcp/apps/schema-viewer/schema-code.tsx +65 -0
  139. package/eventcatalog/src/features/mcp/apps/schema-viewer/shared.ts +23 -0
  140. package/eventcatalog/src/features/mcp/apps/schema-viewer/view.tsx +170 -0
  141. package/eventcatalog/src/features/mcp/apps/shared/app-view.tsx +98 -0
  142. package/eventcatalog/src/features/mcp/apps/shared/resource-types.ts +15 -0
  143. package/eventcatalog/src/features/mcp/apps/viewer/shared.ts +24 -0
  144. package/eventcatalog/src/features/mcp/apps/viewer/styles.css +25 -0
  145. package/eventcatalog/src/features/mcp/apps/viewer/view.tsx +59 -0
  146. package/eventcatalog/src/features/mcp/mcp-app-icons.ts +63 -0
  147. package/eventcatalog/src/features/mcp/mcp-apps.ts +160 -0
  148. package/eventcatalog/src/{enterprise → features}/mcp/mcp-auth.ts +0 -5
  149. package/eventcatalog/src/{enterprise → features}/mcp/mcp-scope.ts +7 -7
  150. package/eventcatalog/src/{enterprise → features}/mcp/mcp-scoped-tools.ts +47 -40
  151. package/eventcatalog/src/{enterprise → features}/mcp/mcp-server.ts +347 -34
  152. package/eventcatalog/src/{enterprise → features}/mcp/oauth-protected-resource.ts +0 -5
  153. package/eventcatalog/src/features/mcp/schema-viewer.ts +24 -0
  154. package/eventcatalog/src/{enterprise → features}/tools/catalog-tools.ts +133 -102
  155. package/eventcatalog/src/features/tools/index.ts +5 -0
  156. package/eventcatalog/src/{enterprise → features}/visualizer-layout/reset.ts +0 -5
  157. package/eventcatalog/src/{enterprise → features}/visualizer-layout/save.ts +0 -5
  158. package/eventcatalog/src/layouts/BaseLayout.astro +2 -2
  159. package/eventcatalog/src/layouts/Footer.astro +31 -39
  160. package/eventcatalog/src/layouts/SettingsLayout.astro +6 -6
  161. package/eventcatalog/src/layouts/VerticalSideBarLayout.astro +7 -37
  162. package/eventcatalog/src/{enterprise → pages}/api/schemas/[collection]/[id]/[version]/index.ts +0 -22
  163. package/eventcatalog/src/{enterprise → pages}/api/schemas/services/[id]/[version]/[specification]/index.ts +0 -19
  164. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/[docVersion]/_index.data.ts +2 -6
  165. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/[docVersion]/index.astro +1 -5
  166. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/_index.data.ts +2 -6
  167. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/index.astro +1 -5
  168. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId].md.ts +2 -6
  169. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId].mdx.ts +2 -6
  170. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/index.astro +9 -5
  171. package/eventcatalog/src/pages/docs/custom/[...path]/index.astro +12 -0
  172. package/eventcatalog/src/{enterprise/custom-documentation/pages/docs/custom/root-index.astro → pages/docs/custom/index.astro} +1 -23
  173. package/eventcatalog/src/pages/docs/llm/llms-full.txt.ts +4 -9
  174. package/eventcatalog/src/pages/docs/llm/llms.txt.ts +4 -4
  175. package/eventcatalog/src/pages/docs/llm/schemas.txt.ts +0 -11
  176. package/eventcatalog/src/pages/docs/services/[id]/[docType]/[docId]/index.astro +2 -2
  177. package/eventcatalog/src/pages/index.astro +2 -2
  178. package/eventcatalog/src/pages/schemas/[type]/[id]/[version]/index.astro +0 -3
  179. package/eventcatalog/src/pages/schemas/explorer/index.astro +1 -4
  180. package/eventcatalog/src/pages/settings/assistant.astro +2 -4
  181. package/eventcatalog/src/pages/settings/license.astro +18 -0
  182. package/eventcatalog/src/pages/settings/llm-access.astro +1 -4
  183. package/eventcatalog/src/pages/settings/mcp.astro +33 -4
  184. package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/_index.data.ts +1 -2
  185. package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/data/index.astro +2 -45
  186. package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/entity-map/index.astro +1 -1
  187. package/eventcatalog/src/pages/visualiser/[type]/[id]/[version].mermaid.ts +7 -109
  188. package/eventcatalog/src/pages/visualiser/_mermaid-route.ts +78 -0
  189. package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/_index.data.ts +44 -0
  190. package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/entity-map/index.astro +1 -1
  191. package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/index.astro +56 -0
  192. package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/systems-context/index.astro +3 -40
  193. package/eventcatalog/src/pages/visualiser/domains/[id]/[version].mermaid.ts +20 -0
  194. package/eventcatalog/src/pages/visualiser/systems/[id]/[version]/_index.data.ts +29 -0
  195. package/eventcatalog/src/pages/visualiser/systems/[id]/[version]/context/index.astro +3 -38
  196. package/eventcatalog/src/pages/visualiser/systems/[id]/[version]/index.astro +56 -0
  197. package/eventcatalog/src/pages/visualiser/systems/[id]/[version].mermaid.ts +20 -0
  198. package/eventcatalog/src/stores/sidebar-store/builders/agent.ts +1 -1
  199. package/eventcatalog/src/stores/sidebar-store/builders/container.ts +1 -1
  200. package/eventcatalog/src/stores/sidebar-store/builders/data-product.ts +1 -1
  201. package/eventcatalog/src/stores/sidebar-store/builders/domain.ts +7 -32
  202. package/eventcatalog/src/stores/sidebar-store/builders/entity.ts +1 -1
  203. package/eventcatalog/src/stores/sidebar-store/builders/message.ts +1 -1
  204. package/eventcatalog/src/stores/sidebar-store/builders/service.ts +2 -8
  205. package/eventcatalog/src/stores/sidebar-store/builders/system.ts +2 -12
  206. package/eventcatalog/src/stores/sidebar-store/custom-sidebar.ts +0 -10
  207. package/eventcatalog/src/stores/sidebar-store/state.ts +4 -6
  208. package/eventcatalog/src/styles/theme.css +22 -18
  209. package/eventcatalog/src/styles/themes/forest.css +8 -8
  210. package/eventcatalog/src/styles/themes/ocean.css +8 -8
  211. package/eventcatalog/src/styles/themes/sapphire.css +8 -8
  212. package/eventcatalog/src/styles/themes/sunset.css +8 -8
  213. package/eventcatalog/src/utils/clipboard.ts +4 -4
  214. package/eventcatalog/src/utils/collections/flow-step-schema.ts +117 -0
  215. package/eventcatalog/src/utils/collections/pointer-schema.ts +7 -0
  216. package/eventcatalog/src/utils/collections/resource-docs.ts +677 -14
  217. package/eventcatalog/src/utils/collections/schema-loader.ts +0 -5
  218. package/eventcatalog/src/utils/feature.ts +14 -23
  219. package/eventcatalog/src/utils/license.ts +114 -0
  220. package/eventcatalog/src/utils/node-graphs/architecture-diagram-types.ts +32 -0
  221. package/eventcatalog/src/utils/node-graphs/architecture-diagram.ts +84 -0
  222. package/eventcatalog/src/utils/node-graphs/catalog-force-graph.ts +1 -0
  223. package/eventcatalog/src/utils/node-graphs/channel-node-graph.ts +4 -25
  224. package/eventcatalog/src/utils/node-graphs/container-node-graph.ts +12 -39
  225. package/eventcatalog/src/utils/node-graphs/data-products-node-graph.ts +11 -27
  226. package/eventcatalog/src/utils/node-graphs/domain-levels-node-graph.ts +679 -0
  227. package/eventcatalog/src/utils/node-graphs/domains-node-graph.ts +3 -20
  228. package/eventcatalog/src/utils/node-graphs/export-mermaid.ts +62 -4
  229. package/eventcatalog/src/utils/node-graphs/field-node-graph.ts +8 -23
  230. package/eventcatalog/src/utils/node-graphs/flow-lanes.ts +119 -0
  231. package/eventcatalog/src/utils/node-graphs/flows-node-graph.ts +153 -45
  232. package/eventcatalog/src/utils/node-graphs/layout-node-graph.ts +28 -0
  233. package/eventcatalog/src/utils/node-graphs/layout-persistence.ts +3 -3
  234. package/eventcatalog/src/utils/node-graphs/message-node-graph.ts +16 -34
  235. package/eventcatalog/src/utils/node-graphs/services-node-graph.ts +11 -25
  236. package/eventcatalog/src/utils/node-graphs/system-context-node-graph.ts +18 -54
  237. package/eventcatalog/src/utils/node-graphs/system-levels-node-graph.ts +59 -0
  238. package/eventcatalog/src/utils/node-graphs/systems-node-graph.ts +20 -80
  239. package/eventcatalog/src/utils/node-graphs/utils/utils.ts +1 -78
  240. package/eventcatalog/src/utils/trial.ts +36 -0
  241. package/eventcatalog/tsconfig.json +1 -1
  242. package/package.json +11 -11
  243. package/dist/chunk-FV56YFM4.js +0 -7
  244. package/dist/federation/entitlement.cjs +0 -31
  245. package/dist/federation/entitlement.d.cts +0 -12
  246. package/dist/federation/entitlement.d.ts +0 -12
  247. package/dist/federation/entitlement.js +0 -6
  248. package/dist/runtime-dependencies/dagre.mjs +0 -3
  249. package/eventcatalog/src/components/Settings/BillingSettingsForm.tsx +0 -265
  250. package/eventcatalog/src/enterprise/LICENSE +0 -57
  251. package/eventcatalog/src/enterprise/README.md +0 -5
  252. package/eventcatalog/src/enterprise/collections/resource-docs-utils.ts +0 -691
  253. package/eventcatalog/src/enterprise/custom-documentation/components/CustomDocsNav/CustomDocsNav.astro +0 -9
  254. package/eventcatalog/src/enterprise/custom-documentation/pages/docs/custom/[...path]/index.astro +0 -18
  255. package/eventcatalog/src/enterprise/custom-documentation/pages/docs/custom/feature.astro +0 -171
  256. package/eventcatalog/src/enterprise/feature.ts +0 -75
  257. package/eventcatalog/src/enterprise/tools/index.ts +0 -10
  258. package/eventcatalog/src/hooks/eventcatalog-visualizer.ts +0 -126
  259. package/eventcatalog/src/pages/settings/billing.astro +0 -17
  260. package/eventcatalog/src/pages/visualiser/domain-integrations/index.astro +0 -26
  261. package/eventcatalog/src/types/mcp-modules.d.ts +0 -67
  262. package/eventcatalog/src/utils/node-graphs/domains-canvas.ts +0 -261
  263. package/eventcatalog/src/utils/node-graphs/export-node-graph.ts +0 -91
  264. /package/eventcatalog/src/{enterprise → features}/auth/error.astro +0 -0
  265. /package/eventcatalog/src/{enterprise → features}/auth/login.astro +0 -0
  266. /package/eventcatalog/src/{enterprise → features}/auth/unauthorized.astro +0 -0
  267. /package/eventcatalog/src/{enterprise/custom-documentation/pages → pages}/docs/custom/[...path]/_index.data.ts +0 -0
  268. /package/eventcatalog/src/{enterprise/custom-documentation/pages → pages}/docs/custom/[...path].mdx.ts +0 -0
@@ -1,14 +1,12 @@
1
1
  ---
2
2
  import config from '@config';
3
- import { isIntegrationsEnabled } from '@utils/feature';
4
3
 
5
4
  const integrations = config.integrations;
6
5
  const cloudAnalytics = config.cloud?.analytics;
7
- const enabled = isIntegrationsEnabled() && integrations;
8
- const hasProviders = enabled && (integrations?.ga4 || integrations?.gtm || integrations?.posthog);
6
+ const hasProviders = !!(integrations?.ga4 || integrations?.gtm || integrations?.posthog);
9
7
  const debug = integrations?.debug ?? false;
10
8
  const isCloudAnalyticsEnabled = cloudAnalytics?.enabled === true && !!cloudAnalytics?.trackingId;
11
- const shouldRender = isCloudAnalyticsEnabled || (enabled && (hasProviders || debug));
9
+ const shouldRender = isCloudAnalyticsEnabled || (!!integrations && (hasProviders || debug));
12
10
 
13
11
  const base = (config.base || '/').replace(/\/$/, '');
14
12
  const baseJson = JSON.stringify(base);
@@ -1,8 +1,3 @@
1
- /**
2
- * Licensed under the EventCatalog Commercial License.
3
- * See /packages/core/eventcatalog/src/enterprise/LICENSE
4
- */
5
-
6
1
  export type EventProperties = Record<string, string | number | boolean>;
7
2
 
8
3
  export interface AnalyticsAdapter {
@@ -1,8 +1,3 @@
1
- /**
2
- * Licensed under the EventCatalog Commercial License.
3
- * See /packages/core/eventcatalog/src/enterprise/LICENSE
4
- */
5
-
6
1
  import type { APIRoute } from 'astro';
7
2
  import utils from '@eventcatalog/sdk';
8
3
  import { isSSR } from '@utils/feature';
@@ -1,8 +1,3 @@
1
- /**
2
- * Licensed under the EventCatalog Commercial License.
3
- * See /packages/core/eventcatalog/src/enterprise/LICENSE
4
- */
5
-
6
1
  import { AstroAuth } from '@utils/auth-astro/server';
7
2
  export const prerender = false;
8
3
  export const { GET, POST } = AstroAuth();
@@ -1,8 +1,3 @@
1
- /**
2
- * Licensed under the EventCatalog Commercial License.
3
- * See /packages/core/eventcatalog/src/enterprise/LICENSE
4
- */
5
-
6
1
  // src/middleware/auth.ts
7
2
  import type { MiddlewareHandler } from 'astro';
8
3
  import { getSession } from '@utils/auth-astro/server';
@@ -1,8 +1,3 @@
1
- /**
2
- * Licensed under the EventCatalog Commercial License.
3
- * See /packages/core/eventcatalog/src/enterprise/LICENSE
4
- */
5
-
6
1
  import type { MiddlewareHandler } from 'astro';
7
2
  import { authMiddleware } from './middleware-auth.ts';
8
3
  import { sequence } from 'astro:middleware';
@@ -1,8 +1,3 @@
1
- /**
2
- * Licensed under the EventCatalog Commercial License.
3
- * See /packages/core/eventcatalog/src/enterprise/LICENSE
4
- */
5
-
6
1
  import { z } from 'astro/zod';
7
2
  import { badge, ownerReference } from '../../content.config-shared-collections';
8
3
 
@@ -1,7 +1,2 @@
1
- /**
2
- * Licensed under the EventCatalog Commercial License.
3
- * See /packages/core/eventcatalog/src/enterprise/LICENSE
4
- */
5
-
6
1
  export { customPagesSchema } from './custom-pages';
7
2
  export { resourceDocsSchema, resourceDocCategoriesSchema } from './resource-docs';
@@ -1,8 +1,3 @@
1
- /**
2
- * Licensed under the EventCatalog Commercial License.
3
- * See /packages/core/eventcatalog/src/enterprise/LICENSE
4
- */
5
-
6
1
  import { z } from 'astro/zod';
7
2
  import { badge } from '../../content.config-shared-collections';
8
3
 
@@ -1,8 +1,3 @@
1
- /**
2
- * Licensed under the EventCatalog Commercial License.
3
- * See /packages/core/eventcatalog/src/enterprise/LICENSE
4
- */
5
-
6
1
  import { z } from 'astro/zod';
7
2
  import { badge, ownerReference } from '../../content.config-shared-collections';
8
3
 
@@ -0,0 +1,9 @@
1
+ ---
2
+ import { getNavigationItems } from '@features/custom-documentation/utils/custom-docs';
3
+ import CustomDocsNavWrapper from '@features/custom-documentation/components/CustomDocsNav/CustomDocsNavWrapper';
4
+
5
+ const currentPath = Astro.url.pathname;
6
+ const sidebarItems = await getNavigationItems();
7
+ ---
8
+
9
+ <CustomDocsNavWrapper client:only sidebarItems={sidebarItems} currentPath={currentPath} />
@@ -1,8 +1,3 @@
1
- /**
2
- * Licensed under the EventCatalog Commercial License.
3
- * See /packages/core/eventcatalog/src/enterprise/LICENSE
4
- */
5
-
6
1
  import CustomDocsNav from './';
7
2
  import type { SidebarSection } from './types';
8
3
 
@@ -1,13 +1,8 @@
1
- /**
2
- * Licensed under the EventCatalog Commercial License.
3
- * See /packages/core/eventcatalog/src/enterprise/LICENSE
4
- */
5
-
6
1
  import React from 'react';
7
2
  import { buildUrl } from '@utils/url-builder';
8
3
  import type { SidebarItem } from '../types';
9
4
  import { ExternalLinkIcon } from 'lucide-react';
10
- import { getCustomDocsSidebarBadgeClasses } from '@enterprise/custom-documentation/utils/badge-styles';
5
+ import { getCustomDocsSidebarBadgeClasses } from '@features/custom-documentation/utils/badge-styles';
11
6
 
12
7
  interface NestedItemProps {
13
8
  item: SidebarItem;
@@ -1,8 +1,3 @@
1
- /**
2
- * Licensed under the EventCatalog Commercial License.
3
- * See /packages/core/eventcatalog/src/enterprise/LICENSE
4
- */
5
-
6
1
  import React from 'react';
7
2
 
8
3
  interface NoResultsFoundProps {
@@ -1,15 +1,10 @@
1
- /**
2
- * Licensed under the EventCatalog Commercial License.
3
- * See /packages/core/eventcatalog/src/enterprise/LICENSE
4
- */
5
-
6
1
  import React, { useState, useRef, useEffect, useCallback, useMemo } from 'react';
7
2
  import { ChevronDoubleDownIcon, ChevronDoubleUpIcon } from '@heroicons/react/24/outline';
8
3
  import { buildUrl } from '@utils/url-builder';
9
4
  import type { CustomDocsNavProps, SidebarSection, SidebarItem } from './types';
10
5
  import NestedItem from './components/NestedItem';
11
6
  import NoResultsFound from './components/NoResultsFound';
12
- import { getCustomDocsSidebarBadgeClasses } from '@enterprise/custom-documentation/utils/badge-styles';
7
+ import { getCustomDocsSidebarBadgeClasses } from '@features/custom-documentation/utils/badge-styles';
13
8
 
14
9
  const STORAGE_KEY = 'EventCatalog:customDocsSidebarCollapsedGroups';
15
10
  const DEBOUNCE_DELAY = 300; // 300ms debounce delay
@@ -1,8 +1,3 @@
1
- /**
2
- * Licensed under the EventCatalog Commercial License.
3
- * See /packages/core/eventcatalog/src/enterprise/LICENSE
4
- */
5
-
6
1
  export interface SidebarItem {
7
2
  label: string;
8
3
  slug?: string;
@@ -11,8 +11,8 @@ import { getOwner } from '@utils/collections/owners';
11
11
  import { buildUrl, buildEditUrlForResource } from '@utils/url-builder';
12
12
  import { resourceToCollectionMap } from '@utils/collections/util';
13
13
  import { getMDXComponentsByName, parseMdxBooleanProp } from '@utils/markdown';
14
- import { getAdjacentPages, getNavigationItems } from '@enterprise/custom-documentation/utils/custom-docs';
15
- import CustomDocsNav from '@enterprise/custom-documentation/components/CustomDocsNav/CustomDocsNav.astro';
14
+ import { getAdjacentPages, getNavigationItems } from '@features/custom-documentation/utils/custom-docs';
15
+ import CustomDocsNav from '@features/custom-documentation/components/CustomDocsNav/CustomDocsNav.astro';
16
16
  import NodeGraph from '@components/MDX/NodeGraph/NodeGraph.astro';
17
17
  import ArchitectureGraph from '@components/MDX/ArchitectureGraph/ArchitectureGraph.astro';
18
18
  import CopyAsMarkdown from '@components/CopyAsMarkdown';
@@ -46,10 +46,10 @@ const resolvedNodeGraphs = await Promise.all(
46
46
  ...nodeGraph,
47
47
  collection,
48
48
  graphCollection,
49
- title: nodeGraph.title ?? (hasSystems ? 'System Context Map' : undefined),
50
- hrefLabel: hasSystems ? 'Open System Context Map' : 'Open in Visualiser',
49
+ title: nodeGraph.title ?? (hasSystems ? 'System Context Diagram' : undefined),
50
+ hrefLabel: hasSystems ? 'Open Diagram' : 'Open in Visualiser',
51
51
  visualiserUrl: hasSystems
52
- ? buildUrl(`/visualiser/domains/${nodeGraph.id}/${nodeGraph.version}/systems-context`)
52
+ ? buildUrl(`/visualiser/domains/${nodeGraph.id}/${nodeGraph.version}?level=1`)
53
53
  : buildUrl(`/visualiser/${collection}/${nodeGraph.id}/${nodeGraph.version}`),
54
54
  };
55
55
  })
@@ -1,8 +1,3 @@
1
- /**
2
- * Licensed under the EventCatalog Commercial License.
3
- * See /packages/core/eventcatalog/src/enterprise/LICENSE
4
- */
5
-
6
1
  type ThemeBadgeType = 'domain' | 'service' | 'event' | 'command' | 'query' | 'design' | 'channel' | 'default';
7
2
 
8
3
  const THEME_BADGE_CLASSES: Record<ThemeBadgeType, string> = {
@@ -1,8 +1,3 @@
1
- /**
2
- * Licensed under the EventCatalog Commercial License.
3
- * See /packages/core/eventcatalog/src/enterprise/LICENSE
4
- */
5
-
6
1
  import config from '@config';
7
2
  import fs from 'node:fs';
8
3
  import path from 'node:path';
@@ -12,7 +7,7 @@ import matter from 'gray-matter';
12
7
  // Use getCollection (which returns plain entries) instead of getEntry, which installs
13
8
  // Astro's `slug` deprecation accessor on every entry it returns. The accessor fires a
14
9
  // `console.error` on each access of `entry.data.slug`, even though our schema legitimately
15
- // defines `slug` as an optional user field. See packages/core/eventcatalog/src/enterprise/collections/custom-pages.ts.
10
+ // defines `slug` as an optional user field. See packages/core/eventcatalog/src/features/collections/custom-pages.ts.
16
11
  const getCustomPagesById = async () => {
17
12
  const all = await getCollection('customPages');
18
13
  const map = new Map<string, (typeof all)[number]>();
@@ -1,8 +1,3 @@
1
- /**
2
- * Licensed under the EventCatalog Commercial License.
3
- * See /packages/core/eventcatalog/src/enterprise/LICENSE
4
- */
5
-
6
1
  import MiniSearch from 'minisearch';
7
2
 
8
3
  export type MarkdownChunk = {
@@ -1,8 +1,3 @@
1
- /**
2
- * Licensed under the EventCatalog Commercial License.
3
- * See /packages/core/eventcatalog/src/enterprise/LICENSE
4
- */
5
-
6
1
  import fs from 'node:fs';
7
2
  import path from 'node:path';
8
3
 
@@ -1,6 +1,5 @@
1
1
  import type { Loader } from 'astro/loaders';
2
2
  import pc from 'picocolors';
3
- import { isEventCatalogScaleEnabled } from '../feature';
4
3
  import { EventCatalogStore } from '../../stores/eventcatalog-store';
5
4
  import { globWithSafeWatcher, type GlobOptions } from '../../utils/collections/glob-loader';
6
5
 
@@ -71,10 +70,6 @@ export const userTeamDirectoryLoader = ({
71
70
  return;
72
71
  }
73
72
 
74
- if (!isEventCatalogScaleEnabled()) {
75
- throw new Error('Directory sources require EventCatalog Scale.');
76
- }
77
-
78
73
  const loadEntries = collection === 'users' ? 'loadUsers' : 'loadTeams';
79
74
  const syncedDirectoryStoreResources = new Map<string, DirectoryStoreResource>();
80
75
 
@@ -1,8 +1,3 @@
1
- /**
2
- * Licensed under the EventCatalog Commercial License.
3
- * See /packages/core/eventcatalog/src/enterprise/LICENSE
4
- */
5
-
6
1
  export interface DeepSchemaField {
7
2
  path: string;
8
3
  type: string;
@@ -1,8 +1,3 @@
1
- /**
2
- * Licensed under the EventCatalog Commercial License.
3
- * See /packages/core/eventcatalog/src/enterprise/LICENSE
4
- */
5
-
6
1
  import path from 'node:path';
7
2
  import fs from 'node:fs';
8
3
  import { FieldsDatabase } from './fields-db';
@@ -1,8 +1,3 @@
1
- /**
2
- * Licensed under the EventCatalog Commercial License.
3
- * See /packages/core/eventcatalog/src/enterprise/LICENSE
4
- */
5
-
6
1
  import initSqlJs, { type Database as SqlJsDatabase } from 'sql.js';
7
2
  import fs from 'node:fs';
8
3
 
@@ -1,11 +1,6 @@
1
- /**
2
- * Licensed under the EventCatalog Commercial License.
3
- * See /packages/core/eventcatalog/src/enterprise/LICENSE
4
- */
5
-
6
1
  import type { APIRoute } from 'astro';
7
2
  import { Hono } from 'hono';
8
- import { getFieldsDatabase } from '@enterprise/fields/fields-db';
3
+ import { getFieldsDatabase } from '@features/fields/fields-db';
9
4
  import { getRuntimePaths } from '../../../../../integrations/runtime-paths.mjs';
10
5
 
11
6
  // The CLI builds the index at this same path. Shipping it with dist-only SSR
@@ -3,7 +3,6 @@
3
3
  import '@eventcatalog/visualiser/styles-core.css';
4
4
  import VerticalSideBarLayout from '@layouts/VerticalSideBarLayout.astro';
5
5
  import FieldsExplorer from '@components/FieldsExplorer/FieldsExplorer';
6
- import { isEventCatalogScaleEnabled } from '@utils/feature';
7
6
 
8
7
  export const prerender = false;
9
8
  ---
@@ -18,6 +17,6 @@ export const prerender = false;
18
17
  class="min-h-0 overflow-hidden bg-[rgb(var(--ec-page-bg))]"
19
18
  style="--ec-fields-sidebar-width: 320px; margin-left: calc(var(--ec-app-content-padding-left, 5rem) * -1); margin-right: calc(var(--ec-app-content-padding-right, 5rem) * -1); height: calc(100dvh - 60px);"
20
19
  >
21
- <FieldsExplorer client:load isScaleEnabled={isEventCatalogScaleEnabled()} />
20
+ <FieldsExplorer client:load />
22
21
  </main>
23
22
  </VerticalSideBarLayout>
@@ -1,8 +1,3 @@
1
- /**
2
- * Licensed under the EventCatalog Commercial License.
3
- * See /packages/core/eventcatalog/src/enterprise/LICENSE
4
- */
5
-
6
1
  import type { AstroIntegration } from 'astro';
7
2
  import fs from 'node:fs';
8
3
  import path from 'path';
@@ -13,14 +8,10 @@ import config from '../../utils/eventcatalog-config/source';
13
8
  import {
14
9
  isEventCatalogChatEnabled,
15
10
  isAuthEnabled,
16
- isEventCatalogScaleEnabled,
17
11
  isEventCatalogMCPEnabled,
18
12
  isEventCatalogMCPAuthEnabled,
19
13
  isFullCatalogAPIEnabled,
20
14
  isDevMode,
21
- isIntegrationsEnabled,
22
- isCustomDocsEnabled,
23
- isCustomPagesEnabled,
24
15
  isSSR,
25
16
  } from '../../utils/feature';
26
17
  import { getCustomPageRoutes, isApiRoute, listCustomPageFiles, resolveCustomPagesPrefix } from '../custom-pages/routes';
@@ -83,25 +74,25 @@ const configureAuthentication = (params: {
83
74
  }) => {
84
75
  params.injectRoute({
85
76
  pattern: '/api/[...auth]',
86
- entrypoint: path.join(packageDirectory, 'src/enterprise/auth/[...auth].ts'),
77
+ entrypoint: path.join(packageDirectory, 'src/features/auth/[...auth].ts'),
87
78
  });
88
79
  params.injectRoute({
89
80
  pattern: '/auth/login',
90
- entrypoint: path.join(packageDirectory, 'src/enterprise/auth/login.astro'),
81
+ entrypoint: path.join(packageDirectory, 'src/features/auth/login.astro'),
91
82
  });
92
83
  params.injectRoute({
93
84
  pattern: '/auth/error',
94
- entrypoint: path.join(packageDirectory, 'src/enterprise/auth/error.astro'),
85
+ entrypoint: path.join(packageDirectory, 'src/features/auth/error.astro'),
95
86
  });
96
87
 
97
88
  params.injectRoute({
98
89
  pattern: '/unauthorized',
99
- entrypoint: path.join(packageDirectory, 'src/enterprise/auth/unauthorized.astro'),
90
+ entrypoint: path.join(packageDirectory, 'src/features/auth/unauthorized.astro'),
100
91
  });
101
92
 
102
93
  // Add the authentication middleware
103
94
  params.addMiddleware({
104
- entrypoint: path.join(packageDirectory, 'src/enterprise/auth/middleware/middleware.ts'),
95
+ entrypoint: path.join(packageDirectory, 'src/features/auth/middleware/middleware.ts'),
105
96
  order: 'pre',
106
97
  });
107
98
  };
@@ -115,26 +106,26 @@ export default function eventCatalogIntegration(): AstroIntegration {
115
106
  if (isEventCatalogChatEnabled()) {
116
107
  params.injectRoute({
117
108
  pattern: '/api/chat',
118
- entrypoint: path.join(packageDirectory, 'src/enterprise/ai/chat-api.ts'),
109
+ entrypoint: path.join(packageDirectory, 'src/features/ai/chat-api.ts'),
119
110
  });
120
111
  }
121
112
 
122
- // Handle routes for MCP Server (requires SSR + Scale)
113
+ // Handle routes for MCP Server (requires SSR)
123
114
  if (isEventCatalogMCPEnabled()) {
124
115
  params.injectRoute({
125
116
  pattern: '/docs/mcp/[...path]',
126
- entrypoint: path.join(packageDirectory, 'src/enterprise/mcp/mcp-server.ts'),
117
+ entrypoint: path.join(packageDirectory, 'src/features/mcp/mcp-server.ts'),
127
118
  });
128
119
  }
129
120
 
130
121
  if (isEventCatalogMCPAuthEnabled()) {
131
122
  params.injectRoute({
132
123
  pattern: '/.well-known/oauth-protected-resource',
133
- entrypoint: path.join(packageDirectory, 'src/enterprise/mcp/oauth-protected-resource.ts'),
124
+ entrypoint: path.join(packageDirectory, 'src/features/mcp/oauth-protected-resource.ts'),
134
125
  });
135
126
  params.injectRoute({
136
127
  pattern: '/.well-known/oauth-protected-resource/[...path]',
137
- entrypoint: path.join(packageDirectory, 'src/enterprise/mcp/oauth-protected-resource.ts'),
128
+ entrypoint: path.join(packageDirectory, 'src/features/mcp/oauth-protected-resource.ts'),
138
129
  });
139
130
  }
140
131
 
@@ -143,51 +134,11 @@ export default function eventCatalogIntegration(): AstroIntegration {
143
134
  configureAuthentication(params);
144
135
  }
145
136
 
146
- // Custom documentation routes (Starter/Scale plan)
147
- if (isCustomDocsEnabled()) {
148
- params.injectRoute({
149
- pattern: '/docs/custom',
150
- entrypoint: path.join(packageDirectory, 'src/enterprise/custom-documentation/pages/docs/custom/root-index.astro'),
151
- });
152
- params.injectRoute({
153
- pattern: '/docs/custom/[...path]',
154
- entrypoint: path.join(
155
- packageDirectory,
156
- 'src/enterprise/custom-documentation/pages/docs/custom/[...path]/index.astro'
157
- ),
158
- });
159
- params.injectRoute({
160
- pattern: '/docs/custom/[...path].mdx',
161
- entrypoint: path.join(packageDirectory, 'src/enterprise/custom-documentation/pages/docs/custom/[...path].mdx.ts'),
162
- });
163
- } else {
164
- // Show feature page for non-paying users
165
- params.injectRoute({
166
- pattern: '/docs/custom',
167
- entrypoint: path.join(packageDirectory, 'src/enterprise/custom-documentation/pages/docs/custom/feature.astro'),
168
- });
169
- }
170
-
171
- // Schema API routes (Scale plan)
172
- if (isEventCatalogScaleEnabled()) {
173
- params.injectRoute({
174
- pattern: '/api/schemas/[collection]/[id]/[version]',
175
- entrypoint: path.join(packageDirectory, 'src/enterprise/api/schemas/[collection]/[id]/[version]/index.ts'),
176
- });
177
- params.injectRoute({
178
- pattern: '/api/schemas/services/[id]/[version]/[specification]',
179
- entrypoint: path.join(
180
- packageDirectory,
181
- 'src/enterprise/api/schemas/services/[id]/[version]/[specification]/index.ts'
182
- ),
183
- });
184
- }
185
-
186
137
  // Full catalog API route (opt-in)
187
138
  if (isFullCatalogAPIEnabled()) {
188
139
  params.injectRoute({
189
140
  pattern: '/api/catalog',
190
- entrypoint: path.join(packageDirectory, 'src/enterprise/api/catalog.ts'),
141
+ entrypoint: path.join(packageDirectory, 'src/features/api/catalog.ts'),
191
142
  });
192
143
  }
193
144
 
@@ -195,40 +146,31 @@ export default function eventCatalogIntegration(): AstroIntegration {
195
146
  if (isSSR()) {
196
147
  params.injectRoute({
197
148
  pattern: '/schemas/fields',
198
- entrypoint: path.join(packageDirectory, 'src/enterprise/fields/pages/fields.astro'),
149
+ entrypoint: path.join(packageDirectory, 'src/features/fields/pages/fields.astro'),
199
150
  });
200
151
  params.injectRoute({
201
152
  pattern: '/api/schemas/fields',
202
- entrypoint: path.join(packageDirectory, 'src/enterprise/fields/pages/api/fields.ts'),
153
+ entrypoint: path.join(packageDirectory, 'src/features/fields/pages/api/fields.ts'),
203
154
  });
204
155
  }
205
156
 
206
- // User-defined pages and API routes (Scale plan)
207
- if (isCustomPagesEnabled()) {
208
- configureCustomPages(params);
209
- } else if (listCustomPageFiles(customPagesDirectory).length > 0) {
210
- console.warn('[EventCatalog] Custom pages require the Scale plan. The routes for your pages will not be served.');
211
- }
157
+ // User-defined pages and API routes
158
+ configureCustomPages(params);
212
159
 
213
160
  // Keep routes in sync during dev — a manifest change restarts the dev
214
161
  // server so injectRoute runs again with the new file list
215
162
  writeCustomPagesManifest();
216
163
  params.addWatchFile(customPagesManifest);
217
164
 
218
- // Warn if integrations are configured without Scale plan
219
- if (config.integrations && !isIntegrationsEnabled()) {
220
- console.warn('[EventCatalog] Integrations require the Scale plan. Analytics integrations will not be loaded.');
221
- }
222
-
223
165
  // Dev-only routes for visualizer layout persistence
224
166
  if (isDevMode()) {
225
167
  params.injectRoute({
226
168
  pattern: '/api/dev/visualizer-layout/save',
227
- entrypoint: path.join(packageDirectory, 'src/enterprise/visualizer-layout/save.ts'),
169
+ entrypoint: path.join(packageDirectory, 'src/features/visualizer-layout/save.ts'),
228
170
  });
229
171
  params.injectRoute({
230
172
  pattern: '/api/dev/visualizer-layout/reset',
231
- entrypoint: path.join(packageDirectory, 'src/enterprise/visualizer-layout/reset.ts'),
173
+ entrypoint: path.join(packageDirectory, 'src/features/visualizer-layout/reset.ts'),
232
174
  });
233
175
  }
234
176
  },
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Links in the architecture diagram view. Links to a resource's Diagram page (e.g. "Focus node")
3
+ * open that diagram in the view; other links open EventCatalog in the MCP host.
4
+ */
5
+ import {
6
+ isArchitectureDiagramCollection,
7
+ type ArchitectureDiagramCollection,
8
+ } from '@utils/node-graphs/architecture-diagram-types';
9
+
10
+ // /visualiser/{collection}/{id}/{version}, after any base path
11
+ const DIAGRAM_PATH = /\/visualiser\/([^/]+)\/([^/]+)\/([^/]+)\/?$/;
12
+
13
+ export type DiagramLink = { collection: ArchitectureDiagramCollection; id: string; version: string };
14
+
15
+ /** The diagram a link opens, if it is a link to a Diagram page in this EventCatalog */
16
+ export function parseDiagramLink(href: string, catalogUrl: string): DiagramLink | undefined {
17
+ let url: URL;
18
+ try {
19
+ url = new URL(href, catalogUrl);
20
+ } catch {
21
+ return undefined;
22
+ }
23
+ if (url.origin !== new URL(catalogUrl).origin) return undefined;
24
+
25
+ const match = url.pathname.match(DIAGRAM_PATH);
26
+ if (!match || !isArchitectureDiagramCollection(match[1])) return undefined;
27
+
28
+ const [, collection, id, version] = match.map((part) => decodeURIComponent(part));
29
+ return { collection: collection as ArchitectureDiagramCollection, id, version };
30
+ }
31
+
32
+ // Links in a node's right-click menu that open the "Ask a question" modal for the node
33
+ const ASK_LINK_PREFIX = '#ec-mcp-ask=';
34
+
35
+ export const askLink = (nodeId: string) => `${ASK_LINK_PREFIX}${encodeURIComponent(nodeId)}`;
36
+
37
+ /** The id of the node to ask about, if the link opens the "Ask a question" modal */
38
+ export const parseAskLink = (href: string) =>
39
+ href.startsWith(ASK_LINK_PREFIX) ? decodeURIComponent(href.slice(ASK_LINK_PREFIX.length)) : undefined;
40
+
41
+ type ContextMenuItem = { label: string; href: string; separator?: boolean; [key: string]: unknown };
42
+ type GraphNode = { id: string; data?: Record<string, any> };
43
+
44
+ /** Nodes with "Ask a question" first in their right-click menu, before the menu they already have */
45
+ export function withAskMenuItem<T extends GraphNode>(nodes: T[]): Array<T & { data: { contextMenu: ContextMenuItem[] } }> {
46
+ return nodes.map((node) => {
47
+ const menu: ContextMenuItem[] = node.data?.contextMenu ?? [];
48
+ return {
49
+ ...node,
50
+ data: {
51
+ ...node.data,
52
+ contextMenu: [
53
+ { label: 'Ask a question', href: askLink(node.id) },
54
+ ...menu.map((item, index) => (index === 0 ? { ...item, separator: true } : item)),
55
+ ],
56
+ },
57
+ };
58
+ });
59
+ }