@eventcatalog/core 5.0.0-beta.3 → 5.0.0-beta.30

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 (277) 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 +160 -77
  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-6OC46WQJ.js → chunk-55QETQZ3.js} +66 -35
  22. package/dist/{chunk-TQLRG35T.js → chunk-AD7CL772.js} +78 -45
  23. package/dist/chunk-CA6WCQ2T.js +54 -0
  24. package/dist/chunk-CPW6G62V.js +17 -0
  25. package/dist/{chunk-423S2KHN.js → chunk-FLAZ2JVN.js} +4 -2
  26. package/dist/{chunk-BH2F5WPN.js → chunk-GQI5UYXZ.js} +1 -1
  27. package/dist/{chunk-GYIVJXOJ.js → chunk-NA7OTBWW.js} +1 -1
  28. package/dist/{chunk-MDWB5HLO.js → chunk-NKNOXQ62.js} +1 -1
  29. package/dist/{chunk-3PKS2IIP.js → chunk-OX6TSVHY.js} +1 -1
  30. package/dist/{chunk-36RYTYT5.js → chunk-PD7KTSYN.js} +1 -1
  31. package/dist/chunk-S5GWAUG5.js +29 -0
  32. package/dist/{chunk-NDJOAITI.js → chunk-T3OROMAU.js} +9 -3
  33. package/dist/constants.cjs +1 -1
  34. package/dist/constants.js +1 -1
  35. package/dist/eventcatalog-config-file-utils.cjs +34 -41
  36. package/dist/eventcatalog-config-file-utils.d.cts +56 -58
  37. package/dist/eventcatalog-config-file-utils.d.ts +56 -58
  38. package/dist/eventcatalog-config-file-utils.js +1 -1
  39. package/dist/eventcatalog.cjs +531 -356
  40. package/dist/eventcatalog.config.d.cts +59 -1
  41. package/dist/eventcatalog.config.d.ts +59 -1
  42. package/dist/eventcatalog.js +63 -25
  43. package/dist/features.cjs +34 -41
  44. package/dist/features.js +2 -2
  45. package/dist/federation/federate.cjs +37 -44
  46. package/dist/federation/federate.js +2 -2
  47. package/dist/generate.cjs +37 -42
  48. package/dist/generate.js +4 -4
  49. package/dist/resolve-catalog-dependencies.cjs +34 -41
  50. package/dist/resolve-catalog-dependencies.js +2 -2
  51. package/dist/runtime-dependencies/@eventcatalog__visualiser__studio-fonts.css.mjs +3 -0
  52. package/dist/runtime-dependencies/@eventcatalog__visualiser__studio.css.mjs +3 -0
  53. package/dist/runtime-dependencies/@eventcatalog__visualiser__studio.mjs +3 -0
  54. package/dist/runtime-dependencies/@hocuspocus__provider.mjs +3 -0
  55. package/dist/runtime-dependencies/@hocuspocus__server.mjs +3 -0
  56. package/dist/runtime-dependencies/@mcp-b__webmcp-local-relay.mjs +3 -0
  57. package/dist/runtime-dependencies/@mcp-b__webmcp-polyfill.mjs +3 -0
  58. package/dist/runtime-dependencies/htmlparser2.mjs +3 -0
  59. package/dist/runtime-dependencies/manifest.json +13 -1
  60. package/dist/runtime-dependencies/react-hotkeys-hook.mjs +3 -0
  61. package/dist/runtime-dependencies/react-syntax-highlighter__dist__cjs__create-element.js.mjs +3 -0
  62. package/dist/runtime-dependencies/y-protocols.mjs +3 -0
  63. package/dist/runtime-dependencies/y-protocols__awareness.mjs +3 -0
  64. package/dist/runtime-dependencies/yjs.mjs +3 -0
  65. package/dist/utils/child-process-signals.cjs +53 -0
  66. package/dist/utils/child-process-signals.d.cts +19 -0
  67. package/dist/utils/child-process-signals.d.ts +19 -0
  68. package/dist/utils/child-process-signals.js +6 -0
  69. package/dist/utils/cli-logger.cjs +1 -1
  70. package/dist/utils/cli-logger.js +2 -2
  71. package/dist/utils/license-status.cjs +78 -45
  72. package/dist/utils/license-status.d.cts +15 -5
  73. package/dist/utils/license-status.d.ts +15 -5
  74. package/dist/utils/license-status.js +1 -1
  75. package/eventcatalog/astro.config.mjs +23 -1
  76. package/eventcatalog/integrations/config-loader.mjs +56 -58
  77. package/eventcatalog/integrations/skip-startup-reload.mjs +31 -0
  78. package/eventcatalog/integrations/stable-dependency-order.mjs +29 -0
  79. package/eventcatalog/integrations/storage.mjs +20 -0
  80. package/eventcatalog/integrations/studio-server.mjs +32 -0
  81. package/eventcatalog/src/components/CatalogGraph/CatalogForceGraph.tsx +39 -0
  82. package/eventcatalog/src/components/ChatPanel/ChatPanel.tsx +2 -0
  83. package/eventcatalog/src/components/Header.astro +3 -3
  84. package/eventcatalog/src/components/Homepage/CatalogDashboard.astro +342 -0
  85. package/eventcatalog/src/components/MDX/NodeGraph/AstroNodeGraph.tsx +60 -4
  86. package/eventcatalog/src/components/MDX/NodeGraph/NodeGraph.astro +5 -1
  87. package/eventcatalog/src/components/NavigationProgress.astro +7 -0
  88. package/eventcatalog/src/components/SchemaExplorer/ApiContentViewer.tsx +2 -0
  89. package/eventcatalog/src/components/SchemaExplorer/ExamplesViewer.tsx +2 -0
  90. package/eventcatalog/src/components/SchemaExplorer/SchemaCodeModal.tsx +2 -0
  91. package/eventcatalog/src/components/SchemaExplorer/SchemaContentViewer.tsx +2 -0
  92. package/eventcatalog/src/components/Search/SearchDataLoader.astro +16 -28
  93. package/eventcatalog/src/components/Search/SearchModal.tsx +2 -10
  94. package/eventcatalog/src/components/Search/search-utils.ts +26 -0
  95. package/eventcatalog/src/components/Seo.astro +5 -1
  96. package/eventcatalog/src/components/Settings/AssistantSettingsForm.tsx +53 -48
  97. package/eventcatalog/src/components/Settings/GeneralSettingsForm.tsx +183 -178
  98. package/eventcatalog/src/components/Settings/LicenseSettings.tsx +140 -31
  99. package/eventcatalog/src/components/Settings/LlmAccessSettingsForm.tsx +40 -35
  100. package/eventcatalog/src/components/Settings/LogoUpload.tsx +1 -1
  101. package/eventcatalog/src/components/Settings/McpSettingsForm.tsx +9 -8
  102. package/eventcatalog/src/components/Settings/Row.tsx +7 -4
  103. package/eventcatalog/src/components/Settings/SettingsShared.tsx +3 -3
  104. package/eventcatalog/src/components/SideNav/NestedSideBar/index.tsx +53 -83
  105. package/eventcatalog/src/components/SideNav/NestedSideBar/storage.ts +2 -0
  106. package/eventcatalog/src/components/SideNav/NestedSideBar/utils.ts +131 -0
  107. package/eventcatalog/src/components/SideNav/SideNav.astro +9 -1
  108. package/eventcatalog/src/components/TrialBadge.astro +20 -9
  109. package/eventcatalog/src/content.config.ts +19 -2
  110. package/eventcatalog/src/features/auth/error.astro +4 -2
  111. package/eventcatalog/src/features/auth/login.astro +2 -1
  112. package/eventcatalog/src/features/auth/middleware/middleware-auth.ts +10 -0
  113. package/eventcatalog/src/features/auth/unauthorized.astro +1 -1
  114. package/eventcatalog/src/features/fields/pages/fields.astro +1 -1
  115. package/eventcatalog/src/features/integrations/eventcatalog-features.ts +34 -1
  116. package/eventcatalog/src/features/mcp/apps/architecture-diagram/node-chat.tsx +6 -45
  117. package/eventcatalog/src/features/mcp/apps/canvas/shared.ts +47 -0
  118. package/eventcatalog/src/features/mcp/apps/canvas/styles.css +24 -0
  119. package/eventcatalog/src/features/mcp/apps/canvas/view.tsx +278 -0
  120. package/eventcatalog/src/features/mcp/apps/generated/canvas.html +272 -0
  121. package/eventcatalog/src/features/mcp/apps/generated/viewer.html +65 -65
  122. package/eventcatalog/src/features/mcp/apps/shared/app-view.tsx +2 -1
  123. package/eventcatalog/src/features/mcp/mcp-apps.ts +6 -3
  124. package/eventcatalog/src/features/mcp/mcp-server.ts +36 -5
  125. package/eventcatalog/src/features/server/start.ts +25 -0
  126. package/eventcatalog/src/features/storage/database.ts +88 -0
  127. package/eventcatalog/src/features/storage/migrations.ts +85 -0
  128. package/eventcatalog/src/features/storage/sql/database.sql +5 -0
  129. package/eventcatalog/src/features/storage/sql/migrations/0001-studio-canvases.sql +12 -0
  130. package/eventcatalog/src/features/storage/sql/migrations.sql +15 -0
  131. package/eventcatalog/src/features/storage/sql.ts +28 -0
  132. package/eventcatalog/src/features/studio/agent-choreography.ts +384 -0
  133. package/eventcatalog/src/features/studio/agents.ts +28 -0
  134. package/eventcatalog/src/features/studio/api/canvases-api.ts +219 -0
  135. package/eventcatalog/src/features/studio/api/canvases.ts +25 -0
  136. package/eventcatalog/src/features/studio/api/client.ts +40 -0
  137. package/eventcatalog/src/features/studio/canvas-actions.ts +540 -0
  138. package/eventcatalog/src/features/studio/canvas-preview.ts +52 -0
  139. package/eventcatalog/src/features/studio/catalog-resources.ts +155 -0
  140. package/eventcatalog/src/features/studio/catalog.ts +173 -0
  141. package/eventcatalog/src/features/studio/components/CanvasHeader.tsx +518 -0
  142. package/eventcatalog/src/features/studio/components/CanvasStatusMenu.tsx +118 -0
  143. package/eventcatalog/src/features/studio/components/ConnectAgentDialog.tsx +434 -0
  144. package/eventcatalog/src/features/studio/components/ConnectionsChooser.tsx +143 -0
  145. package/eventcatalog/src/features/studio/components/DeleteCanvasDialog.tsx +65 -0
  146. package/eventcatalog/src/features/studio/components/Dialog.tsx +60 -0
  147. package/eventcatalog/src/features/studio/components/JoinForm.tsx +109 -0
  148. package/eventcatalog/src/features/studio/components/LeftPanel.tsx +206 -0
  149. package/eventcatalog/src/features/studio/components/NodeDetails.tsx +183 -0
  150. package/eventcatalog/src/features/studio/components/OpenInStudioDialog.tsx +79 -0
  151. package/eventcatalog/src/features/studio/components/Presence.tsx +293 -0
  152. package/eventcatalog/src/features/studio/components/ShareDialog.tsx +396 -0
  153. package/eventcatalog/src/features/studio/components/ShortcutsDialog.tsx +41 -0
  154. package/eventcatalog/src/features/studio/components/StudioDesigner.tsx +2091 -0
  155. package/eventcatalog/src/features/studio/components/StudioNotice.astro +24 -0
  156. package/eventcatalog/src/features/studio/document-name.ts +7 -0
  157. package/eventcatalog/src/features/studio/from-visualiser.ts +138 -0
  158. package/eventcatalog/src/features/studio/hooks/presence-sender.ts +63 -0
  159. package/eventcatalog/src/features/studio/hooks/presence-store.ts +119 -0
  160. package/eventcatalog/src/features/studio/hooks/use-canvas-webmcp.ts +353 -0
  161. package/eventcatalog/src/features/studio/hooks/use-comments.ts +54 -0
  162. package/eventcatalog/src/features/studio/hooks/use-follow-camera.ts +109 -0
  163. package/eventcatalog/src/features/studio/hooks/use-studio-flow.ts +782 -0
  164. package/eventcatalog/src/features/studio/identity.ts +59 -0
  165. package/eventcatalog/src/features/studio/limits.ts +2 -0
  166. package/eventcatalog/src/features/studio/pages/[id].astro +69 -0
  167. package/eventcatalog/src/features/studio/pages/index.astro +784 -0
  168. package/eventcatalog/src/features/studio/pages/webmcp-relay.ts +27 -0
  169. package/eventcatalog/src/features/studio/server/canvas-mcp.ts +495 -0
  170. package/eventcatalog/src/features/studio/server/runtime.ts +498 -0
  171. package/eventcatalog/src/features/studio/server/sign-in.ts +18 -0
  172. package/eventcatalog/src/features/studio/server/sql/storage.sql +18 -0
  173. package/eventcatalog/src/features/studio/server/storage.ts +90 -0
  174. package/eventcatalog/src/features/studio/server/tool-icons.ts +30 -0
  175. package/eventcatalog/src/features/studio/tool-sync.ts +75 -0
  176. package/eventcatalog/src/layouts/BaseLayout.astro +4 -4
  177. package/eventcatalog/src/layouts/SettingsLayout.astro +2 -2
  178. package/eventcatalog/src/layouts/VerticalSideBarLayout.astro +13 -5
  179. package/eventcatalog/src/pages/_index.astro +5 -342
  180. package/eventcatalog/src/pages/architecture/[type]/[id]/[version]/_index.data.spec.ts +2 -3
  181. package/eventcatalog/src/pages/architecture/[type]/[id]/[version]/_index.data.ts +0 -7
  182. package/eventcatalog/src/pages/architecture/[type]/[id]/[version]/index.astro +3 -1
  183. package/eventcatalog/src/pages/diagrams/[id]/[version]/_index.data.ts +0 -7
  184. package/eventcatalog/src/pages/diagrams/[id]/[version]/embed.astro +1 -0
  185. package/eventcatalog/src/pages/diagrams/[id]/[version]/index.astro +1 -0
  186. package/eventcatalog/src/pages/directory/[type]/_index.data.ts +5 -7
  187. package/eventcatalog/src/pages/directory/[type]/index.astro +3 -1
  188. package/eventcatalog/src/pages/discover/[type]/_index.data.ts +5 -7
  189. package/eventcatalog/src/pages/discover/[type]/index.astro +3 -1
  190. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/[docVersion]/_index.data.ts +0 -7
  191. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/[docVersion]/index.astro +1 -0
  192. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/_index.data.ts +0 -7
  193. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/index.astro +1 -0
  194. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/_index.data.ts +0 -7
  195. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/asyncapi/[filename].astro +3 -1
  196. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/asyncapi/_[filename].data.ts +0 -7
  197. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/changelog/_index.data.ts +0 -7
  198. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/changelog/index.astro +1 -0
  199. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/examples/[...filename].astro +1 -0
  200. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/examples/_[...filename].data.ts +0 -4
  201. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/field-lineage/_index.data.ts +0 -7
  202. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/field-lineage/index.astro +1 -0
  203. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/graphql/[filename].astro +3 -1
  204. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/graphql/_[filename].data.ts +0 -7
  205. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/index.astro +1 -0
  206. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/resources/_index.data.spec.ts +2 -3
  207. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/resources/_index.data.ts +0 -7
  208. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/resources/index.astro +1 -0
  209. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/spec/[filename].astro +1 -0
  210. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/spec/_[filename].data.ts +0 -7
  211. package/eventcatalog/src/pages/docs/[type]/[id]/_index.data.ts +0 -7
  212. package/eventcatalog/src/pages/docs/[type]/[id]/index.astro +2 -1
  213. package/eventcatalog/src/pages/docs/[type]/[id]/language/[dictionaryId]/_index.data.ts +0 -7
  214. package/eventcatalog/src/pages/docs/[type]/[id]/language/[dictionaryId]/index.astro +1 -0
  215. package/eventcatalog/src/pages/docs/[type]/[id]/language/_index.data.ts +0 -7
  216. package/eventcatalog/src/pages/docs/[type]/[id]/language/index.astro +1 -0
  217. package/eventcatalog/src/pages/docs/custom/[...path]/_index.data.ts +0 -7
  218. package/eventcatalog/src/pages/docs/custom/[...path]/index.astro +1 -0
  219. package/eventcatalog/src/pages/docs/services/[id]/[docType]/[docId]/index.astro +1 -1
  220. package/eventcatalog/src/pages/docs/services/[id]/[version]/resources/index.astro +1 -0
  221. package/eventcatalog/src/pages/docs/services/[id]/asyncapi/[filename].astro +1 -1
  222. package/eventcatalog/src/pages/docs/services/[id]/changelog/index.astro +1 -1
  223. package/eventcatalog/src/pages/docs/services/[id]/graphql/[filename].astro +1 -1
  224. package/eventcatalog/src/pages/docs/services/[id]/spec/[filename].astro +1 -1
  225. package/eventcatalog/src/pages/docs/teams/[id]/_index.data.ts +0 -7
  226. package/eventcatalog/src/pages/docs/teams/[id]/index.astro +1 -0
  227. package/eventcatalog/src/pages/docs/users/[id]/_index.data.ts +0 -7
  228. package/eventcatalog/src/pages/docs/users/[id]/index.astro +1 -0
  229. package/eventcatalog/src/pages/index.astro +4 -2
  230. package/eventcatalog/src/pages/schemas/[type]/[id]/[version]/_index.data.ts +0 -7
  231. package/eventcatalog/src/pages/schemas/[type]/[id]/[version]/index.astro +1 -0
  232. package/eventcatalog/src/pages/schemas/explorer/_index.data.ts +0 -7
  233. package/eventcatalog/src/pages/schemas/explorer/index.astro +4 -2
  234. package/eventcatalog/src/pages/settings/license.astro +9 -1
  235. package/eventcatalog/src/pages/triggers/[type]/[id]/[version]/_index.data.ts +0 -7
  236. package/eventcatalog/src/pages/triggers/[type]/[id]/[version]/index.astro +1 -0
  237. package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/_index.data.ts +0 -7
  238. package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/data/_index.data.ts +0 -7
  239. package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/data/index.astro +1 -0
  240. package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/entity-map/_index.data.ts +0 -7
  241. package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/entity-map/index.astro +1 -0
  242. package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/index.astro +1 -0
  243. package/eventcatalog/src/pages/visualiser/[type]/[id]/_index.data.ts +38 -0
  244. package/eventcatalog/src/pages/visualiser/[type]/[id]/index.astro +18 -41
  245. package/eventcatalog/src/pages/visualiser/designs/[id]/_index.data.ts +0 -7
  246. package/eventcatalog/src/pages/visualiser/designs/[id]/index.astro +2 -1
  247. package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/entity-map/_index.data.ts +0 -7
  248. package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/entity-map/index.astro +1 -0
  249. package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/index.astro +1 -0
  250. package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/systems-context/_index.data.ts +0 -7
  251. package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/systems-context/index.astro +1 -0
  252. package/eventcatalog/src/pages/visualiser/systems/[id]/[version]/context/_index.data.ts +0 -7
  253. package/eventcatalog/src/pages/visualiser/systems/[id]/[version]/context/index.astro +1 -0
  254. package/eventcatalog/src/pages/visualiser/systems/[id]/[version]/index.astro +1 -0
  255. package/eventcatalog/src/types/react-syntax-highlighter.d.ts +10 -0
  256. package/eventcatalog/src/utils/collections/util.ts +8 -4
  257. package/eventcatalog/src/utils/feature.ts +8 -0
  258. package/eventcatalog/src/utils/git.ts +22 -5
  259. package/eventcatalog/src/utils/homepage-dashboard.ts +143 -0
  260. package/eventcatalog/src/utils/license.ts +1 -1
  261. package/eventcatalog/src/utils/link-validation.ts +25 -19
  262. package/eventcatalog/src/utils/node-graphs/domain-entity-map.ts +3 -1
  263. package/eventcatalog/src/utils/node-graphs/domain-levels-node-graph.ts +3 -3
  264. package/eventcatalog/src/utils/node-graphs/export-mermaid.ts +0 -2
  265. package/eventcatalog/src/utils/node-graphs/field-node-graph.ts +4 -2
  266. package/eventcatalog/src/utils/node-graphs/layout-node-graph.ts +20 -1
  267. package/eventcatalog/src/utils/node-graphs/node-resource.ts +67 -0
  268. package/eventcatalog/src/utils/node-graphs/systems-node-graph.ts +1 -1
  269. package/eventcatalog/src/utils/page-loaders/hybrid-page.ts +4 -15
  270. package/eventcatalog/src/utils/page-title.ts +15 -0
  271. package/eventcatalog/src/utils/syntax-highlighter-renderer.ts +64 -0
  272. package/eventcatalog/src/utils/trial.ts +14 -1
  273. package/package.json +19 -13
  274. package/dist/runtime-dependencies/shelljs.mjs +0 -3
  275. package/eventcatalog/public/studio-bg.png +0 -0
  276. package/eventcatalog/src/components/Studio/StudioPageModal.tsx +0 -150
  277. package/eventcatalog/src/pages/studio.astro +0 -316
