@eventcatalog/core 5.0.0-beta.8 → 5.0.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 (467) hide show
  1. package/LICENSE +234 -134
  2. package/README.md +5 -5
  3. package/dist/analytics/analytics.cjs +18 -3
  4. package/dist/analytics/analytics.d.cts +1 -1
  5. package/dist/analytics/analytics.d.ts +1 -1
  6. package/dist/analytics/analytics.js +3 -2
  7. package/dist/analytics/log-build.cjs +157 -76
  8. package/dist/analytics/log-build.d.cts +2 -2
  9. package/dist/analytics/log-build.d.ts +2 -2
  10. package/dist/analytics/log-build.js +7 -5
  11. package/dist/analytics/studio-usage.cjs +90 -0
  12. package/dist/analytics/studio-usage.d.cts +5 -0
  13. package/dist/analytics/studio-usage.d.ts +5 -0
  14. package/dist/analytics/studio-usage.js +10 -0
  15. package/dist/analytics/telemetry.cjs +42 -0
  16. package/dist/analytics/telemetry.d.cts +20 -0
  17. package/dist/analytics/telemetry.d.ts +20 -0
  18. package/dist/analytics/telemetry.js +8 -0
  19. package/dist/catalog-runtime.cjs +1 -1
  20. package/dist/{chunk-RFIXKATC.js → chunk-4G7FSRPN.js} +35 -42
  21. package/dist/{chunk-AWOO63ME.js → chunk-AD7CL772.js} +11 -4
  22. package/dist/chunk-CA6WCQ2T.js +54 -0
  23. package/dist/chunk-CPW6G62V.js +17 -0
  24. package/dist/{chunk-PU25TOOJ.js → chunk-JZN4RSMF.js} +1 -1
  25. package/dist/{chunk-4W55ZOOS.js → chunk-NEAVAFSJ.js} +66 -35
  26. package/dist/{chunk-C6T2AAFR.js → chunk-NIVST4WY.js} +9 -3
  27. package/dist/{chunk-ENAG6UH7.js → chunk-NKNOXQ62.js} +1 -6
  28. package/dist/{chunk-AYNZXUB5.js → chunk-OX6TSVHY.js} +5 -5
  29. package/dist/{chunk-36RYTYT5.js → chunk-PD7KTSYN.js} +1 -1
  30. package/dist/{chunk-RDIZJ7UT.js → chunk-RE7UTPWH.js} +1 -1
  31. package/dist/chunk-S5GWAUG5.js +29 -0
  32. package/dist/{chunk-T4G3VVZ4.js → chunk-YQGRMDRB.js} +4 -2
  33. package/dist/constants.cjs +1 -1
  34. package/dist/constants.js +1 -1
  35. package/dist/docs/api/02-config.md +57 -7
  36. package/dist/docs/development/00-why-eventcatalog.md +11 -11
  37. package/dist/docs/development/01-fundamentals.md +20 -13
  38. package/dist/docs/development/01-getting-started/configuration-overview.md +2 -2
  39. package/dist/docs/development/01-getting-started/installation.md +9 -1
  40. package/dist/docs/development/_getting-started.mdx +1 -1
  41. package/dist/docs/development/ask-your-architecture/01-intro.md +5 -5
  42. package/dist/docs/development/ask-your-architecture/02-eventcatalog-assistant/01-what-is-eventcatalog-assistant.md +0 -4
  43. package/dist/docs/development/ask-your-architecture/02-eventcatalog-assistant/02-configuration.md +15 -3
  44. package/dist/docs/development/ask-your-architecture/02-eventcatalog-assistant/03-bring-your-own-tools.md +0 -3
  45. package/dist/docs/development/ask-your-architecture/02-eventcatalog-assistant/_category_.json +1 -1
  46. package/dist/docs/development/ask-your-architecture/02-llms.txt.md +1 -1
  47. package/dist/docs/development/ask-your-architecture/{05-skills/01-introduction.md → 03-install-skills.md} +57 -7
  48. package/dist/docs/development/ask-your-architecture/03-mcp-server/_category_.json +1 -1
  49. package/dist/docs/development/ask-your-architecture/03-mcp-server/getting-started.md +86 -33
  50. package/dist/docs/development/ask-your-architecture/03-mcp-server/introduction.md +14 -4
  51. package/dist/docs/development/ask-your-architecture/03-schemas.txt.md +1 -1
  52. package/dist/docs/development/ask-your-architecture/04-agents/_category_.json +1 -1
  53. package/dist/docs/development/authentication/01-introduction.md +2 -23
  54. package/dist/docs/development/authentication/02-enabling-authentication.md +0 -20
  55. package/dist/docs/development/authentication/07-rbac-middleware.md +0 -2
  56. package/dist/docs/development/authentication/providers/03-setting-up-github.md +0 -2
  57. package/dist/docs/development/authentication/providers/03a-setting-up-google.md +0 -2
  58. package/dist/docs/development/authentication/providers/04-setting-up-azure-ad.md +0 -2
  59. package/dist/docs/development/authentication/providers/05-setting-up-okta.md +0 -3
  60. package/dist/docs/development/authentication/providers/06-setting-up-auth0.md +0 -2
  61. package/dist/docs/development/bring-your-own-documentation/01-introduction.md +0 -4
  62. package/dist/docs/development/bring-your-own-documentation/custom-pages/01-introduction.md +0 -3
  63. package/dist/docs/development/bring-your-own-documentation/custom-pages/02-adding-custom-docs.md +0 -17
  64. package/dist/docs/development/bring-your-own-documentation/custom-pages/03-components.md +0 -4
  65. package/dist/docs/development/bring-your-own-documentation/custom-pages/04-owners.md +0 -2
  66. package/dist/docs/development/bring-your-own-documentation/resource-docs/01-introduction.md +1 -3
  67. package/dist/docs/development/bring-your-own-documentation/resource-docs/02-adding-resource-docs.md +1 -4
  68. package/dist/docs/development/bring-your-own-documentation/resource-docs/03-categories.md +0 -2
  69. package/dist/docs/development/bring-your-own-documentation/resource-docs/04-versioning.md +1 -3
  70. package/dist/docs/development/components/components/11-flow.md +17 -0
  71. package/dist/docs/development/components/components/15-nodegraph.md +43 -10
  72. package/dist/docs/development/components/components/18-remote-schema.md +1 -4
  73. package/dist/docs/development/components/custom-components/07-reference.md +14 -0
  74. package/dist/docs/development/customization/02-themes.md +0 -5
  75. package/dist/docs/development/customization/03-search.md +1 -1
  76. package/dist/docs/development/customization/05-custom-pages-and-api-routes/01-introduction.md +0 -2
  77. package/dist/docs/development/customization/05-custom-pages-and-api-routes/04-reference.md +7 -1
  78. package/dist/docs/development/customization/05-resource-sidebar.md +1 -1
  79. package/dist/docs/development/customization/09-embed-eventcatalog.md +20 -25
  80. package/dist/docs/development/deployment/hosting-options.md +7 -2
  81. package/dist/docs/development/developer-tools/eventcatalog-linter/how-to/05-fix-common-problems.md +16 -0
  82. package/dist/docs/development/developer-tools/eventcatalog-linter/reference/03-rules.md +31 -1
  83. package/dist/docs/development/developer-tools/eventcatalog-linter/reference/05-supported-resources.md +1 -1
  84. package/dist/docs/development/governance/architecture-change-detection/01-introduction.md +0 -10
  85. package/dist/docs/development/governance/architecture-change-detection/06-pipeline-gates.md +0 -4
  86. package/dist/docs/development/guides/97-architecture-graph.md +1 -1
  87. package/dist/docs/development/guides/99-adding-analytics.md +0 -7
  88. package/dist/docs/development/guides/domains/03-model-subdomains.md +2 -2
  89. package/dist/docs/development/guides/domains/04-add-resources-to-domains/01-add-systems-to-domains.md +3 -1
  90. package/dist/docs/development/guides/domains/04-add-resources-to-domains/02-add-services-to-domains.md +5 -1
  91. package/dist/docs/development/guides/domains/04-add-resources-to-domains/03-add-messages-to-domains.md +2 -2
  92. package/dist/docs/development/guides/domains/04-add-resources-to-domains/05-add-entities-to-domains.md +1 -1
  93. package/dist/docs/development/guides/domains/04-add-resources-to-domains/06-domain-resources-page.md +40 -0
  94. package/dist/docs/development/guides/domains/06-visualize-domains/01-domain-diagram.md +89 -0
  95. package/dist/docs/development/guides/domains/06-visualize-domains/_category_.json +1 -2
  96. package/dist/docs/development/guides/domains/09-reference.md +4 -4
  97. package/dist/docs/development/guides/owners/automated-teams-and-users/create-your-own-connector.md +0 -2
  98. package/dist/docs/development/guides/owners/automated-teams-and-users/sync-from-github.md +0 -3
  99. package/dist/docs/development/guides/owners/automated-teams-and-users/sync-from-microsoft-entra.md +0 -2
  100. package/dist/docs/development/guides/resources/adrs/03-linking-resources.md +8 -0
  101. package/dist/docs/development/guides/resources/adrs/06-reference.md +4 -4
  102. package/dist/docs/development/guides/resources/agents/11-reference.md +1 -1
  103. package/dist/docs/development/guides/resources/data/04-reference.md +1 -1
  104. package/dist/docs/development/guides/resources/data-products/07-reference.md +1 -1
  105. package/dist/docs/development/guides/resources/entities/05-entity-maps.md +1 -1
  106. package/dist/docs/development/guides/resources/entities/06-reference.md +2 -2
  107. package/dist/docs/development/guides/resources/flows/01-introduction.md +11 -1
  108. package/dist/docs/development/guides/resources/flows/03-model-flow-steps.md +65 -6
  109. package/dist/docs/development/guides/resources/flows/05-explore-flows.md +112 -0
  110. package/dist/docs/development/guides/resources/flows/06-reference.md +25 -4
  111. package/dist/docs/development/guides/resources/messages/01-what-are-messages.md +19 -0
  112. package/dist/docs/development/guides/resources/messages/04-message-channels/01-introduction.md +16 -0
  113. package/dist/docs/development/guides/resources/messages/04-message-channels/05-reference.md +2 -1
  114. package/dist/docs/development/guides/resources/messages/10-reference.md +6 -3
  115. package/dist/docs/development/guides/resources/schemas/04-explore-schemas/01-schema-explorer.md +2 -2
  116. package/dist/docs/development/guides/resources/schemas/04-explore-schemas/02-fields-explorer.md +0 -9
  117. package/dist/docs/development/guides/resources/schemas/05-schema-api.md +0 -3
  118. package/dist/docs/development/guides/resources/schemas/06-schema-mcp.md +11 -3
  119. package/dist/docs/development/guides/resources/services/04-add-resources-to-services/03-add-entities-to-services.md +1 -1
  120. package/dist/docs/development/guides/resources/services/05-resources-page.md +50 -0
  121. package/dist/docs/development/guides/resources/services/08-reference.md +2 -1
  122. package/dist/docs/development/guides/systems/01-introduction.md +1 -1
  123. package/dist/docs/development/guides/systems/02-create-system.md +2 -2
  124. package/dist/docs/development/guides/systems/03-add-resources-to-systems.md +35 -9
  125. package/dist/docs/development/guides/systems/04-model-relationships-and-actors.md +5 -3
  126. package/dist/docs/development/guides/systems/05-system-context-maps.md +39 -22
  127. package/dist/docs/development/guides/systems/06-reference.md +4 -4
  128. package/dist/docs/development/license/01-license-file.md +151 -0
  129. package/dist/docs/development/license/_category_.json +12 -0
  130. package/dist/docs/development/license-keys/_category_.json +3 -3
  131. package/dist/docs/development/license-keys/integrations.md +7 -37
  132. package/dist/docs/development/license-keys/license-validation.md +4 -0
  133. package/dist/docs/development/license-keys/overview.md +5 -1
  134. package/dist/docs/development/license-keys/plans.md +4 -2
  135. package/dist/docs/development/studio/01-introduction.md +60 -0
  136. package/dist/docs/development/studio/02-create-a-canvas.md +103 -0
  137. package/dist/docs/development/studio/03-set-up-persistent-storage.md +59 -0
  138. package/dist/docs/development/studio/04-collaborate-on-a-canvas.md +78 -0
  139. package/dist/docs/development/studio/05-connect-your-agent.md +102 -0
  140. package/dist/docs/development/studio/06-run-studio-in-production.md +54 -0
  141. package/dist/docs/development/studio/07-reference.md +294 -0
  142. package/dist/docs/development/studio/_category_.json +12 -0
  143. package/dist/docs/development/upgrading/v5.md +345 -0
  144. package/dist/docs/federation/00-overview.md +2 -8
  145. package/dist/docs/federation/01-first-federation.md +6 -18
  146. package/dist/docs/federation/explanation/how-it-works.md +0 -4
  147. package/dist/docs/federation/explanation/lockfile-and-cache.md +0 -4
  148. package/dist/docs/federation/explanation/mvp-status-and-feedback.md +0 -4
  149. package/dist/docs/federation/explanation/ownership-and-references.md +0 -4
  150. package/dist/docs/federation/how-to/configure-github-sources.md +6 -5
  151. package/dist/docs/federation/how-to/configure-validation-rules.md +0 -4
  152. package/dist/docs/federation/how-to/run-in-ci.md +2 -9
  153. package/dist/docs/federation/how-to/share-assets-and-components.md +0 -4
  154. package/dist/docs/federation/how-to/use-local-sources.md +0 -4
  155. package/dist/docs/federation/legacy-federation/00-introduction.md +4 -22
  156. package/dist/docs/federation/legacy-federation/01-installation.md +7 -58
  157. package/dist/docs/federation/legacy-federation/02-plugin-configuration.md +3 -21
  158. package/dist/docs/federation/legacy-federation/03-examples.md +3 -5
  159. package/dist/docs/federation/legacy-federation/04-configuration.md +3 -8
  160. package/dist/docs/federation/legacy-federation/05-setup-team-catalog.md +3 -6
  161. package/dist/docs/federation/reference/cli.md +2 -8
  162. package/dist/docs/federation/reference/configuration.md +0 -4
  163. package/dist/docs/federation/reference/diagnostic-rules.md +0 -5
  164. package/dist/docs/federation/reference/generated-output.md +0 -4
  165. package/dist/docs/federation/reference/supported-content.md +0 -4
  166. package/dist/docs/federation/reference/troubleshooting.md +0 -14
  167. package/dist/docs/plugins/02-generators.md +1 -1
  168. package/dist/docs/plugins/amazon-apigateway/00-intro.md +3 -28
  169. package/dist/docs/plugins/amazon-apigateway/01-installation.md +4 -56
  170. package/dist/docs/plugins/amazon-apigateway/02-plugin-configuration.md +1 -6
  171. package/dist/docs/plugins/apicurio/00-intro.md +2 -31
  172. package/dist/docs/plugins/apicurio/01-installation.md +2 -26
  173. package/dist/docs/plugins/apicurio/02-plugin-configuration.md +5 -13
  174. package/dist/docs/plugins/apicurio/03-features.md +1 -3
  175. package/dist/docs/plugins/asyncapi/00-intro.md +2 -28
  176. package/dist/docs/plugins/asyncapi/01-installation.md +3 -54
  177. package/dist/docs/plugins/asyncapi/02-plugin-configuration.md +2 -1
  178. package/dist/docs/plugins/aws-glue-registry/00-intro.md +4 -32
  179. package/dist/docs/plugins/aws-glue-registry/00a-installation.md +3 -53
  180. package/dist/docs/plugins/azure-schema-registry/00-intro.md +4 -32
  181. package/dist/docs/plugins/azure-schema-registry/01-installation.md +6 -33
  182. package/dist/docs/plugins/azure-schema-registry/02-plugin-configuration.md +1 -14
  183. package/dist/docs/plugins/azure-schema-registry/04-examples.md +0 -2
  184. package/dist/docs/plugins/backstage/00-overview.md +1 -7
  185. package/dist/docs/plugins/backstage/01-get-started.md +6 -15
  186. package/dist/docs/plugins/backstage/06-configuration.md +2 -8
  187. package/dist/docs/plugins/confluent-schema-registry/00-intro.md +2 -29
  188. package/dist/docs/plugins/confluent-schema-registry/01-installation.md +2 -26
  189. package/dist/docs/plugins/eventbridge/00-intro.md +0 -4
  190. package/dist/docs/plugins/eventbridge/00a-installation.md +1 -87
  191. package/dist/docs/plugins/eventbridge/03-api.md +2 -20
  192. package/dist/docs/plugins/github/00-intro.md +0 -31
  193. package/dist/docs/plugins/github/01-installation.md +2 -34
  194. package/dist/docs/plugins/graphql/00-intro.md +0 -30
  195. package/dist/docs/plugins/graphql/01-installation.md +1 -53
  196. package/dist/docs/plugins/graphql/02-plugin-configuration.md +0 -1
  197. package/dist/docs/plugins/hookdeck/01-intro.md +1 -1
  198. package/dist/docs/plugins/openapi/00-intro.md +0 -30
  199. package/dist/docs/plugins/openapi/01-installation.md +1 -57
  200. package/dist/docs/plugins/openapi/02-plugin-configuration.md +0 -5
  201. package/dist/docs/plugins/openapi/03-features.md +0 -4
  202. package/dist/eventcatalog-config-file-utils.cjs +34 -41
  203. package/dist/eventcatalog-config-file-utils.d.cts +56 -58
  204. package/dist/eventcatalog-config-file-utils.d.ts +56 -58
  205. package/dist/eventcatalog-config-file-utils.js +1 -1
  206. package/dist/eventcatalog.cjs +408 -281
  207. package/dist/eventcatalog.config.d.cts +26 -15
  208. package/dist/eventcatalog.config.d.ts +26 -15
  209. package/dist/eventcatalog.js +46 -27
  210. package/dist/features.cjs +36 -49
  211. package/dist/features.d.cts +1 -3
  212. package/dist/features.d.ts +1 -3
  213. package/dist/features.js +4 -6
  214. package/dist/federation/federate.cjs +37 -44
  215. package/dist/federation/federate.js +5 -5
  216. package/dist/federation/source-provider.js +2 -2
  217. package/dist/generate.cjs +37 -42
  218. package/dist/generate.js +4 -4
  219. package/dist/resolve-catalog-dependencies.cjs +34 -41
  220. package/dist/resolve-catalog-dependencies.js +2 -2
  221. package/dist/runtime-dependencies/@eventcatalog__visualiser__studio-fonts.css.mjs +3 -0
  222. package/dist/runtime-dependencies/@eventcatalog__visualiser__studio.css.mjs +3 -0
  223. package/dist/runtime-dependencies/@eventcatalog__visualiser__studio.mjs +3 -0
  224. package/dist/runtime-dependencies/htmlparser2.mjs +3 -0
  225. package/dist/runtime-dependencies/manifest.json +5 -1
  226. package/dist/runtime-dependencies/react-syntax-highlighter__dist__cjs__create-element.js.mjs +3 -0
  227. package/dist/utils/child-process-signals.cjs +53 -0
  228. package/dist/utils/child-process-signals.d.cts +19 -0
  229. package/dist/utils/child-process-signals.d.ts +19 -0
  230. package/dist/utils/child-process-signals.js +6 -0
  231. package/dist/utils/cli-logger.cjs +1 -1
  232. package/dist/utils/cli-logger.js +2 -2
  233. package/dist/utils/license-status.cjs +11 -4
  234. package/dist/utils/license-status.d.cts +3 -2
  235. package/dist/utils/license-status.d.ts +3 -2
  236. package/dist/utils/license-status.js +1 -1
  237. package/eventcatalog/astro.config.mjs +21 -1
  238. package/eventcatalog/integrations/config-loader.mjs +56 -58
  239. package/eventcatalog/integrations/skip-startup-reload.mjs +31 -0
  240. package/eventcatalog/integrations/stable-dependency-order.mjs +29 -0
  241. package/eventcatalog/integrations/storage.mjs +20 -0
  242. package/eventcatalog/integrations/studio-server.mjs +4 -1
  243. package/eventcatalog/src/components/CatalogGraph/CatalogForceGraph.tsx +39 -0
  244. package/eventcatalog/src/components/ChatPanel/ChatPanel.tsx +2 -0
  245. package/eventcatalog/src/components/Homepage/CatalogDashboard.astro +342 -0
  246. package/eventcatalog/src/components/MDX/NodeGraph/AstroNodeGraph.tsx +60 -4
  247. package/eventcatalog/src/components/MDX/NodeGraph/NodeGraph.astro +5 -1
  248. package/eventcatalog/src/components/NavigationProgress.astro +7 -0
  249. package/eventcatalog/src/components/SchemaExplorer/ApiContentViewer.tsx +2 -0
  250. package/eventcatalog/src/components/SchemaExplorer/ExamplesViewer.tsx +2 -0
  251. package/eventcatalog/src/components/SchemaExplorer/SchemaCodeModal.tsx +2 -0
  252. package/eventcatalog/src/components/SchemaExplorer/SchemaContentViewer.tsx +2 -0
  253. package/eventcatalog/src/components/Search/SearchDataLoader.astro +16 -28
  254. package/eventcatalog/src/components/Search/SearchModal.tsx +2 -10
  255. package/eventcatalog/src/components/Search/search-utils.ts +26 -0
  256. package/eventcatalog/src/components/Seo.astro +5 -1
  257. package/eventcatalog/src/components/Settings/AssistantSettingsForm.tsx +53 -48
  258. package/eventcatalog/src/components/Settings/GeneralSettingsForm.tsx +183 -178
  259. package/eventcatalog/src/components/Settings/LicenseSettings.tsx +140 -31
  260. package/eventcatalog/src/components/Settings/LlmAccessSettingsForm.tsx +40 -35
  261. package/eventcatalog/src/components/Settings/LogoUpload.tsx +1 -1
  262. package/eventcatalog/src/components/Settings/McpSettingsForm.tsx +9 -8
  263. package/eventcatalog/src/components/Settings/Row.tsx +7 -4
  264. package/eventcatalog/src/components/Settings/SettingsShared.tsx +3 -3
  265. package/eventcatalog/src/components/SideNav/NestedSideBar/index.tsx +37 -76
  266. package/eventcatalog/src/components/SideNav/NestedSideBar/storage.ts +2 -0
  267. package/eventcatalog/src/components/SideNav/NestedSideBar/utils.ts +122 -1
  268. package/eventcatalog/src/components/SideNav/SideNav.astro +9 -1
  269. package/eventcatalog/src/components/TrialBadge.astro +20 -9
  270. package/eventcatalog/src/content.config.ts +19 -2
  271. package/eventcatalog/src/features/auth/error.astro +4 -2
  272. package/eventcatalog/src/features/auth/login.astro +2 -1
  273. package/eventcatalog/src/features/auth/middleware/middleware-auth.ts +21 -1
  274. package/eventcatalog/src/features/auth/unauthorized.astro +1 -1
  275. package/eventcatalog/src/features/fields/pages/fields.astro +1 -1
  276. package/eventcatalog/src/features/integrations/eventcatalog-features.ts +13 -7
  277. package/eventcatalog/src/features/mcp/apps/architecture-diagram/node-chat.tsx +6 -45
  278. package/eventcatalog/src/features/mcp/apps/canvas/shared.ts +3 -3
  279. package/eventcatalog/src/features/mcp/apps/canvas/styles.css +3 -1
  280. package/eventcatalog/src/features/mcp/apps/canvas/view.tsx +7 -5
  281. package/eventcatalog/src/features/mcp/apps/generated/canvas.html +123 -98
  282. package/eventcatalog/src/features/mcp/apps/generated/viewer.html +118 -101
  283. package/eventcatalog/src/features/mcp/mcp-server.ts +20 -4
  284. package/eventcatalog/src/features/server/start.ts +25 -0
  285. package/eventcatalog/src/features/storage/database.ts +88 -0
  286. package/eventcatalog/src/features/storage/migrations.ts +85 -0
  287. package/eventcatalog/src/features/storage/sql/database.sql +5 -0
  288. package/eventcatalog/src/features/storage/sql/migrations/0001-studio-canvases.sql +12 -0
  289. package/eventcatalog/src/features/storage/sql/migrations.sql +15 -0
  290. package/eventcatalog/src/features/storage/sql.ts +28 -0
  291. package/eventcatalog/src/features/studio/agent-choreography.ts +13 -10
  292. package/eventcatalog/src/features/studio/agents.ts +28 -0
  293. package/eventcatalog/src/features/studio/api/canvases-api.ts +219 -0
  294. package/eventcatalog/src/features/studio/api/canvases.ts +25 -0
  295. package/eventcatalog/src/features/studio/api/client.ts +40 -0
  296. package/eventcatalog/src/features/studio/canvas-actions.ts +160 -34
  297. package/eventcatalog/src/features/studio/canvas-preview.ts +1 -2
  298. package/eventcatalog/src/features/studio/catalog.ts +16 -14
  299. package/eventcatalog/src/features/studio/components/CanvasHeader.tsx +274 -105
  300. package/eventcatalog/src/features/studio/components/CanvasStatusMenu.tsx +15 -14
  301. package/eventcatalog/src/features/studio/components/ConnectAgentDialog.tsx +272 -119
  302. package/eventcatalog/src/features/studio/components/ConnectionsChooser.tsx +1 -2
  303. package/eventcatalog/src/features/studio/components/DeleteCanvasDialog.tsx +65 -0
  304. package/eventcatalog/src/features/studio/components/Dialog.tsx +60 -0
  305. package/eventcatalog/src/features/studio/components/JoinForm.tsx +101 -26
  306. package/eventcatalog/src/features/studio/components/LeftPanel.tsx +122 -230
  307. package/eventcatalog/src/features/studio/components/NodeDetails.tsx +183 -0
  308. package/eventcatalog/src/features/studio/components/OpenInStudioDialog.tsx +79 -0
  309. package/eventcatalog/src/features/studio/components/Presence.tsx +52 -45
  310. package/eventcatalog/src/features/studio/components/ShareDialog.tsx +277 -141
  311. package/eventcatalog/src/features/studio/components/ShortcutsDialog.tsx +41 -0
  312. package/eventcatalog/src/features/studio/components/StudioDesigner.tsx +1314 -385
  313. package/eventcatalog/src/features/studio/components/StudioNotice.astro +24 -0
  314. package/eventcatalog/src/features/studio/document-name.ts +7 -0
  315. package/eventcatalog/src/features/studio/from-visualiser.ts +138 -0
  316. package/eventcatalog/src/features/studio/hooks/presence-sender.ts +19 -2
  317. package/eventcatalog/src/features/studio/hooks/use-canvas-webmcp.ts +9 -3
  318. package/eventcatalog/src/features/studio/hooks/use-comments.ts +2 -2
  319. package/eventcatalog/src/features/studio/hooks/use-follow-camera.ts +8 -3
  320. package/eventcatalog/src/features/studio/hooks/use-studio-flow.ts +244 -32
  321. package/eventcatalog/src/features/studio/identity.ts +25 -1
  322. package/eventcatalog/src/features/studio/limits.ts +2 -0
  323. package/eventcatalog/src/features/studio/pages/[id].astro +42 -16
  324. package/eventcatalog/src/features/studio/pages/index.astro +596 -373
  325. package/eventcatalog/src/features/studio/pages/webmcp-relay.ts +12 -15
  326. package/eventcatalog/src/features/studio/server/canvas-mcp.ts +8 -23
  327. package/eventcatalog/src/features/studio/server/runtime.ts +150 -46
  328. package/eventcatalog/src/features/studio/server/sql/storage.sql +18 -0
  329. package/eventcatalog/src/features/studio/server/storage.ts +53 -73
  330. package/eventcatalog/src/features/studio/webmcp-relay/LICENSE +21 -0
  331. package/eventcatalog/src/features/studio/webmcp-relay/README.md +5 -0
  332. package/eventcatalog/src/features/studio/webmcp-relay/embed.js +2 -0
  333. package/eventcatalog/src/features/studio/webmcp-relay/widget.html +10 -0
  334. package/eventcatalog/src/features/studio/webmcp-relay/widget.js +1 -0
  335. package/eventcatalog/src/features/tools/catalog-tools.ts +3 -1
  336. package/eventcatalog/src/layouts/BaseLayout.astro +4 -4
  337. package/eventcatalog/src/layouts/SettingsLayout.astro +2 -2
  338. package/eventcatalog/src/layouts/VerticalSideBarLayout.astro +3 -2
  339. package/eventcatalog/src/pages/_index.astro +5 -342
  340. package/eventcatalog/src/pages/architecture/[type]/[id]/[version]/_index.data.spec.ts +2 -3
  341. package/eventcatalog/src/pages/architecture/[type]/[id]/[version]/_index.data.ts +0 -7
  342. package/eventcatalog/src/pages/architecture/[type]/[id]/[version]/index.astro +3 -1
  343. package/eventcatalog/src/pages/diagrams/[id]/[version]/_index.data.ts +0 -7
  344. package/eventcatalog/src/pages/diagrams/[id]/[version]/embed.astro +1 -0
  345. package/eventcatalog/src/pages/diagrams/[id]/[version]/index.astro +1 -0
  346. package/eventcatalog/src/pages/directory/[type]/_index.data.ts +5 -7
  347. package/eventcatalog/src/pages/directory/[type]/index.astro +3 -1
  348. package/eventcatalog/src/pages/discover/[type]/_index.data.ts +5 -7
  349. package/eventcatalog/src/pages/discover/[type]/index.astro +3 -1
  350. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/[docVersion]/_index.data.ts +0 -7
  351. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/[docVersion]/index.astro +1 -0
  352. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/_index.data.ts +0 -7
  353. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/index.astro +1 -0
  354. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/_index.data.ts +0 -7
  355. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/asyncapi/[filename].astro +3 -1
  356. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/asyncapi/_[filename].data.ts +0 -7
  357. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/changelog/_index.data.ts +0 -7
  358. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/changelog/index.astro +1 -0
  359. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/examples/[...filename].astro +1 -0
  360. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/examples/_[...filename].data.ts +0 -4
  361. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/field-lineage/_index.data.ts +0 -7
  362. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/field-lineage/index.astro +1 -0
  363. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/graphql/[filename].astro +3 -1
  364. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/graphql/_[filename].data.ts +0 -7
  365. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/index.astro +1 -0
  366. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/resources/_index.data.spec.ts +2 -3
  367. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/resources/_index.data.ts +0 -7
  368. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/resources/index.astro +1 -0
  369. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/spec/[filename].astro +1 -0
  370. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/spec/_[filename].data.ts +0 -7
  371. package/eventcatalog/src/pages/docs/[type]/[id]/_index.data.ts +0 -7
  372. package/eventcatalog/src/pages/docs/[type]/[id]/index.astro +2 -1
  373. package/eventcatalog/src/pages/docs/[type]/[id]/language/[dictionaryId]/_index.data.ts +0 -7
  374. package/eventcatalog/src/pages/docs/[type]/[id]/language/[dictionaryId]/index.astro +1 -0
  375. package/eventcatalog/src/pages/docs/[type]/[id]/language/_index.data.ts +0 -7
  376. package/eventcatalog/src/pages/docs/[type]/[id]/language/index.astro +1 -0
  377. package/eventcatalog/src/pages/docs/custom/[...path]/_index.data.ts +0 -7
  378. package/eventcatalog/src/pages/docs/custom/[...path]/index.astro +1 -0
  379. package/eventcatalog/src/pages/docs/services/[id]/[docType]/[docId]/index.astro +1 -1
  380. package/eventcatalog/src/pages/docs/services/[id]/[version]/resources/index.astro +1 -0
  381. package/eventcatalog/src/pages/docs/services/[id]/asyncapi/[filename].astro +1 -1
  382. package/eventcatalog/src/pages/docs/services/[id]/changelog/index.astro +1 -1
  383. package/eventcatalog/src/pages/docs/services/[id]/graphql/[filename].astro +1 -1
  384. package/eventcatalog/src/pages/docs/services/[id]/spec/[filename].astro +1 -1
  385. package/eventcatalog/src/pages/docs/teams/[id]/_index.data.ts +0 -7
  386. package/eventcatalog/src/pages/docs/teams/[id]/index.astro +1 -0
  387. package/eventcatalog/src/pages/docs/users/[id]/_index.data.ts +0 -7
  388. package/eventcatalog/src/pages/docs/users/[id]/index.astro +1 -0
  389. package/eventcatalog/src/pages/index.astro +4 -2
  390. package/eventcatalog/src/pages/schemas/[type]/[id]/[version]/_index.data.ts +0 -7
  391. package/eventcatalog/src/pages/schemas/[type]/[id]/[version]/index.astro +9 -1
  392. package/eventcatalog/src/pages/schemas/explorer/_index.data.ts +0 -7
  393. package/eventcatalog/src/pages/schemas/explorer/index.astro +4 -2
  394. package/eventcatalog/src/pages/settings/license.astro +9 -1
  395. package/eventcatalog/src/pages/triggers/[type]/[id]/[version]/_index.data.ts +0 -7
  396. package/eventcatalog/src/pages/triggers/[type]/[id]/[version]/index.astro +1 -0
  397. package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/_index.data.ts +0 -7
  398. package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/data/_index.data.ts +0 -7
  399. package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/data/index.astro +1 -0
  400. package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/entity-map/_index.data.ts +0 -7
  401. package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/entity-map/index.astro +1 -0
  402. package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/index.astro +1 -0
  403. package/eventcatalog/src/pages/visualiser/[type]/[id]/_index.data.ts +38 -0
  404. package/eventcatalog/src/pages/visualiser/[type]/[id]/index.astro +18 -41
  405. package/eventcatalog/src/pages/visualiser/designs/[id]/_index.data.ts +0 -7
  406. package/eventcatalog/src/pages/visualiser/designs/[id]/index.astro +2 -1
  407. package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/entity-map/_index.data.ts +0 -7
  408. package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/entity-map/index.astro +1 -0
  409. package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/index.astro +1 -0
  410. package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/systems-context/_index.data.ts +0 -7
  411. package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/systems-context/index.astro +1 -0
  412. package/eventcatalog/src/pages/visualiser/systems/[id]/[version]/context/_index.data.ts +0 -7
  413. package/eventcatalog/src/pages/visualiser/systems/[id]/[version]/context/index.astro +1 -0
  414. package/eventcatalog/src/pages/visualiser/systems/[id]/[version]/index.astro +1 -0
  415. package/eventcatalog/src/types/react-syntax-highlighter.d.ts +10 -0
  416. package/eventcatalog/src/utils/collections/flows.ts +20 -7
  417. package/eventcatalog/src/utils/collections/resource-owners.ts +8 -2
  418. package/eventcatalog/src/utils/collections/resources.ts +2 -0
  419. package/eventcatalog/src/utils/collections/util.ts +8 -4
  420. package/eventcatalog/src/utils/git.ts +11 -0
  421. package/eventcatalog/src/utils/homepage-dashboard.ts +143 -0
  422. package/eventcatalog/src/utils/license.ts +1 -1
  423. package/eventcatalog/src/utils/link-validation.ts +25 -19
  424. package/eventcatalog/src/utils/node-graphs/domain-entity-map.ts +3 -1
  425. package/eventcatalog/src/utils/node-graphs/domain-levels-node-graph.ts +3 -3
  426. package/eventcatalog/src/utils/node-graphs/field-node-graph.ts +4 -2
  427. package/eventcatalog/src/utils/node-graphs/layout-node-graph.ts +20 -1
  428. package/eventcatalog/src/utils/node-graphs/node-resource.ts +67 -0
  429. package/eventcatalog/src/utils/node-graphs/systems-node-graph.ts +1 -1
  430. package/eventcatalog/src/utils/page-loaders/hybrid-page.ts +4 -15
  431. package/eventcatalog/src/utils/page-title.ts +15 -0
  432. package/eventcatalog/src/utils/syntax-highlighter-renderer.ts +64 -0
  433. package/eventcatalog/src/utils/trial.ts +13 -0
  434. package/package.json +11 -11
  435. package/dist/docs/development/ask-your-architecture/05-skills/02-installation.md +0 -60
  436. package/dist/docs/development/ask-your-architecture/05-skills/_category_.json +0 -11
  437. package/dist/docs/development/ask-your-architecture/06-slack-integration/01-introduction.md +0 -63
  438. package/dist/docs/development/ask-your-architecture/06-slack-integration/02-slack-app-setup.md +0 -154
  439. package/dist/docs/development/ask-your-architecture/06-slack-integration/03-installation.md +0 -169
  440. package/dist/docs/development/ask-your-architecture/06-slack-integration/04-deployment.md +0 -236
  441. package/dist/docs/development/ask-your-architecture/06-slack-integration/05-usage.md +0 -140
  442. package/dist/docs/development/ask-your-architecture/06-slack-integration/06-troubleshooting.md +0 -268
  443. package/dist/docs/development/ask-your-architecture/06-slack-integration/_category_.json +0 -13
  444. package/dist/docs/development/guides/domains/06-visualize-domains/01-domain-integration-map.md +0 -40
  445. package/dist/runtime-dependencies/@mcp-b__webmcp-local-relay.mjs +0 -3
  446. package/eventcatalog/src/features/studio/canvas-doc.ts +0 -409
  447. package/eventcatalog/src/features/studio/clipboard.ts +0 -97
  448. package/eventcatalog/src/features/studio/components/CanvasControls.tsx +0 -154
  449. package/eventcatalog/src/features/studio/components/Comments.tsx +0 -770
  450. package/eventcatalog/src/features/studio/components/ContainerChooser.tsx +0 -145
  451. package/eventcatalog/src/features/studio/components/DragGhost.tsx +0 -115
  452. package/eventcatalog/src/features/studio/components/Picture.tsx +0 -21
  453. package/eventcatalog/src/features/studio/components/PropertiesPanel.tsx +0 -212
  454. package/eventcatalog/src/features/studio/components/canvas-nodes.tsx +0 -255
  455. package/eventcatalog/src/features/studio/components/icons.ts +0 -53
  456. package/eventcatalog/src/features/studio/components/status.ts +0 -51
  457. package/eventcatalog/src/features/studio/edges.ts +0 -56
  458. package/eventcatalog/src/features/studio/flow-state.ts +0 -92
  459. package/eventcatalog/src/features/studio/grouping.ts +0 -226
  460. package/eventcatalog/src/features/studio/layout.ts +0 -42
  461. package/eventcatalog/src/features/studio/levels.ts +0 -282
  462. package/eventcatalog/src/features/studio/node-types.ts +0 -205
  463. package/eventcatalog/src/features/studio/pages/new.astro +0 -24
  464. package/eventcatalog/src/features/studio/pages/wake.ts +0 -15
  465. package/eventcatalog/src/features/studio/placement.ts +0 -197
  466. package/eventcatalog/src/features/studio/studio.css +0 -273
  467. package/dist/{chunk-A2RZR3U4.js → chunk-6K7XZAYI.js} +3 -3