@@ -197,6 +197,38 @@ type McpConfig = {
197
197
  enabled?: boolean;
198
198
  auth?: McpAuthConfig;
199
199
  };
200
+ /**
201
+ * The state EventCatalog keeps for features that need it (today, Studio's canvases). Features always work on a copy
202
+ * held in memory by the server, so storage doesn't slow them down: it's read when the server starts and written a
203
+ * moment after something changes (and as the server stops).
204
+ */
205
+ type StorageConfig =
206
+ /** Kept only while the server runs: lost when it restarts or redeploys (the default) */
207
+ {
208
+ type: 'memory';
209
+ }
210
+ /**
211
+ * One SQLite database file for the whole catalog, brought up to date (migrated) as `eventcatalog dev` and
212
+ * `eventcatalog start` start. Uses Node.js's built-in SQLite, so needs Node.js 22.13 or later.
213
+ */
214
+ | {
215
+ type: 'sqlite';
216
+ /**
217
+ * The database file, relative to the catalog. In a container, put it on a volume (e.g. `/data/eventcatalog.db`)
218
+ * so it survives redeploys.
219
+ * @default '.eventcatalog/eventcatalog.db'
220
+ */
221
+ path?: string;
222
+ };
223
+ type StudioConfig = {
224
+ /**
225
+ * Turns Studio on in production (`output: 'server'`, served with `eventcatalog start`). It's on in the dev server
226
+ * unless this is `false`, which turns it off everywhere. Experimental. With authentication on, only signed-in people
227
+ * can open canvases, and they're shown by the name and picture they signed in with.
228
+ * @default false
229
+ */
230
+ enabled?: boolean;
231
+ };
200
232
  type GA4Config = {
201
233
  measurementId: string;
202
234
  };
@@ -257,6 +289,17 @@ interface Config {
257
289
  };
258
290
  security?: {
259
291
  checkOrigin?: boolean;
292
+ /**
293
+ * Hosts to trust in a proxy's X-Forwarded-Host and X-Forwarded-Proto headers (server output), e.g. when deployed
294
+ * behind Fly.io, Railway or a load balancer that serves HTTPS. Without it, form posts (like starting a canvas in
295
+ * Studio) fail the origin check. Passed to Astro's `security.allowedDomains`.
296
+ * @example [{ hostname: 'catalog.example.com', protocol: 'https' }]
297
+ */
298
+ allowedDomains?: {
299
+ hostname?: string;
300
+ protocol?: string;
301
+ port?: string;
302
+ }[];
260
303
  };
261
304
  /**
262
305
  * Theme for the catalog UI.
@@ -270,6 +313,13 @@ interface Config {
270
313
  theme?: CatalogTheme;
271
314
  auth?: AuthConfig;
272
315
  mcp?: McpConfig;
316
+ /** EventCatalog Studio: collaborative canvases (experimental) */
317
+ studio?: StudioConfig;
318
+ /**
319
+ * Where EventCatalog keeps state between restarts (e.g. Studio's canvases), for every feature that has some.
320
+ * @default { type: 'memory' }
321
+ */
322
+ storage?: StorageConfig;
273
323
  rss?: {
274
324
  enabled?: boolean;
275
325
  limit?: number;
@@ -410,6 +460,14 @@ interface Config {
410
460
  queries?: {
411
461
  tableConfiguration?: TableConfiguration;
412
462
  };
463
+ /**
464
+ * Anonymous telemetry for `eventcatalog dev` and `eventcatalog build`.
465
+ * On by default. Set to false to opt out.
466
+ * `EVENTCATALOG_TELEMETRY_DISABLED` or `DO_NOT_TRACK` set to `1` or `true` also opts out.
467
+ * `cloud.analytics` stays its own opt-in for EventCatalog Cloud.
468
+ * @default true
469
+ */
470
+ telemetry?: boolean;
413
471
  cloud?: EventCatalogCloudConfig;
414
472
  integrations?: IntegrationsConfig;
415
473
  scalarConfiguration?: ScalarConfiguration;
@@ -418,4 +476,4 @@ interface Config {
418
476
  federation?: FederationConfig;
419
477
  }
420
478
 
421
- export type { Config, FederationRuleId, FederationRuleLevel, FederationRulesConfig, FederationSourceConfig };
479
+ export type { Config, FederationRuleId, FederationRuleLevel, FederationRulesConfig, FederationSourceConfig, StorageConfig };
@@ -197,6 +197,38 @@ type McpConfig = {
197
197
  enabled?: boolean;
198
198
  auth?: McpAuthConfig;
199
199
  };
200
+ /**
201
+ * The state EventCatalog keeps for features that need it (today, Studio's canvases). Features always work on a copy
202
+ * held in memory by the server, so storage doesn't slow them down: it's read when the server starts and written a
203
+ * moment after something changes (and as the server stops).
204
+ */
205
+ type StorageConfig =
206
+ /** Kept only while the server runs: lost when it restarts or redeploys (the default) */
207
+ {
208
+ type: 'memory';
209
+ }
210
+ /**
211
+ * One SQLite database file for the whole catalog, brought up to date (migrated) as `eventcatalog dev` and
212
+ * `eventcatalog start` start. Uses Node.js's built-in SQLite, so needs Node.js 22.13 or later.
213
+ */
214
+ | {
215
+ type: 'sqlite';
216
+ /**
217
+ * The database file, relative to the catalog. In a container, put it on a volume (e.g. `/data/eventcatalog.db`)
218
+ * so it survives redeploys.
219
+ * @default '.eventcatalog/eventcatalog.db'
220
+ */
221
+ path?: string;
222
+ };
223
+ type StudioConfig = {
224
+ /**
225
+ * Turns Studio on in production (`output: 'server'`, served with `eventcatalog start`). It's on in the dev server
226
+ * unless this is `false`, which turns it off everywhere. Experimental. With authentication on, only signed-in people
227
+ * can open canvases, and they're shown by the name and picture they signed in with.
228
+ * @default false
229
+ */
230
+ enabled?: boolean;
231
+ };
200
232
  type GA4Config = {
201
233
  measurementId: string;
202
234
  };
@@ -257,6 +289,17 @@ interface Config {
257
289
  };
258
290
  security?: {
259
291
  checkOrigin?: boolean;
292
+ /**
293
+ * Hosts to trust in a proxy's X-Forwarded-Host and X-Forwarded-Proto headers (server output), e.g. when deployed
294
+ * behind Fly.io, Railway or a load balancer that serves HTTPS. Without it, form posts (like starting a canvas in
295
+ * Studio) fail the origin check. Passed to Astro's `security.allowedDomains`.
296
+ * @example [{ hostname: 'catalog.example.com', protocol: 'https' }]
297
+ */
298
+ allowedDomains?: {
299
+ hostname?: string;
300
+ protocol?: string;
301
+ port?: string;
302
+ }[];
260
303
  };
261
304
  /**
262
305
  * Theme for the catalog UI.
@@ -270,6 +313,13 @@ interface Config {
270
313
  theme?: CatalogTheme;
271
314
  auth?: AuthConfig;
272
315
  mcp?: McpConfig;
316
+ /** EventCatalog Studio: collaborative canvases (experimental) */
317
+ studio?: StudioConfig;
318
+ /**
319
+ * Where EventCatalog keeps state between restarts (e.g. Studio's canvases), for every feature that has some.
320
+ * @default { type: 'memory' }
321
+ */
322
+ storage?: StorageConfig;
273
323
  rss?: {
274
324
  enabled?: boolean;
275
325
  limit?: number;
@@ -410,6 +460,14 @@ interface Config {
410
460
  queries?: {
411
461
  tableConfiguration?: TableConfiguration;
412
462
  };
463
+ /**
464
+ * Anonymous telemetry for `eventcatalog dev` and `eventcatalog build`.
465
+ * On by default. Set to false to opt out.
466
+ * `EVENTCATALOG_TELEMETRY_DISABLED` or `DO_NOT_TRACK` set to `1` or `true` also opts out.
467
+ * `cloud.analytics` stays its own opt-in for EventCatalog Cloud.
468
+ * @default true
469
+ */
470
+ telemetry?: boolean;
413
471
  cloud?: EventCatalogCloudConfig;
414
472
  integrations?: IntegrationsConfig;
415
473
  scalarConfiguration?: ScalarConfiguration;
@@ -418,4 +476,4 @@ interface Config {
418
476
  federation?: FederationConfig;
419
477
  }
420
478
 
421
- export type { Config, FederationRuleId, FederationRuleLevel, FederationRulesConfig, FederationSourceConfig };
479
+ export type { Config, FederationRuleId, FederationRuleLevel, FederationRulesConfig, FederationSourceConfig, StorageConfig };
@@ -1,20 +1,24 @@
1
+ import {
2
+ runMigrations
3
+ } from "./chunk-XUAF2H54.js";
4
+ import "./chunk-CA4U2JP7.js";
5
+ import {
6
+ stopChildWithParent
7
+ } from "./chunk-S5GWAUG5.js";
1
8
  import {
2
9
  log_build_default
3
- } from "./chunk-6OC46WQJ.js";
10
+ } from "./chunk-55QETQZ3.js";
4
11
  import {
5
12
  getLicenseStatus,
6
13
  printLicenseStatus
7
- } from "./chunk-TQLRG35T.js";
14
+ } from "./chunk-AD7CL772.js";
8
15
  import "./chunk-ZAZHAVKB.js";
9
- import {
10
- runMigrations
11
- } from "./chunk-XUAF2H54.js";
12
- import "./chunk-CA4U2JP7.js";
16
+ import "./chunk-CA6WCQ2T.js";
13
17
  import {
14
18
  FederationConflictError,
15
19
  FederationDiagnosticError,
16
20
  federateCatalog
17
- } from "./chunk-3PKS2IIP.js";
21
+ } from "./chunk-OX6TSVHY.js";
18
22
  import "./chunk-WRNH5C3U.js";
19
23
  import "./chunk-5EPNFDT5.js";
20
24
  import "./chunk-6K7XZAYI.js";
@@ -30,16 +34,16 @@ import {
30
34
  isAuthEnabled,
31
35
  isIndexedSearchEnabled,
32
36
  isOutputServer
33
- } from "./chunk-MDWB5HLO.js";
37
+ } from "./chunk-NKNOXQ62.js";
34
38
  import {
35
39
  generate
36
- } from "./chunk-423S2KHN.js";
40
+ } from "./chunk-FLAZ2JVN.js";
37
41
  import {
38
42
  logger
39
- } from "./chunk-BH2F5WPN.js";
43
+ } from "./chunk-GQI5UYXZ.js";
40
44
  import {
41
45
  resolve_catalog_dependencies_default
42
- } from "./chunk-36RYTYT5.js";
46
+ } from "./chunk-PD7KTSYN.js";
43
47
  import {
44
48
  buildSearchIndex
45
49
  } from "./chunk-DJCOJ77J.js";