@@ -17,8 +17,8 @@ declare const getLicenseAnalytics: (license?: LicenseStatus, tsd?: unknown) => {
17
17
  };
18
18
  type Row = [label: string, value: string];
19
19
  /**
20
- * What the license box says: a headline, the facts as aligned rows ("Licensed to acme"), and links on their own
21
- * rows, so it can be read at a glance. `text` is the box's content without colours.
20
+ * What the license box says: a headline, the facts as aligned rows ("Licensed to acme"), links on their own
21
+ * rows, and an optional note at the end, so it can be read at a glance. `text` is the box's content without colours.
22
22
  */
23
23
  type LicenseStatusMessage = {
24
24
  title: string;
@@ -26,6 +26,7 @@ type LicenseStatusMessage = {
26
26
  headline: string;
27
27
  rows: Row[];
28
28
  links: Row[];
29
+ note?: string[];
29
30
  text: string;
30
31
  };
31
32
  /**
@@ -17,8 +17,8 @@ declare const getLicenseAnalytics: (license?: LicenseStatus, tsd?: unknown) => {
17
17
  };
18
18
  type Row = [label: string, value: string];
19
19
  /**
20
- * What the license box says: a headline, the facts as aligned rows ("Licensed to acme"), and links on their own
21
- * rows, so it can be read at a glance. `text` is the box's content without colours.
20
+ * What the license box says: a headline, the facts as aligned rows ("Licensed to acme"), links on their own
21
+ * rows, and an optional note at the end, so it can be read at a glance. `text` is the box's content without colours.
22
22
  */
23
23
  type LicenseStatusMessage = {
24
24
  title: string;
@@ -26,6 +26,7 @@ type LicenseStatusMessage = {
26
26
  headline: string;
27
27
  rows: Row[];
28
28
  links: Row[];
29
+ note?: string[];
29
30
  text: string;
30
31
  };
31
32
  /**
@@ -3,7 +3,7 @@ import {
3
3
  getLicenseStatus,
4
4
  getLicenseStatusMessage,
5
5
  printLicenseStatus
6
- } from "../chunk-AWOO63ME.js";
6
+ } from "../chunk-AD7CL772.js";
7
7
  export {
8
8
  getLicenseAnalytics,
9
9
  getLicenseStatus,
@@ -27,6 +27,7 @@ import expressiveCode from 'astro-expressive-code';
27
27
  // preprocessors and the rehype plugin below load those same package defaults.
28
28
  import expressiveCodeConfig from './ec.config.mjs';
29
29
  import ecstudioWatcher from './integrations/ecstudio-watcher.mjs';
30
+ import storage from './integrations/storage.mjs';
30
31
  import studioServer from './integrations/studio-server.mjs';
31
32
  import eventCatalogIntegration from './src/features/integrations/eventcatalog-features.ts';
32
33
  import eventCatalogRuntime, { getDevServerFileSystem, packageDirectory } from './integrations/eventcatalog-runtime.mjs';
@@ -34,6 +35,8 @@ import config from './src/utils/eventcatalog-config/source.ts';
34
35
  import preprocessExpressiveCodeConfig from './integrations/expressive-code-config.mjs';
35
36
  import catalogAssets from './integrations/catalog-assets.mjs';
36
37
  import runtimeDependencies from './integrations/runtime-dependencies.mjs';
38
+ import stableDependencyOrder from './integrations/stable-dependency-order.mjs';
39
+ import skipStartupReload from './integrations/skip-startup-reload.mjs';
37
40
  import { getRuntimePaths } from './integrations/runtime-paths.mjs';
38
41
  import { collectClientDependencies } from './integrations/client-dependencies.mjs';
39
42
 
@@ -114,6 +117,11 @@ export default defineConfig({
114
117
 
115
118
  // just turn this off for all users (for now...)
116
119
  devToolbar: { enabled: false },
120
+ build: {
121
+ // Render several pages at once: pages wait on file reads and graph layouts, and a 640-event
122
+ // catalog built in ~40s rather than ~70s, with the same pages and less memory.
123
+ concurrency: 4,
124
+ },
117
125
 
118
126
  // Unused resource types are valid. Astro otherwise warns on every getCollection()
119
127
  // call for those empty collections ("check your content config file for errors").
@@ -140,6 +148,8 @@ export default defineConfig({
140
148
  catalogAssets({ projectDirectory, generatedDirectory: join(runtimeDirectory, 'public') }),
141
149
  effectiveOutput !== 'server' && compress && (await loadAstroCompressIntegration(projectDirectory)),
142
150
  ecstudioWatcher(),
151
+ // Before Studio: its database is opened and migrated first
152
+ storage(),
143
153
  studioServer(),
144
154
  eventCatalogIntegration(),
145
155
  linkValidation(config.linkValidation),
@@ -163,6 +173,8 @@ export default defineConfig({
163
173
  },
164
174
  plugins: [
165
175
  runtimeDependencies(),
176
+ stableDependencyOrder(),
177
+ skipStartupReload(),
166
178
  tailwindcss(),
167
179
  ...(await eventCatalogLikeC4(projectDirectory)),
168
180
  ...(config.trailingSlash === true ? [astroTrailingSlashEndpointFix()] : []),
@@ -221,7 +233,15 @@ export default defineConfig({
221
233
  },
222
234
  optimizeDeps: {
223
235
  exclude: [],
224
- include: collectClientDependencies(),
236
+ include: [
237
+ ...collectClientDependencies(),
238
+ // <ClientRouter /> imports these from a virtual module the dependency scan can't follow,
239
+ // so without them every cold start re-bundles on the first page and reloads it
240
+ 'astro/virtual-modules/transitions-events.js',
241
+ 'astro/virtual-modules/transitions-router.js',
242
+ 'astro/virtual-modules/transitions-swap-functions.js',
243
+ 'astro/virtual-modules/transitions-types.js',
244
+ ],
225
245
  },
226
246
  },
227
247
  });
@@ -1,8 +1,8 @@
1
- import { readFile, rm, copyFile, mkdtemp, symlink } from 'node:fs/promises';
1
+ import { readFile, rm } from 'node:fs/promises';
2
2
  import { existsSync } from 'node:fs';
3
3
  import path from 'node:path';
4
4
  import { pathToFileURL } from 'node:url';
5
- import { tmpdir } from 'node:os';
5
+ import { register } from 'node:module';
6
6
 
7
7
  export async function cleanup(projectDirectory) {
8
8
  const filePath = path.join(projectDirectory, 'eventcatalog.config.mjs');
@@ -11,75 +11,73 @@ export async function cleanup(projectDirectory) {
11
11
  }
12
12
  }
13
13
 
14
- const findNodeModulesDirectory = (directory) => {
15
- let currentDirectory = directory;
16
-
17
- while (true) {
18
- const nodeModulesDirectory = path.join(currentDirectory, 'node_modules');
19
-
20
- if (existsSync(nodeModulesDirectory)) {
21
- return nodeModulesDirectory;
22
- }
23
-
24
- const parentDirectory = path.dirname(currentDirectory);
25
-
26
- if (parentDirectory === currentDirectory) {
27
- return undefined;
28
- }
29
-
30
- currentDirectory = parentDirectory;
31
- }
14
+ let hidesConfigModuleTypeWarning = false;
15
+ let loads = 0;
16
+
17
+ /**
18
+ * Node loads an eventcatalog.config.js that uses import/export as an ES module even when the catalog's
19
+ * package.json has no "type": "module" (a new catalog's doesn't), and warns that it had to detect it.
20
+ * That warning, for the config file only, is hidden: the catalog doesn't need to change anything.
21
+ */
22
+ const hideConfigModuleTypeWarning = () => {
23
+ if (hidesConfigModuleTypeWarning) return;
24
+ hidesConfigModuleTypeWarning = true;
25
+
26
+ const emitWarning = process.emitWarning;
27
+ process.emitWarning = function (warning, ...args) {
28
+ const code = typeof args[0] === 'object' ? args[0]?.code : args[1];
29
+ const message = typeof warning === 'string' ? warning : warning?.message;
30
+ if (code === 'MODULE_TYPELESS_PACKAGE_JSON' && message?.includes('eventcatalog.config.js')) return;
31
+ return emitWarning.call(this, warning, ...args);
32
+ };
32
33
  };
33
34
 
34
- const linkNodeModulesIntoTempDirectory = async ({ projectDirectory, tempDir }) => {
35
- const nodeModulesDirectory = findNodeModulesDirectory(projectDirectory);
36
-
37
- if (!nodeModulesDirectory) {
38
- return;
39
- }
40
-
41
- await symlink(nodeModulesDirectory, path.join(tempDir, 'node_modules'), 'dir');
35
+ // Marks a config URL Node should load as an ES module, whatever the catalog's package.json says
36
+ const AS_MODULE_QUERY = 'eventcatalog-config-as-module';
37
+ let loadsMarkedConfigsAsModules = false;
38
+
39
+ /**
40
+ * Node won't load a config written with import/export in a catalog whose package.json has
41
+ * "type": "commonjs". A loader hook loads that config file (and only it) as an ES module.
42
+ */
43
+ const loadMarkedConfigsAsModules = () => {
44
+ if (loadsMarkedConfigsAsModules) return;
45
+ loadsMarkedConfigsAsModules = true;
46
+ const hook = `export async function load(url, context, nextLoad) {
47
+ return nextLoad(url, url.includes('${AS_MODULE_QUERY}=') ? { ...context, format: 'module' } : context);
48
+ }`;
49
+ register(`data:text/javascript,${encodeURIComponent(hook)}`);
42
50
  };
43
51
 
44
- const createTemporaryConfigDirectory = async (projectDirectory) => {
45
- const nodeModulesDirectory = findNodeModulesDirectory(projectDirectory);
46
-
47
- if (nodeModulesDirectory) {
48
- return mkdtemp(path.join(nodeModulesDirectory, '.eventcatalog-config-'));
52
+ /**
53
+ * Loads the catalog's eventcatalog.config.js from where it is, so paths it builds from its own location
54
+ * (`import.meta.url`, `import.meta.dirname`) and its relative imports point into the catalog. It was
55
+ * loaded from a copy in a temporary folder before, which broke them (e.g. the paths to a generator's specs).
56
+ */
57
+ const isCommonJSPackage = async (projectDirectory) => {
58
+ try {
59
+ const packageJson = JSON.parse(await readFile(path.join(projectDirectory, 'package.json'), 'utf-8'));
60
+ return packageJson?.type === 'commonjs';
61
+ } catch {
62
+ return false;
49
63
  }
50
-
51
- const tempDir = await mkdtemp(path.join(tmpdir(), 'eventcatalog-config-'));
52
- await linkNodeModulesIntoTempDirectory({ projectDirectory, tempDir });
53
- return tempDir;
54
64
  };
55
65
 
56
66
  export const getEventCatalogConfigFile = async (projectDirectory) => {
57
- let tempDir;
58
-
59
67
  try {
60
- let configFilePath = path.join(projectDirectory, 'eventcatalog.config.js');
61
-
62
- const filePath = path.join(projectDirectory, 'package.json');
63
- const packageJson = JSON.parse(await readFile(filePath, 'utf-8'));
68
+ hideConfigModuleTypeWarning();
69
+ // A catalog's config is an ES module, as it always was (with "type": "commonjs" it was loaded from an .mjs copy)
70
+ const asModule = await isCommonJSPackage(projectDirectory);
71
+ if (asModule) loadMarkedConfigsAsModules();
64
72
 
65
- if (packageJson?.type !== 'module') {
66
- // Importing CommonJS config via ESM import requires an .mjs file.
67
- // Keep this temp copy outside the project directory so Astro/Vite
68
- // file watchers do not trigger a dev-server restart during startup.
69
- tempDir = await createTemporaryConfigDirectory(projectDirectory);
70
- configFilePath = path.join(tempDir, 'eventcatalog.config.mjs');
71
- await copyFile(path.join(projectDirectory, 'eventcatalog.config.js'), configFilePath);
72
- }
73
-
74
- const configFileURL = `${pathToFileURL(configFilePath).href}?t=${Date.now()}`;
75
- const config = await import(/* @vite-ignore */ configFileURL);
73
+ const configFileURL = pathToFileURL(path.join(projectDirectory, 'eventcatalog.config.js')).href;
74
+ // A new URL each time, so a changed config is loaded again (not `?t=`: Vite drops it as its own timestamp)
75
+ const query = `${asModule ? AS_MODULE_QUERY : 'loaded'}=${Date.now()}-${loads++}`;
76
+ const config = await import(/* @vite-ignore */ `${configFileURL}?${query}`);
76
77
 
77
78
  return config.default;
78
79
  } finally {
80
+ // Earlier versions loaded a copy from eventcatalog.config.mjs in the catalog: remove one left behind
79
81
  await cleanup(projectDirectory);
80
-
81
- if (tempDir) {
82
- await rm(tempDir, { recursive: true, force: true });
83
- }
84
82
  }
85
83
  };
@@ -0,0 +1,31 @@
1
+ // Astro writes its content data store as the dev server starts, which sends the browser a
2
+ // full reload. With no browser connected yet, Vite holds that reload and hands it to the
3
+ // first page that connects, so the first page opened after every start loaded twice.
4
+ // A reload sent before any page has been served has nothing to refresh (a tab left open
5
+ // from the previous run reloads itself when it reconnects), so drop those. Once a page has
6
+ // been requested, reloads pass through as usual.
7
+
8
+ const isFullReload = (payload) => typeof payload === 'object' && payload?.type === 'full-reload';
9
+
10
+ export default function skipStartupReload() {
11
+ return {
12
+ name: 'eventcatalog:skip-startup-reload',
13
+ apply: 'serve',
14
+ configureServer(server) {
15
+ let pageRequested = false;
16
+ server.middlewares.use((req, _res, next) => {
17
+ // Browser navigations ask for HTML; the CLI's prewarm request doesn't
18
+ if (!pageRequested && req.headers.accept?.includes('text/html')) pageRequested = true;
19
+ next();
20
+ });
21
+
22
+ for (const channel of new Set([server.ws, server.environments?.client?.hot].filter(Boolean))) {
23
+ const send = channel.send.bind(channel);
24
+ channel.send = (...args) => {
25
+ if (!pageRequested && isFullReload(args[0])) return;
26
+ return send(...args);
27
+ };
28
+ }
29
+ },
30
+ };
31
+ }
@@ -0,0 +1,29 @@
1
+ // Astro crawls framework packages with vitefu, which looks them up concurrently and lists
2
+ // each one in `resolve.external` / `resolve.noExternal` as its lookup finishes, so the
3
+ // order changes from one start to the next. Vite hashes these lists unsorted to decide
4
+ // whether its pre-bundled dependencies are still valid, so every `eventcatalog dev` saw a
5
+ // "changed" config and re-bundled all of them. Only membership matters in these lists, so
6
+ // sorting them keeps the hash (and the dependency cache) stable across starts.
7
+
8
+ const byName = (a, b) => {
9
+ const left = String(a);
10
+ const right = String(b);
11
+ return left < right ? -1 : left > right ? 1 : 0;
12
+ };
13
+
14
+ const sortResolveLists = (resolve) => {
15
+ if (Array.isArray(resolve?.external)) resolve.external.sort(byName);
16
+ if (Array.isArray(resolve?.noExternal)) resolve.noExternal.sort(byName);
17
+ };
18
+
19
+ export default function stableDependencyOrder() {
20
+ return {
21
+ name: 'eventcatalog:stable-dependency-order',
22
+ apply: 'serve',
23
+ configResolved(config) {
24
+ sortResolveLists(config.resolve);
25
+ sortResolveLists(config.ssr);
26
+ for (const environment of Object.values(config.environments ?? {})) sortResolveLists(environment.resolve);
27
+ },
28
+ };
29
+ }
@@ -0,0 +1,20 @@
1
+ import { startStorage } from '../src/features/storage/database.ts';
2
+
3
+ // The state EventCatalog keeps (`storage` in eventcatalog.config.js): as the dev server starts, its database is opened
4
+ // and brought up to date (migrated), whether or not a feature that uses it is opened. `eventcatalog start` does the
5
+ // same through /_eventcatalog/start.
6
+ export default function storage() {
7
+ return {
8
+ name: 'eventcatalog-storage',
9
+ hooks: {
10
+ 'astro:server:setup': async ({ logger }) => {
11
+ try {
12
+ const file = await startStorage();
13
+ if (file) logger.info(`Database ready (${file})`);
14
+ } catch (error) {
15
+ logger.error(`Could not open the database: ${error.message}`);
16
+ }
17
+ },
18
+ },
19
+ };
20
+ }
@@ -1,4 +1,5 @@
1
1
  import { getStudioRuntime } from '../src/features/studio/server/runtime.ts';
2
+ import { isDatabaseTooNew } from '../src/features/storage/migrations.ts';
2
3
  import config from '../src/utils/eventcatalog-config/source.ts';
3
4
  import { isCanvasEnabled } from '../src/utils/feature.ts';
4
5
 
@@ -14,8 +15,10 @@ export default function studioServer() {
14
15
  const projectDirectory = process.env.PROJECT_DIR || process.cwd();
15
16
  // Canvases are loaded from storage before anyone can open one
16
17
  try {
17
- await runtime.useStorage(config.studio?.storage, projectDirectory);
18
+ await runtime.useStorage(config.storage, projectDirectory);
18
19
  } catch (error) {
20
+ // Not kept in memory instead (changes would quietly stop being saved): Studio's pages say why
21
+ if (isDatabaseTooNew(error)) return logger.error(`Studio isn't available: ${error.message}`);
19
22
  logger.error(`Could not use the Studio storage configured, keeping canvases in memory: ${error.message}`);
20
23
  await runtime.useStorage({ type: 'memory' }, projectDirectory);
21
24
  }
@@ -170,6 +170,16 @@ const nodeRadius = (degree: number, isHub = false) =>
170
170
  /** Above this node count, expensive extras (collision force) are disabled. */
171
171
  const LARGE_GRAPH_NODE_COUNT = 1500;
172
172
 
173
+ /**
174
+ * The first layout settles before it paints instead of animating into place for ~5s: ticks
175
+ * run in short slices across frames (no long tasks) until it settles, ~40ms of work for 100
176
+ * nodes. Big catalogs stop once ticking has taken the work limit, paint past their largest
177
+ * moves and animate the rest. The limit counts ticking time, not elapsed time, so a page busy
178
+ * hydrating other islands doesn't cut the settle short.
179
+ */
180
+ const INITIAL_SETTLE_SLICE_MS = 12;
181
+ const INITIAL_SETTLE_WORK_LIMIT_MS = 400;
182
+
173
183
  /** Sprite resolution for node icons (drawn scaled-down, so keep it crisp) */
174
184
  const ICON_SPRITE_SIZE = 64;
175
185
 
@@ -617,6 +627,10 @@ const CatalogForceGraph = ({
617
627
  // normal-sized, whatever the lens's usual hubs are
618
628
  const isHub = (d: SimNode) => (focusKey ? d.key === focusKey : hubs.has(d.collection));
619
629
 
630
+ // Later layouts (lens, focus and filter changes) animate from the previous positions
631
+ const isFirstLayout = positionsRef.current.size === 0;
632
+ // Nothing paints until the first layout has settled (see INITIAL_SETTLE_SLICE_MS)
633
+ let settling = isFirstLayout;
620
634
  const visibleNodes: SimNode[] = viewNodes
621
635
  .filter((n) => !hiddenCollections.has(n.collection))
622
636
  .map((n) => ({ ...n, degree: 0, ...positionsRef.current.get(n.key) }));
@@ -734,6 +748,7 @@ const CatalogForceGraph = ({
734
748
  };
735
749
 
736
750
  const draw = () => {
751
+ if (settling) return;
737
752
  context.save();
738
753
  context.setTransform(devicePixelRatio, 0, 0, devicePixelRatio, 0, 0);
739
754
  context.clearRect(0, 0, width, height);
@@ -1014,6 +1029,29 @@ const CatalogForceGraph = ({
1014
1029
  );
1015
1030
  }
1016
1031
 
1032
+ // Settle the first layout before it paints rather than animating it into place
1033
+ let settleFrame: number | undefined;
1034
+ if (isFirstLayout) {
1035
+ simulation.stop();
1036
+ let workLeft = INITIAL_SETTLE_WORK_LIMIT_MS;
1037
+ const settle = () => {
1038
+ const sliceStart = performance.now();
1039
+ const sliceEnd = sliceStart + Math.min(INITIAL_SETTLE_SLICE_MS, workLeft);
1040
+ while (simulation.alpha() > simulation.alphaMin() && performance.now() < sliceEnd) simulation.tick();
1041
+ workLeft -= performance.now() - sliceStart;
1042
+ if (simulation.alpha() > simulation.alphaMin() && workLeft > 0) {
1043
+ settleFrame = requestAnimationFrame(settle);
1044
+ return;
1045
+ }
1046
+ settling = false;
1047
+ // Settled: paint it as is (restarting would run one tick more than the animated
1048
+ // layout). Otherwise paint and animate whatever is left.
1049
+ if (simulation.alpha() <= simulation.alphaMin()) fitToView();
1050
+ else simulation.restart();
1051
+ };
1052
+ settleFrame = requestAnimationFrame(settle);
1053
+ }
1054
+
1017
1055
  const findNode = (canvasX: number, canvasY: number): SimNode | null => {
1018
1056
  if (Number.isNaN(canvasX) || Number.isNaN(canvasY)) return null;
1019
1057
  const x = transform.invertX(canvasX);
@@ -1219,6 +1257,7 @@ const CatalogForceGraph = ({
1219
1257
  for (const node of visibleNodes) {
1220
1258
  if (node.x !== undefined && node.y !== undefined) positionsRef.current.set(node.key, { x: node.x, y: node.y });
1221
1259
  }
1260
+ if (settleFrame !== undefined) cancelAnimationFrame(settleFrame);
1222
1261
  simulation.stop();
1223
1262
  // The tooltip outlives this effect — never leave it showing stale content
1224
1263
  tooltip.style.opacity = '0';
@@ -29,6 +29,8 @@ const CHAT_PANEL_STYLES = `
29
29
  }
30
30
  .ec-chat-surface { font-weight: 400; }
31
31
  .ec-chat-avatar { background: rgb(var(--ec-accent) / .06); animation: ec-chat-breathe 5s ease-in-out infinite; }
32
+ /* The closed panel stays on the page (off screen): a running animation there still costs every frame */
33
+ .ec-chat-surface[aria-hidden='true'] .ec-chat-avatar { animation-play-state: paused; }
32
34
  .ec-chat-suggestion { width: fit-content; max-width: 100%; transition: background 180ms, transform 180ms; }
33
35
  .ec-chat-suggestion:hover { transform: translateX(3px); }
34
36
  .ec-chat-message { animation: fadeInUp 280ms ease-out both; }