@@ -50,7 +54,8 @@ import {
50
54
  import {
51
55
  watch
52
56
  } from "./chunk-U63GDPPY.js";
53
- import "./chunk-NDJOAITI.js";
57
+ import "./chunk-T3OROMAU.js";
58
+ import "./chunk-CPW6G62V.js";
54
59
  import {
55
60
  getAstroConfigPath
56
61
  } from "./chunk-VIJJ7JKH.js";
@@ -66,11 +71,11 @@ import {
66
71
  } from "./chunk-LFQJXLHG.js";
67
72
  import {
68
73
  VERSION
69
- } from "./chunk-GYIVJXOJ.js";
74
+ } from "./chunk-NA7OTBWW.js";
70
75
  import {
71
76
  getEventCatalogConfigFile,
72
77
  verifyRequiredFieldsAreInCatalogConfigFile
73
- } from "./chunk-RFIXKATC.js";
78
+ } from "./chunk-4G7FSRPN.js";
74
79
 
75
80
  // src/eventcatalog.ts
76
81
  import { Command } from "commander";
@@ -79,7 +84,7 @@ import { join } from "path";
79
84
  import http from "http";
80
85
  import fs3 from "fs";
81
86
  import path2 from "path";
82
- import { fileURLToPath } from "url";
87
+ import { fileURLToPath, pathToFileURL } from "url";
83
88
  import { createRequire } from "module";
84
89
  import boxen from "boxen";
85
90
  import updateNotifier from "update-notifier";
@@ -637,6 +642,7 @@ async function buildFieldsIndex(catalogDir, outputDir) {
637
642
  // src/eventcatalog.ts
638
643
  var currentDir = path2.dirname(fileURLToPath(import.meta.url));
639
644
  var astroCli = path2.join(path2.dirname(createRequire(import.meta.url).resolve("astro/package.json")), "bin/astro.mjs");
645
+ var ASTRO_IN_FOREGROUND = { ASTRO_DEV_BACKGROUND: "1", ASTRO_PREVIEW_BACKGROUND: "1" };
640
646
  var program = new Command().version(VERSION);
641
647
  var dir = path2.resolve(process.env.PROJECT_DIR || process.cwd());
642
648
  var eventCatalogDir = path2.resolve(join(currentDir, "../eventcatalog/"));
@@ -668,7 +674,7 @@ var resolveDevPort = async ({ projectDir }) => {
668
674
  };
669
675
  var startDevPrewarm = ({
670
676
  port = 3e3,
671
- paths = ["/ping", "/"],
677
+ paths = ["/"],
672
678
  retries = 80,
673
679
  intervalMs = 250,
674
680
  initialDelayMs = 500
@@ -677,10 +683,13 @@ var startDevPrewarm = ({
677
683
  const hit = (requestPath) => new Promise((resolve) => {
678
684
  const req = http.get(
679
685
  {
680
- hostname: "127.0.0.1",
686
+ // Not 127.0.0.1: the dev server can listen on IPv6 only ([::1]), which refused
687
+ // every prewarm request
688
+ hostname: "localhost",
681
689
  port,
682
690
  path: requestPath,
683
- timeout: 1200
691
+ // A refused connection fails at once; once connected, let the first render finish
692
+ timeout: 3e4
684
693
  },
685
694
  (res) => {
686
695
  res.resume();
@@ -778,10 +787,14 @@ var runCommandWithFilteredOutput = async ({
778
787
  cwd,
779
788
  env: {
780
789
  ...process.env,
790
+ // Astro sends usage data (commands, config, machine details) to Astro by default: turn it off
791
+ // for everyone using EventCatalog
792
+ ASTRO_TELEMETRY_DISABLED: "1",
781
793
  ...env
782
794
  },
783
795
  stdio: ["inherit", "pipe", "pipe"]
784
796
  });
797
+ const signals = stopChildWithParent(child);
785
798
  let stdoutBuffer = "";
786
799
  let stderrBuffer = "";
787
800
  const flush = (buffer, writer, isFinal = false) => {
@@ -809,11 +822,13 @@ var runCommandWithFilteredOutput = async ({
809
822
  stderrBuffer = flush(stderrBuffer, process.stderr);
810
823
  });
811
824
  child.on("error", (error) => {
825
+ signals.childClosed();
812
826
  reject(error);
813
827
  });
814
828
  child.on("close", (code) => {
815
829
  stdoutBuffer = flush(stdoutBuffer, process.stdout, true);
816
830
  stderrBuffer = flush(stderrBuffer, process.stderr, true);
831
+ if (signals.childClosed()) return;
817
832
  if (code === 0) {
818
833
  resolve();
819
834
  return;
@@ -939,7 +954,9 @@ program.command("dev").description("Run development server of EventCatalog").opt
939
954
  });
940
955
  startDevPrewarm({
941
956
  port: prewarmPort,
942
- paths: ["/ping", "/"]
957
+ // Renders the homepage before anyone opens it. Requests stop at the first response,
958
+ // so a probe path like /ping first would leave the homepage cold.
959
+ paths: ["/"]
943
960
  });
944
961
  }
945
962
  await runCommandWithFilteredOutput({
@@ -951,7 +968,8 @@ program.command("dev").description("Run development server of EventCatalog").opt
951
968
  CATALOG_DIR: core,
952
969
  EVENTCATALOG_DEV_MODE: "true",
953
970
  IGNORE_BUILD_ARTIFACTS: "true",
954
- NODE_NO_WARNINGS: "1"
971
+ NODE_NO_WARNINGS: "1",
972
+ ...ASTRO_IN_FOREGROUND
955
973
  },
956
974
  shouldFilterLine: createAstroDevLineFilter(),
957
975
  transformLine: replaceAstroReadyVersionLine
@@ -1023,20 +1041,39 @@ var previewCatalog = async ({ command }) => {
1023
1041
  cwd: dir,
1024
1042
  env: {
1025
1043
  PROJECT_DIR: dir,
1026
- CATALOG_DIR: core
1044
+ CATALOG_DIR: core,
1045
+ ...ASTRO_IN_FOREGROUND
1027
1046
  },
1028
1047
  shouldFilterLine: createAstroLineFilter()
1029
1048
  });
1030
1049
  };
1050
+ var SERVER_BOOTSTRAP = `
1051
+ const entry = await import(process.argv[1]);
1052
+ const { server } = entry.startServer();
1053
+ globalThis[Symbol.for('eventcatalog.http-server')] = server.server;
1054
+ const start = process.env.EVENTCATALOG_START_PATH;
1055
+ if (start) {
1056
+ server.server.once('listening', () => {
1057
+ // Where the server listens (HOST can be one address only); loopback when it listens on every address
1058
+ const { address, port } = server.server.address();
1059
+ const host = ['0.0.0.0', '::'].includes(address) ? '127.0.0.1' : address.includes(':') ? '[' + address + ']' : address;
1060
+ fetch('http://' + host + ':' + port + start).catch((error) => console.error('[eventcatalog] Could not start the server:', error.message));
1061
+ });
1062
+ }
1063
+ `;
1031
1064
  var startServerCatalog = async () => {
1032
1065
  const serverEntryPath = path2.join(dir, "dist", "server", "entry.mjs");
1066
+ const config = await getEventCatalogConfigFile(dir);
1067
+ const base = (config?.base || "/").replace(/\/$/, "");
1033
1068
  await runCommandWithFilteredOutput({
1034
1069
  command: process.execPath,
1035
- args: [serverEntryPath],
1070
+ args: ["--input-type=module", "-e", SERVER_BOOTSTRAP, pathToFileURL(serverEntryPath).href],
1036
1071
  cwd: dir,
1037
1072
  env: {
1038
1073
  PROJECT_DIR: dir,
1039
- CATALOG_DIR: core
1074
+ CATALOG_DIR: core,
1075
+ ASTRO_NODE_AUTOSTART: "disabled",
1076
+ EVENTCATALOG_START_PATH: `${base}/_eventcatalog/start`
1040
1077
  },
1041
1078
  shouldFilterLine: createAstroLineFilter()
1042
1079
  });
@@ -1057,7 +1094,8 @@ program.command("start").description("Serves the contents of your eventcatalog b
1057
1094
  }
1058
1095
  const isServerOutput = await isOutputServer();
1059
1096
  if (isServerOutput) {
1060
- await getLicenseStatus(dir);
1097
+ const license = await getLicenseStatus(dir);
1098
+ void log_build_default(dir, { command: "start", license });
1061
1099
  await startServerCatalog();
1062
1100
  } else {
1063
1101
  await previewCatalog({ command });
@@ -1204,7 +1242,7 @@ program.addHelpText(
1204
1242
  Example: npx eventcatalog dev --debug -- --env=production --port=3000
1205
1243
  `
1206
1244
  );
1207
- program.parseAsync().then(() => process.exit(0)).catch((err) => {
1245
+ program.parseAsync().then(() => process.exit()).catch((err) => {
1208
1246
  if (!(err instanceof FederationConflictError) && !(err instanceof FederationDiagnosticError)) console.error(err);
1209
1247
  process.exit(1);
1210
1248
  });
package/dist/features.cjs CHANGED
@@ -48,65 +48,58 @@ var import_promises = require("fs/promises");
48
48
  var import_node_fs = require("fs");
49
49
  var import_node_path = __toESM(require("path"), 1);
50
50
  var import_node_url = require("url");
51
- var import_node_os = require("os");
51
+ var import_node_module = require("module");
52
52
  async function cleanup(projectDirectory) {
53
53
  const filePath = import_node_path.default.join(projectDirectory, "eventcatalog.config.mjs");
54
54
  if ((0, import_node_fs.existsSync)(filePath)) {
55
55
  await (0, import_promises.rm)(filePath);
56
56
  }
57
57
  }
58
- var findNodeModulesDirectory = (directory) => {
59
- let currentDirectory = directory;
60
- while (true) {
61
- const nodeModulesDirectory = import_node_path.default.join(currentDirectory, "node_modules");
62
- if ((0, import_node_fs.existsSync)(nodeModulesDirectory)) {
63
- return nodeModulesDirectory;
64
- }
65
- const parentDirectory = import_node_path.default.dirname(currentDirectory);
66
- if (parentDirectory === currentDirectory) {
67
- return void 0;
68
- }
69
- currentDirectory = parentDirectory;
70
- }
58
+ var hidesConfigModuleTypeWarning = false;
59
+ var loads = 0;
60
+ var hideConfigModuleTypeWarning = () => {
61
+ if (hidesConfigModuleTypeWarning) return;
62
+ hidesConfigModuleTypeWarning = true;
63
+ const emitWarning = process.emitWarning;
64
+ process.emitWarning = function(warning, ...args) {
65
+ const code = typeof args[0] === "object" ? args[0]?.code : args[1];
66
+ const message = typeof warning === "string" ? warning : warning?.message;
67
+ if (code === "MODULE_TYPELESS_PACKAGE_JSON" && message?.includes("eventcatalog.config.js")) return;
68
+ return emitWarning.call(this, warning, ...args);
69
+ };
71
70
  };
72
- var linkNodeModulesIntoTempDirectory = async ({ projectDirectory, tempDir }) => {
73
- const nodeModulesDirectory = findNodeModulesDirectory(projectDirectory);
74
- if (!nodeModulesDirectory) {
75
- return;
76
- }
77
- await (0, import_promises.symlink)(nodeModulesDirectory, import_node_path.default.join(tempDir, "node_modules"), "dir");
71
+ var AS_MODULE_QUERY = "eventcatalog-config-as-module";
72
+ var loadsMarkedConfigsAsModules = false;
73
+ var loadMarkedConfigsAsModules = () => {
74
+ if (loadsMarkedConfigsAsModules) return;
75
+ loadsMarkedConfigsAsModules = true;
76
+ const hook = `export async function load(url, context, nextLoad) {
77
+ return nextLoad(url, url.includes('${AS_MODULE_QUERY}=') ? { ...context, format: 'module' } : context);
78
+ }`;
79
+ (0, import_node_module.register)(`data:text/javascript,${encodeURIComponent(hook)}`);
78
80
  };
79
- var createTemporaryConfigDirectory = async (projectDirectory) => {
80
- const nodeModulesDirectory = findNodeModulesDirectory(projectDirectory);
81
- if (nodeModulesDirectory) {
82
- return (0, import_promises.mkdtemp)(import_node_path.default.join(nodeModulesDirectory, ".eventcatalog-config-"));
81
+ var isCommonJSPackage = async (projectDirectory) => {
82
+ try {
83
+ const packageJson = JSON.parse(await (0, import_promises.readFile)(import_node_path.default.join(projectDirectory, "package.json"), "utf-8"));
84
+ return packageJson?.type === "commonjs";
85
+ } catch {
86
+ return false;
83
87
  }
84
- const tempDir = await (0, import_promises.mkdtemp)(import_node_path.default.join((0, import_node_os.tmpdir)(), "eventcatalog-config-"));
85
- await linkNodeModulesIntoTempDirectory({ projectDirectory, tempDir });
86
- return tempDir;
87
88
  };
88
89
  var getEventCatalogConfigFile = async (projectDirectory) => {
89
- let tempDir;
90
90
  try {
91
- let configFilePath = import_node_path.default.join(projectDirectory, "eventcatalog.config.js");
92
- const filePath = import_node_path.default.join(projectDirectory, "package.json");
93
- const packageJson = JSON.parse(await (0, import_promises.readFile)(filePath, "utf-8"));
94
- if (packageJson?.type !== "module") {
95
- tempDir = await createTemporaryConfigDirectory(projectDirectory);
96
- configFilePath = import_node_path.default.join(tempDir, "eventcatalog.config.mjs");
97
- await (0, import_promises.copyFile)(import_node_path.default.join(projectDirectory, "eventcatalog.config.js"), configFilePath);
98
- }
99
- const configFileURL = `${(0, import_node_url.pathToFileURL)(configFilePath).href}?t=${Date.now()}`;
91
+ hideConfigModuleTypeWarning();
92
+ const asModule = await isCommonJSPackage(projectDirectory);
93
+ if (asModule) loadMarkedConfigsAsModules();
94
+ const configFileURL = (0, import_node_url.pathToFileURL)(import_node_path.default.join(projectDirectory, "eventcatalog.config.js")).href;
95
+ const query = `${asModule ? AS_MODULE_QUERY : "loaded"}=${Date.now()}-${loads++}`;
100
96
  const config = await import(
101
97
  /* @vite-ignore */
102
- configFileURL
98
+ `${configFileURL}?${query}`
103
99
  );
104
100
  return config.default;
105
101
  } finally {
106
102
  await cleanup(projectDirectory);
107
- if (tempDir) {
108
- await (0, import_promises.rm)(tempDir, { recursive: true, force: true });
109
- }
110
103
  }
111
104
  };
112
105
 
package/dist/features.js CHANGED
@@ -3,8 +3,8 @@ import {
3
3
  isAuthEnabled,
4
4
  isIndexedSearchEnabled,
5
5
  isOutputServer
6
- } from "./chunk-MDWB5HLO.js";
7
- import "./chunk-RFIXKATC.js";
6
+ } from "./chunk-NKNOXQ62.js";
7
+ import "./chunk-4G7FSRPN.js";
8
8
  export {
9
9
  getProjectOutDir,
10
10
  isAuthEnabled,
@@ -51,65 +51,58 @@ var import_promises = require("fs/promises");
51
51
  var import_node_fs = require("fs");
52
52
  var import_node_path = __toESM(require("path"), 1);
53
53
  var import_node_url = require("url");
54
- var import_node_os = require("os");
54
+ var import_node_module = require("module");
55
55
  async function cleanup(projectDirectory) {
56
56
  const filePath = import_node_path.default.join(projectDirectory, "eventcatalog.config.mjs");
57
57
  if ((0, import_node_fs.existsSync)(filePath)) {
58
58
  await (0, import_promises.rm)(filePath);
59
59
  }
60
60
  }
61
- var findNodeModulesDirectory = (directory) => {
62
- let currentDirectory = directory;
63
- while (true) {
64
- const nodeModulesDirectory = import_node_path.default.join(currentDirectory, "node_modules");
65
- if ((0, import_node_fs.existsSync)(nodeModulesDirectory)) {
66
- return nodeModulesDirectory;
67
- }
68
- const parentDirectory = import_node_path.default.dirname(currentDirectory);
69
- if (parentDirectory === currentDirectory) {
70
- return void 0;
71
- }
72
- currentDirectory = parentDirectory;
73
- }
74
- };
75
- var linkNodeModulesIntoTempDirectory = async ({ projectDirectory, tempDir }) => {
76
- const nodeModulesDirectory = findNodeModulesDirectory(projectDirectory);
77
- if (!nodeModulesDirectory) {
78
- return;
79
- }
80
- await (0, import_promises.symlink)(nodeModulesDirectory, import_node_path.default.join(tempDir, "node_modules"), "dir");
61
+ var hidesConfigModuleTypeWarning = false;
62
+ var loads = 0;
63
+ var hideConfigModuleTypeWarning = () => {
64
+ if (hidesConfigModuleTypeWarning) return;
65
+ hidesConfigModuleTypeWarning = true;
66
+ const emitWarning = process.emitWarning;
67
+ process.emitWarning = function(warning, ...args) {
68
+ const code = typeof args[0] === "object" ? args[0]?.code : args[1];
69
+ const message = typeof warning === "string" ? warning : warning?.message;
70
+ if (code === "MODULE_TYPELESS_PACKAGE_JSON" && message?.includes("eventcatalog.config.js")) return;
71
+ return emitWarning.call(this, warning, ...args);
72
+ };
81
73
  };
82
- var createTemporaryConfigDirectory = async (projectDirectory) => {
83
- const nodeModulesDirectory = findNodeModulesDirectory(projectDirectory);
84
- if (nodeModulesDirectory) {
85
- return (0, import_promises.mkdtemp)(import_node_path.default.join(nodeModulesDirectory, ".eventcatalog-config-"));
74
+ var AS_MODULE_QUERY = "eventcatalog-config-as-module";
75
+ var loadsMarkedConfigsAsModules = false;
76
+ var loadMarkedConfigsAsModules = () => {
77
+ if (loadsMarkedConfigsAsModules) return;
78
+ loadsMarkedConfigsAsModules = true;
79
+ const hook = `export async function load(url, context, nextLoad) {
80
+ return nextLoad(url, url.includes('${AS_MODULE_QUERY}=') ? { ...context, format: 'module' } : context);
81
+ }`;
82
+ (0, import_node_module.register)(`data:text/javascript,${encodeURIComponent(hook)}`);
83
+ };
84
+ var isCommonJSPackage = async (projectDirectory) => {
85
+ try {
86
+ const packageJson = JSON.parse(await (0, import_promises.readFile)(import_node_path.default.join(projectDirectory, "package.json"), "utf-8"));
87
+ return packageJson?.type === "commonjs";
88
+ } catch {
89
+ return false;
86
90
  }
87
- const tempDir = await (0, import_promises.mkdtemp)(import_node_path.default.join((0, import_node_os.tmpdir)(), "eventcatalog-config-"));
88
- await linkNodeModulesIntoTempDirectory({ projectDirectory, tempDir });
89
- return tempDir;
90
91
  };
91
92
  var getEventCatalogConfigFile = async (projectDirectory) => {
92
- let tempDir;
93
93
  try {
94
- let configFilePath = import_node_path.default.join(projectDirectory, "eventcatalog.config.js");
95
- const filePath = import_node_path.default.join(projectDirectory, "package.json");
96
- const packageJson = JSON.parse(await (0, import_promises.readFile)(filePath, "utf-8"));
97
- if (packageJson?.type !== "module") {
98
- tempDir = await createTemporaryConfigDirectory(projectDirectory);
99
- configFilePath = import_node_path.default.join(tempDir, "eventcatalog.config.mjs");
100
- await (0, import_promises.copyFile)(import_node_path.default.join(projectDirectory, "eventcatalog.config.js"), configFilePath);
101
- }
102
- const configFileURL = `${(0, import_node_url.pathToFileURL)(configFilePath).href}?t=${Date.now()}`;
94
+ hideConfigModuleTypeWarning();
95
+ const asModule = await isCommonJSPackage(projectDirectory);
96
+ if (asModule) loadMarkedConfigsAsModules();
97
+ const configFileURL = (0, import_node_url.pathToFileURL)(import_node_path.default.join(projectDirectory, "eventcatalog.config.js")).href;
98
+ const query = `${asModule ? AS_MODULE_QUERY : "loaded"}=${Date.now()}-${loads++}`;
103
99
  const config = await import(
104
100
  /* @vite-ignore */
105
- configFileURL
101
+ `${configFileURL}?${query}`
106
102
  );
107
103
  return config.default;
108
104
  } finally {
109
105
  await cleanup(projectDirectory);
110
- if (tempDir) {
111
- await (0, import_promises.rm)(tempDir, { recursive: true, force: true });
112
- }
113
106
  }
114
107
  };
115
108
 
@@ -633,7 +626,7 @@ var createFileSystemSourceProvider = (projectDirectory) => ({
633
626
  // src/federation/github-source-provider.ts
634
627
  var import_node_child_process = require("child_process");
635
628
  var import_promises7 = __toESM(require("fs/promises"), 1);
636
- var import_node_os2 = __toESM(require("os"), 1);
629
+ var import_node_os = __toESM(require("os"), 1);
637
630
  var import_node_path7 = __toESM(require("path"), 1);
638
631
  var import_node_util = require("util");
639
632
  var import_sdk2 = __toESM(require("@eventcatalog/sdk"), 1);
@@ -690,7 +683,7 @@ var getGitEnvironment = (token) => {
690
683
  var createCheckout = (executeFile, token) => async (source, ref, callback) => {
691
684
  const { owner, repository } = parseGitHubSource(source);
692
685
  const catalogPath = import_node_path7.default.posix.normalize(source.path ?? ".");
693
- const directory = await import_promises7.default.mkdtemp(import_node_path7.default.join(import_node_os2.default.tmpdir(), "eventcatalog-federation-"));
686
+ const directory = await import_promises7.default.mkdtemp(import_node_path7.default.join(import_node_os.default.tmpdir(), "eventcatalog-federation-"));
694
687
  const env = getGitEnvironment(token);
695
688
  try {
696
689
  const git = (args) => executeFile("git", args, { cwd: directory, env, encoding: "utf8" });
@@ -2,7 +2,7 @@ import {
2
2
  FederationConflictError,
3
3
  FederationDiagnosticError,
4
4
  federateCatalog
5
- } from "../chunk-3PKS2IIP.js";
5
+ } from "../chunk-OX6TSVHY.js";
6
6
  import "../chunk-WRNH5C3U.js";
7
7
  import "../chunk-5EPNFDT5.js";
8
8
  import "../chunk-6K7XZAYI.js";
@@ -10,7 +10,7 @@ import "../chunk-352FGP6W.js";
10
10
  import "../chunk-R7Z5ALYI.js";
11
11
  import "../chunk-JJPB6EOZ.js";
12
12
  import "../chunk-SDZQJTJW.js";
13
- import "../chunk-RFIXKATC.js";
13
+ import "../chunk-4G7FSRPN.js";
14
14
  export {
15
15
  FederationConflictError,
16
16
  FederationDiagnosticError,