@eventcatalog/core 5.0.0-beta.2 → 5.0.0-beta.21

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 (209) 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 +71 -35
  8. package/dist/analytics/log-build.js +5 -4
  9. package/dist/analytics/telemetry.cjs +42 -0
  10. package/dist/analytics/telemetry.d.cts +20 -0
  11. package/dist/analytics/telemetry.d.ts +20 -0
  12. package/dist/analytics/telemetry.js +8 -0
  13. package/dist/catalog-runtime.cjs +1 -1
  14. package/dist/{chunk-TQLRG35T.js → chunk-AWOO63ME.js} +71 -45
  15. package/dist/chunk-CPW6G62V.js +17 -0
  16. package/dist/{chunk-KIDISU6X.js → chunk-I7F7CPDC.js} +56 -33
  17. package/dist/{chunk-HGRFXTFC.js → chunk-OVWDUANF.js} +1 -1
  18. package/dist/{chunk-62EV4IJA.js → chunk-RIRRWE7D.js} +1 -1
  19. package/dist/chunk-S5GWAUG5.js +29 -0
  20. package/dist/{chunk-4J2ZM2HX.js → chunk-W6KDW6ZC.js} +1 -1
  21. package/dist/{chunk-XARPIXWF.js → chunk-WHYRRLHE.js} +9 -3
  22. package/dist/constants.cjs +1 -1
  23. package/dist/constants.js +1 -1
  24. package/dist/eventcatalog.cjs +245 -131
  25. package/dist/eventcatalog.config.d.cts +59 -1
  26. package/dist/eventcatalog.config.d.ts +59 -1
  27. package/dist/eventcatalog.js +45 -15
  28. package/dist/federation/federate.js +2 -2
  29. package/dist/generate.cjs +1 -1
  30. package/dist/generate.js +3 -3
  31. package/dist/runtime-dependencies/@eventcatalog__visualiser__studio-fonts.css.mjs +3 -0
  32. package/dist/runtime-dependencies/@eventcatalog__visualiser__studio.css.mjs +3 -0
  33. package/dist/runtime-dependencies/@eventcatalog__visualiser__studio.mjs +3 -0
  34. package/dist/runtime-dependencies/@hocuspocus__provider.mjs +3 -0
  35. package/dist/runtime-dependencies/@hocuspocus__server.mjs +3 -0
  36. package/dist/runtime-dependencies/@mcp-b__webmcp-local-relay.mjs +3 -0
  37. package/dist/runtime-dependencies/@mcp-b__webmcp-polyfill.mjs +3 -0
  38. package/dist/runtime-dependencies/htmlparser2.mjs +3 -0
  39. package/dist/runtime-dependencies/manifest.json +13 -1
  40. package/dist/runtime-dependencies/react-hotkeys-hook.mjs +3 -0
  41. package/dist/runtime-dependencies/react-syntax-highlighter__dist__cjs__create-element.js.mjs +3 -0
  42. package/dist/runtime-dependencies/y-protocols.mjs +3 -0
  43. package/dist/runtime-dependencies/y-protocols__awareness.mjs +3 -0
  44. package/dist/runtime-dependencies/yjs.mjs +3 -0
  45. package/dist/utils/child-process-signals.cjs +53 -0
  46. package/dist/utils/child-process-signals.d.cts +19 -0
  47. package/dist/utils/child-process-signals.d.ts +19 -0
  48. package/dist/utils/child-process-signals.js +6 -0
  49. package/dist/utils/cli-logger.cjs +1 -1
  50. package/dist/utils/cli-logger.js +2 -2
  51. package/dist/utils/license-status.cjs +71 -45
  52. package/dist/utils/license-status.d.cts +14 -5
  53. package/dist/utils/license-status.d.ts +14 -5
  54. package/dist/utils/license-status.js +1 -1
  55. package/eventcatalog/astro.config.mjs +23 -1
  56. package/eventcatalog/integrations/skip-startup-reload.mjs +31 -0
  57. package/eventcatalog/integrations/stable-dependency-order.mjs +29 -0
  58. package/eventcatalog/integrations/storage.mjs +20 -0
  59. package/eventcatalog/integrations/studio-server.mjs +32 -0
  60. package/eventcatalog/src/components/CatalogGraph/CatalogForceGraph.tsx +39 -0
  61. package/eventcatalog/src/components/ChatPanel/ChatPanel.tsx +2 -0
  62. package/eventcatalog/src/components/Grids/utils.tsx +0 -23
  63. package/eventcatalog/src/components/Header.astro +3 -3
  64. package/eventcatalog/src/components/MDX/CodeGroup/CodeGroup.tsx +6 -1
  65. package/eventcatalog/src/components/MDX/NodeGraph/AstroNodeGraph.tsx +42 -3
  66. package/eventcatalog/src/components/MDX/NodeGraph/NodeGraph.astro +5 -1
  67. package/eventcatalog/src/components/NavigationProgress.astro +7 -0
  68. package/eventcatalog/src/components/SchemaExplorer/ApiContentViewer.tsx +2 -0
  69. package/eventcatalog/src/components/SchemaExplorer/ExamplesViewer.tsx +2 -0
  70. package/eventcatalog/src/components/SchemaExplorer/SchemaCodeModal.tsx +2 -0
  71. package/eventcatalog/src/components/SchemaExplorer/SchemaContentViewer.tsx +2 -0
  72. package/eventcatalog/src/components/SchemaExplorer/SchemaDetailsPanel.tsx +12 -4
  73. package/eventcatalog/src/components/Search/SearchDataLoader.astro +16 -28
  74. package/eventcatalog/src/components/Search/SearchModal.tsx +2 -10
  75. package/eventcatalog/src/components/Search/search-utils.ts +26 -0
  76. package/eventcatalog/src/components/Seo.astro +5 -1
  77. package/eventcatalog/src/components/SideNav/NestedSideBar/index.tsx +53 -83
  78. package/eventcatalog/src/components/SideNav/NestedSideBar/storage.ts +2 -0
  79. package/eventcatalog/src/components/SideNav/NestedSideBar/utils.ts +131 -0
  80. package/eventcatalog/src/components/SideNav/SideNav.astro +9 -1
  81. package/eventcatalog/src/components/Tables/Discover/DiscoverTable.tsx +4 -62
  82. package/eventcatalog/src/components/Tables/Discover/columns.tsx +17 -150
  83. package/eventcatalog/src/components/Tables/Resources/ResourcesTable.tsx +425 -0
  84. package/eventcatalog/src/components/Tables/RowActionsMenu.tsx +157 -0
  85. package/eventcatalog/src/components/Tables/TablePagination.tsx +82 -0
  86. package/eventcatalog/src/features/ai/chat-api.ts +3 -3
  87. package/eventcatalog/src/features/auth/error.astro +4 -2
  88. package/eventcatalog/src/features/auth/login.astro +2 -1
  89. package/eventcatalog/src/features/auth/middleware/middleware-auth.ts +10 -0
  90. package/eventcatalog/src/features/auth/unauthorized.astro +1 -1
  91. package/eventcatalog/src/features/fields/pages/fields.astro +1 -1
  92. package/eventcatalog/src/features/integrations/eventcatalog-features.ts +34 -1
  93. package/eventcatalog/src/features/mcp/apps/architecture-diagram/node-chat.tsx +6 -45
  94. package/eventcatalog/src/features/mcp/apps/canvas/shared.ts +47 -0
  95. package/eventcatalog/src/features/mcp/apps/canvas/styles.css +24 -0
  96. package/eventcatalog/src/features/mcp/apps/canvas/view.tsx +278 -0
  97. package/eventcatalog/src/features/mcp/apps/generated/canvas.html +272 -0
  98. package/eventcatalog/src/features/mcp/apps/generated/viewer.html +77 -76
  99. package/eventcatalog/src/features/mcp/apps/shared/app-view.tsx +2 -1
  100. package/eventcatalog/src/features/mcp/mcp-apps.ts +6 -3
  101. package/eventcatalog/src/features/mcp/mcp-server.ts +36 -5
  102. package/eventcatalog/src/features/server/start.ts +25 -0
  103. package/eventcatalog/src/features/storage/database.ts +88 -0
  104. package/eventcatalog/src/features/storage/migrations.ts +85 -0
  105. package/eventcatalog/src/features/storage/sql/database.sql +5 -0
  106. package/eventcatalog/src/features/storage/sql/migrations/0001-studio-canvases.sql +12 -0
  107. package/eventcatalog/src/features/storage/sql/migrations.sql +15 -0
  108. package/eventcatalog/src/features/storage/sql.ts +28 -0
  109. package/eventcatalog/src/features/studio/agent-choreography.ts +384 -0
  110. package/eventcatalog/src/features/studio/agents.ts +28 -0
  111. package/eventcatalog/src/features/studio/api/canvases-api.ts +219 -0
  112. package/eventcatalog/src/features/studio/api/canvases.ts +25 -0
  113. package/eventcatalog/src/features/studio/api/client.ts +40 -0
  114. package/eventcatalog/src/features/studio/canvas-actions.ts +540 -0
  115. package/eventcatalog/src/features/studio/canvas-preview.ts +52 -0
  116. package/eventcatalog/src/features/studio/catalog-resources.ts +155 -0
  117. package/eventcatalog/src/features/studio/catalog.ts +173 -0
  118. package/eventcatalog/src/features/studio/components/CanvasHeader.tsx +518 -0
  119. package/eventcatalog/src/features/studio/components/CanvasStatusMenu.tsx +118 -0
  120. package/eventcatalog/src/features/studio/components/ConnectAgentDialog.tsx +434 -0
  121. package/eventcatalog/src/features/studio/components/ConnectionsChooser.tsx +143 -0
  122. package/eventcatalog/src/features/studio/components/DeleteCanvasDialog.tsx +65 -0
  123. package/eventcatalog/src/features/studio/components/Dialog.tsx +60 -0
  124. package/eventcatalog/src/features/studio/components/JoinForm.tsx +109 -0
  125. package/eventcatalog/src/features/studio/components/LeftPanel.tsx +203 -0
  126. package/eventcatalog/src/features/studio/components/NodeDetails.tsx +183 -0
  127. package/eventcatalog/src/features/studio/components/OpenInStudioDialog.tsx +79 -0
  128. package/eventcatalog/src/features/studio/components/Presence.tsx +293 -0
  129. package/eventcatalog/src/features/studio/components/ShareDialog.tsx +396 -0
  130. package/eventcatalog/src/features/studio/components/ShortcutsDialog.tsx +41 -0
  131. package/eventcatalog/src/features/studio/components/StudioDesigner.tsx +2091 -0
  132. package/eventcatalog/src/features/studio/components/StudioNotice.astro +24 -0
  133. package/eventcatalog/src/features/studio/document-name.ts +7 -0
  134. package/eventcatalog/src/features/studio/from-visualiser.ts +138 -0
  135. package/eventcatalog/src/features/studio/hooks/presence-sender.ts +63 -0
  136. package/eventcatalog/src/features/studio/hooks/presence-store.ts +119 -0
  137. package/eventcatalog/src/features/studio/hooks/use-canvas-webmcp.ts +353 -0
  138. package/eventcatalog/src/features/studio/hooks/use-comments.ts +54 -0
  139. package/eventcatalog/src/features/studio/hooks/use-follow-camera.ts +109 -0
  140. package/eventcatalog/src/features/studio/hooks/use-studio-flow.ts +782 -0
  141. package/eventcatalog/src/features/studio/identity.ts +59 -0
  142. package/eventcatalog/src/features/studio/limits.ts +2 -0
  143. package/eventcatalog/src/features/studio/pages/[id].astro +69 -0
  144. package/eventcatalog/src/features/studio/pages/index.astro +784 -0
  145. package/eventcatalog/src/features/studio/pages/webmcp-relay.ts +27 -0
  146. package/eventcatalog/src/features/studio/server/canvas-mcp.ts +495 -0
  147. package/eventcatalog/src/features/studio/server/runtime.ts +498 -0
  148. package/eventcatalog/src/features/studio/server/sign-in.ts +18 -0
  149. package/eventcatalog/src/features/studio/server/sql/storage.sql +18 -0
  150. package/eventcatalog/src/features/studio/server/storage.ts +90 -0
  151. package/eventcatalog/src/features/studio/server/tool-icons.ts +30 -0
  152. package/eventcatalog/src/features/studio/tool-sync.ts +75 -0
  153. package/eventcatalog/src/layouts/BaseLayout.astro +4 -4
  154. package/eventcatalog/src/layouts/VerticalSideBarLayout.astro +13 -7
  155. package/eventcatalog/src/pages/_index.astro +1 -1
  156. package/eventcatalog/src/pages/architecture/[type]/[id]/[version]/_index.data.spec.ts +52 -63
  157. package/eventcatalog/src/pages/architecture/[type]/[id]/[version]/_index.data.ts +34 -46
  158. package/eventcatalog/src/pages/architecture/[type]/[id]/[version]/index.astro +11 -29
  159. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/resources/_ResourcesPage.astro +79 -0
  160. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/resources/_index.data.spec.ts +32 -14
  161. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/resources/_index.data.ts +63 -58
  162. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/resources/index.astro +2 -62
  163. package/eventcatalog/src/pages/docs/[type]/[id]/index.astro +1 -1
  164. package/eventcatalog/src/pages/docs/services/[id]/[version]/resources/index.astro +13 -0
  165. package/eventcatalog/src/pages/index.astro +1 -1
  166. package/eventcatalog/src/pages/schemas/explorer/index.astro +1 -1
  167. package/eventcatalog/src/pages/visualiser/[type]/[id]/index.astro +1 -1
  168. package/eventcatalog/src/stores/sidebar-store/builders/domain.ts +24 -42
  169. package/eventcatalog/src/stores/sidebar-store/builders/flow.ts +2 -0
  170. package/eventcatalog/src/stores/sidebar-store/builders/message.ts +2 -0
  171. package/eventcatalog/src/stores/sidebar-store/builders/service.ts +23 -23
  172. package/eventcatalog/src/stores/sidebar-store/builders/shared.ts +13 -0
  173. package/eventcatalog/src/stores/sidebar-store/builders/system.ts +18 -27
  174. package/eventcatalog/src/stores/sidebar-store/state.ts +5 -0
  175. package/eventcatalog/src/styles/tailwind.css +2 -2
  176. package/eventcatalog/src/types/react-syntax-highlighter.d.ts +10 -0
  177. package/eventcatalog/src/utils/collections/channels.ts +56 -1
  178. package/eventcatalog/src/utils/collections/flows.ts +50 -1
  179. package/eventcatalog/src/utils/collections/message-connections.ts +60 -0
  180. package/eventcatalog/src/utils/collections/message-triggers.ts +2 -1
  181. package/eventcatalog/src/utils/collections/resource-owners.ts +193 -0
  182. package/eventcatalog/src/utils/collections/resources.ts +310 -0
  183. package/eventcatalog/src/utils/collections/util.ts +31 -0
  184. package/eventcatalog/src/utils/feature.ts +8 -0
  185. package/eventcatalog/src/utils/git.ts +11 -5
  186. package/eventcatalog/src/utils/link-validation.ts +25 -19
  187. package/eventcatalog/src/utils/node-graphs/domain-entity-map.ts +3 -1
  188. package/eventcatalog/src/utils/node-graphs/domain-levels-node-graph.ts +3 -3
  189. package/eventcatalog/src/utils/node-graphs/export-mermaid.ts +0 -2
  190. package/eventcatalog/src/utils/node-graphs/layout-node-graph.ts +20 -1
  191. package/eventcatalog/src/utils/node-graphs/node-resource.ts +67 -0
  192. package/eventcatalog/src/utils/node-graphs/systems-node-graph.ts +1 -1
  193. package/eventcatalog/src/utils/page-title.ts +15 -0
  194. package/eventcatalog/src/utils/syntax-highlighter-renderer.ts +64 -0
  195. package/eventcatalog/src/utils/trial.ts +1 -1
  196. package/package.json +22 -16
  197. package/dist/runtime-dependencies/shelljs.mjs +0 -3
  198. package/eventcatalog/public/studio-bg.png +0 -0
  199. package/eventcatalog/src/components/Grids/DomainGrid.tsx +0 -838
  200. package/eventcatalog/src/components/Grids/MessageGrid.tsx +0 -344
  201. package/eventcatalog/src/components/Grids/SystemGrid.tsx +0 -185
  202. package/eventcatalog/src/components/Grids/components.tsx +0 -170
  203. package/eventcatalog/src/components/Grids/message-link.ts +0 -38
  204. package/eventcatalog/src/components/Studio/StudioPageModal.tsx +0 -150
  205. package/eventcatalog/src/components/Tables/SystemResources/SystemResourcesTable.tsx +0 -294
  206. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/resources/_resources.spec.ts +0 -65
  207. package/eventcatalog/src/pages/docs/[type]/[id]/[version]/resources/_resources.ts +0 -46
  208. package/eventcatalog/src/pages/studio.astro +0 -316
  209. package/dist/{chunk-AYNZXUB5.js → chunk-KHACCTW2.js} +3 -3
@@ -176,13 +176,27 @@ var verifyRequiredFieldsAreInCatalogConfigFile = async (projectDirectory) => {
176
176
  var import_os = __toESM(require("os"), 1);
177
177
 
178
178
  // package.json
179
- var version = "5.0.0-beta.2";
179
+ var version = "5.0.0-beta.21";
180
180
 
181
181
  // src/constants.ts
182
182
  var VERSION = version;
183
183
 
184
+ // src/analytics/telemetry.ts
185
+ var TELEMETRY_REQUEST_TIMEOUT_MS = 2e3;
186
+ var isOptOutEnvValue = (value) => {
187
+ if (typeof value !== "string") return false;
188
+ const normalized = value.trim().toLowerCase();
189
+ return normalized === "1" || normalized === "true";
190
+ };
191
+ var isTelemetryDisabled = (config, env) => {
192
+ if (isOptOutEnvValue(env.EVENTCATALOG_TELEMETRY_DISABLED)) return true;
193
+ if (isOptOutEnvValue(env.DO_NOT_TRACK)) return true;
194
+ return config?.telemetry === false;
195
+ };
196
+
184
197
  // src/analytics/analytics.js
185
- async function raiseEvent(eventData) {
198
+ async function raiseEvent(eventData, config) {
199
+ if (isTelemetryDisabled(config, process.env)) return;
186
200
  if (typeof eventData?.command !== "string" || typeof eventData?.cId !== "string") return;
187
201
  const url = "https://queue.simpleanalyticscdn.com/events";
188
202
  const userAgent = `@eventcatalog/eventcatalog@${VERSION} (${import_os.default.platform()}; ${import_os.default.arch()}; Node/${process.version})`;
@@ -204,7 +218,8 @@ async function raiseEvent(eventData) {
204
218
  const response = await fetch(url, {
205
219
  method: "POST",
206
220
  headers,
207
- body: JSON.stringify(payload)
221
+ body: JSON.stringify(payload),
222
+ signal: AbortSignal.timeout(TELEMETRY_REQUEST_TIMEOUT_MS)
208
223
  });
209
224
  if (!response.ok) {
210
225
  throw new Error(`Failed to raise analytics event: ${response.status}`);
@@ -281,10 +296,11 @@ function serializeCounts(counts) {
281
296
 
282
297
  // src/utils/license-status.ts
283
298
  var import_boxen = __toESM(require("boxen"), 1);
299
+ var import_picocolors = __toESM(require("picocolors"), 1);
284
300
  var import_license2 = require("@eventcatalog/license");
285
301
 
286
302
  // eventcatalog/src/utils/trial.ts
287
- var TRIAL_LENGTH_DAYS = 90;
303
+ var TRIAL_LENGTH_DAYS = 60;
288
304
  var DAY_IN_MS = 24 * 60 * 60 * 1e3;
289
305
  var getTrialStatus = (tsd, now = Date.now()) => {
290
306
  if (typeof tsd !== "number" || !Number.isFinite(tsd) || tsd <= 0) return;
@@ -311,6 +327,7 @@ var getLicenseAnalytics = (license = { state: "none" }, tsd) => ({
311
327
  licenseExpiry: "expiresAt" in license ? license.expiresAt?.getTime() : void 0,
312
328
  trialExpiry: getTrialStatus(tsd)?.endsAt.getTime()
313
329
  });
330
+ var COLOURS = { bold: import_picocolors.default.bold, dim: import_picocolors.default.dim, link: (text) => import_picocolors.default.cyan(text) };
314
331
 
315
332
  // src/analytics/log-build.js
316
333
  var isMCPEnabled = (configFile) => configFile.output === "server" && (configFile.mcp?.enabled ?? true);
@@ -367,50 +384,69 @@ var toCloudResourceCounts = (counts) => ({
367
384
  customPages: counts.customPages || 0,
368
385
  customApis: counts.customApis || 0
369
386
  });
370
- var reportCloudResourceInventory = async (configFile, resourceCounts) => {
387
+ var getEnabledCloudAnalytics = (configFile) => {
371
388
  const analytics = configFile.cloud?.analytics;
372
- if (!analytics?.enabled || !analytics.trackingId || !analytics.writeKey) return;
389
+ if (!analytics?.enabled || !analytics.trackingId || !analytics.writeKey) return null;
390
+ return analytics;
391
+ };
392
+ var reportCloudResourceInventory = async (configFile, resourceCounts) => {
393
+ const analytics = getEnabledCloudAnalytics(configFile);
394
+ if (!analytics) return;
373
395
  const endpoint = analytics.endpoint || CLOUD_ANALYTICS_ENDPOINT;
374
- await fetch(endpoint, {
375
- method: "POST",
376
- headers: {
377
- "Content-Type": "application/json",
378
- "X-EventCatalog-Analytics-Key": analytics.writeKey
379
- },
380
- body: JSON.stringify({
381
- trackingId: analytics.trackingId,
382
- event: "catalog.resource_inventory_reported",
383
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
384
- counts: toCloudResourceCounts(resourceCounts)
385
- })
386
- });
396
+ try {
397
+ await fetch(endpoint, {
398
+ method: "POST",
399
+ headers: {
400
+ "Content-Type": "application/json",
401
+ "X-EventCatalog-Analytics-Key": analytics.writeKey
402
+ },
403
+ body: JSON.stringify({
404
+ trackingId: analytics.trackingId,
405
+ event: "catalog.resource_inventory_reported",
406
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
407
+ counts: toCloudResourceCounts(resourceCounts)
408
+ }),
409
+ signal: AbortSignal.timeout(TELEMETRY_REQUEST_TIMEOUT_MS)
410
+ });
411
+ } catch {
412
+ }
387
413
  };
388
414
  var main = async (projectDir, { command = "build", license } = {}) => {
389
415
  try {
390
416
  await verifyRequiredFieldsAreInCatalogConfigFile(projectDir);
391
417
  const configFile = await getEventCatalogConfigFile(projectDir);
418
+ if (isTelemetryDisabled(configFile, process.env)) {
419
+ if (getEnabledCloudAnalytics(configFile)) {
420
+ const resourceCounts2 = await countResources(projectDir);
421
+ await reportCloudResourceInventory(configFile, resourceCounts2);
422
+ }
423
+ return;
424
+ }
392
425
  const { cId, tsd, organizationName, generators = [] } = configFile;
393
426
  const generatorNames = generators.length > 0 ? generators.map((generator) => generator[0]) : ["none"];
394
427
  const features = await getFeatures(configFile);
395
428
  const resourceCounts = await countResources(projectDir);
396
429
  const contentHash = await hashCatalogContent(projectDir);
397
430
  await reportCloudResourceInventory(configFile, resourceCounts);
398
- await raiseEvent({
399
- command,
400
- org: organizationName,
401
- cId,
402
- // Trial start date (unix ms) from eventcatalog.config.js
403
- tsd,
404
- // Commercial license or trial, and when each expires (unix ms)
405
- ...getLicenseAnalytics(license, tsd),
406
- // CI redeploys and human-run builds are different signals; tag rather than suppress
407
- ci: process.env.CI ? "true" : "false",
408
- contentHash,
409
- generators: generatorNames.toString(),
410
- features: Object.keys(features).map((feature) => `${feature}:${features[feature]}`).join(","),
411
- directorySources: serializeDirectorySources(configFile),
412
- resources: serializeCounts(resourceCounts)
413
- });
431
+ await raiseEvent(
432
+ {
433
+ command,
434
+ org: organizationName,
435
+ cId,
436
+ // Trial start date (unix ms) from eventcatalog.config.js
437
+ tsd,
438
+ // Commercial license or trial, and when each expires (unix ms)
439
+ ...getLicenseAnalytics(license, tsd),
440
+ // CI redeploys and human-run builds are different signals; tag rather than suppress
441
+ ci: process.env.CI ? "true" : "false",
442
+ contentHash,
443
+ generators: generatorNames.toString(),
444
+ features: Object.keys(features).map((feature) => `${feature}:${features[feature]}`).join(","),
445
+ directorySources: serializeDirectorySources(configFile),
446
+ resources: serializeCounts(resourceCounts)
447
+ },
448
+ configFile
449
+ );
414
450
  } catch (error) {
415
451
  }
416
452
  };
@@ -1,10 +1,11 @@
1
1
  import {
2
2
  log_build_default
3
- } from "../chunk-KIDISU6X.js";
4
- import "../chunk-TQLRG35T.js";
3
+ } from "../chunk-I7F7CPDC.js";
4
+ import "../chunk-AWOO63ME.js";
5
5
  import "../chunk-ZAZHAVKB.js";
6
- import "../chunk-XARPIXWF.js";
7
- import "../chunk-62EV4IJA.js";
6
+ import "../chunk-WHYRRLHE.js";
7
+ import "../chunk-CPW6G62V.js";
8
+ import "../chunk-RIRRWE7D.js";
8
9
  import "../chunk-RFIXKATC.js";
9
10
  export {
10
11
  log_build_default as default
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/analytics/telemetry.ts
21
+ var telemetry_exports = {};
22
+ __export(telemetry_exports, {
23
+ TELEMETRY_REQUEST_TIMEOUT_MS: () => TELEMETRY_REQUEST_TIMEOUT_MS,
24
+ isTelemetryDisabled: () => isTelemetryDisabled
25
+ });
26
+ module.exports = __toCommonJS(telemetry_exports);
27
+ var TELEMETRY_REQUEST_TIMEOUT_MS = 2e3;
28
+ var isOptOutEnvValue = (value) => {
29
+ if (typeof value !== "string") return false;
30
+ const normalized = value.trim().toLowerCase();
31
+ return normalized === "1" || normalized === "true";
32
+ };
33
+ var isTelemetryDisabled = (config, env) => {
34
+ if (isOptOutEnvValue(env.EVENTCATALOG_TELEMETRY_DISABLED)) return true;
35
+ if (isOptOutEnvValue(env.DO_NOT_TRACK)) return true;
36
+ return config?.telemetry === false;
37
+ };
38
+ // Annotate the CommonJS export names for ESM import in node:
39
+ 0 && (module.exports = {
40
+ TELEMETRY_REQUEST_TIMEOUT_MS,
41
+ isTelemetryDisabled
42
+ });
@@ -0,0 +1,20 @@
1
+ /** How long a telemetry request may take before it is aborted. */
2
+ declare const TELEMETRY_REQUEST_TIMEOUT_MS = 2000;
3
+ type TelemetryConfig = {
4
+ telemetry?: boolean;
5
+ };
6
+ type TelemetryEnv = {
7
+ EVENTCATALOG_TELEMETRY_DISABLED?: string;
8
+ DO_NOT_TRACK?: string;
9
+ };
10
+ /**
11
+ * Anonymous telemetry is on unless the catalog opts out.
12
+ * Opt out with EVENTCATALOG_TELEMETRY_DISABLED or DO_NOT_TRACK set to "1" or "true"
13
+ * (any case), or with telemetry: false in eventcatalog.config.js.
14
+ *
15
+ * packages/create-eventcatalog/templates/telemetry.ts copies the env rules and
16
+ * TELEMETRY_REQUEST_TIMEOUT_MS. Keep that copy in sync.
17
+ */
18
+ declare const isTelemetryDisabled: (config: TelemetryConfig | null | undefined, env: TelemetryEnv) => boolean;
19
+
20
+ export { TELEMETRY_REQUEST_TIMEOUT_MS, isTelemetryDisabled };
@@ -0,0 +1,20 @@
1
+ /** How long a telemetry request may take before it is aborted. */
2
+ declare const TELEMETRY_REQUEST_TIMEOUT_MS = 2000;
3
+ type TelemetryConfig = {
4
+ telemetry?: boolean;
5
+ };
6
+ type TelemetryEnv = {
7
+ EVENTCATALOG_TELEMETRY_DISABLED?: string;
8
+ DO_NOT_TRACK?: string;
9
+ };
10
+ /**
11
+ * Anonymous telemetry is on unless the catalog opts out.
12
+ * Opt out with EVENTCATALOG_TELEMETRY_DISABLED or DO_NOT_TRACK set to "1" or "true"
13
+ * (any case), or with telemetry: false in eventcatalog.config.js.
14
+ *
15
+ * packages/create-eventcatalog/templates/telemetry.ts copies the env rules and
16
+ * TELEMETRY_REQUEST_TIMEOUT_MS. Keep that copy in sync.
17
+ */
18
+ declare const isTelemetryDisabled: (config: TelemetryConfig | null | undefined, env: TelemetryEnv) => boolean;
19
+
20
+ export { TELEMETRY_REQUEST_TIMEOUT_MS, isTelemetryDisabled };
@@ -0,0 +1,8 @@
1
+ import {
2
+ TELEMETRY_REQUEST_TIMEOUT_MS,
3
+ isTelemetryDisabled
4
+ } from "../chunk-CPW6G62V.js";
5
+ export {
6
+ TELEMETRY_REQUEST_TIMEOUT_MS,
7
+ isTelemetryDisabled
8
+ };
@@ -36,7 +36,7 @@ __export(catalog_runtime_exports, {
36
36
  });
37
37
  module.exports = __toCommonJS(catalog_runtime_exports);
38
38
 
39
- // ../../node_modules/.pnpm/tsup@8.5.0_jiti@2.7.0_postcss@8.5.15_tsx@4.21.0_typescript@5.9.3_yaml@2.9.0/node_modules/tsup/assets/cjs_shims.js
39
+ // ../../node_modules/.pnpm/tsup@8.5.0_jiti@2.7.0_postcss@8.5.29_tsx@4.23.15_typescript@5.9.3_yaml@2.9.1/node_modules/tsup/assets/cjs_shims.js
40
40
  var getImportMetaUrl = () => typeof document === "undefined" ? new URL(`file:${__filename}`).href : document.currentScript && document.currentScript.src || new URL("main.js", document.baseURI).href;
41
41
  var importMetaUrl = /* @__PURE__ */ getImportMetaUrl();
42
42
 
@@ -1,9 +1,10 @@
1
1
  // src/utils/license-status.ts
2
2
  import boxen from "boxen";
3
+ import pc from "picocolors";
3
4
  import { isEventCatalogScaleEnabled, isEventCatalogStarterEnabled } from "@eventcatalog/license";
4
5
 
5
6
  // eventcatalog/src/utils/trial.ts
6
- var TRIAL_LENGTH_DAYS = 90;
7
+ var TRIAL_LENGTH_DAYS = 60;
7
8
  var LICENSE_FAQ_URL = "https://www.eventcatalog.dev/license-faq";
8
9
  var LICENSE_RENEW_URL = "https://eventcatalog.cloud";
9
10
  var DAY_IN_MS = 24 * 60 * 60 * 1e3;
@@ -122,75 +123,100 @@ var getLicenseAnalytics = (license = { state: "none" }, tsd) => ({
122
123
  });
123
124
  var formatDate = (date) => date.toLocaleDateString(void 0, { dateStyle: "medium" });
124
125
  var formatDays = (days) => `${days} ${days === 1 ? "day" : "days"}`;
125
- var getTrialLine = (tsd, now) => {
126
+ var PLAIN = { bold: (text) => text, dim: (text) => text, link: (text) => text };
127
+ var COLOURS = { bold: pc.bold, dim: pc.dim, link: (text) => pc.cyan(text) };
128
+ var render = ({ headline, rows, links }, colours) => {
129
+ const width = Math.max(0, ...[...rows, ...links].map(([label]) => label.length));
130
+ const row = ([label, value]) => `${colours.dim(label.padEnd(width))} ${value}`;
131
+ return [
132
+ colours.bold(headline),
133
+ ...rows.length ? ["", ...rows.map(row)] : [],
134
+ ...links.length ? ["", ...links.map(([label, url]) => row([label, colours.link(url)]))] : []
135
+ ].join("\n");
136
+ };
137
+ var message = (content) => ({
138
+ ...content,
139
+ text: render(content, PLAIN)
140
+ });
141
+ var getTrialRow = (tsd, now) => {
126
142
  const trial = getTrialStatus(tsd, now);
127
143
  if (!trial) return;
128
- return trial.ended ? `Your ${TRIAL_LENGTH_DAYS}-day EventCatalog trial ended on ${formatDate(trial.endsAt)}.` : `${formatDays(trial.daysLeft)} left of your ${TRIAL_LENGTH_DAYS}-day EventCatalog trial (ends ${formatDate(trial.endsAt)}).`;
144
+ return [
145
+ "Trial",
146
+ trial.ended ? `Ended ${formatDate(trial.endsAt)}` : `${formatDays(trial.daysLeft)} left of ${TRIAL_LENGTH_DAYS} (ends ${formatDate(trial.endsAt)})`
147
+ ];
129
148
  };
130
149
  var getLicenseStatusMessage = (license, tsd, now = Date.now()) => {
150
+ const licensing = ["Licensing", LICENSE_FAQ_URL];
151
+ const renew = ["Renew", LICENSE_RENEW_URL];
152
+ const licensedTo = "org" in license && license.org ? [["Licensed to", license.org]] : [];
131
153
  if (license.state === "licensed") {
132
154
  const daysLeft = Math.max(0, Math.ceil((license.expiresAt.getTime() - now) / DAY_IN_MS2));
133
- const licensedTo = license.org ? `Licensed to ${license.org}` : "Licensed";
134
155
  if (daysLeft < LICENSE_REMINDER_DAYS) {
135
- return {
136
- title: "EventCatalog Commercial License",
156
+ return message({
157
+ title: "EventCatalog license",
137
158
  color: "yellow",
138
- text: [
139
- licensedTo,
140
- `Your license expires in ${formatDays(daysLeft)}, on ${formatDate(license.expiresAt)}.`,
141
- `Renew it to keep using EventCatalog commercially: ${LICENSE_RENEW_URL}`
142
- ].join("\n")
143
- };
159
+ headline: `Your commercial license expires in ${formatDays(daysLeft)}`,
160
+ rows: [...licensedTo, ["Expires", formatDate(license.expiresAt)]],
161
+ links: [renew]
162
+ });
144
163
  }
145
- return {
146
- title: "EventCatalog Commercial License",
164
+ return message({
165
+ title: "EventCatalog license",
147
166
  color: "green",
148
- text: `${licensedTo}
149
- Valid until ${formatDate(license.expiresAt)} (${formatDays(daysLeft)} left)`
150
- };
167
+ headline: "Commercial license active",
168
+ rows: [...licensedTo, ["Valid until", `${formatDate(license.expiresAt)} (${formatDays(daysLeft)} left)`]],
169
+ links: []
170
+ });
151
171
  }
152
172
  if (license.state === "plan") return;
153
- const trialLine = getTrialLine(tsd, now);
173
+ const trialRow = getTrialRow(tsd, now);
174
+ const trialRows = trialRow ? [trialRow] : [];
154
175
  if (license.state === "none") {
155
- if (!trialLine) return;
156
- const ended = getTrialStatus(tsd, now)?.ended;
157
- return {
176
+ const trial = getTrialStatus(tsd, now);
177
+ if (!trial || !trialRow) return;
178
+ return message({
158
179
  title: "EventCatalog trial",
159
- color: ended ? "yellow" : "green",
160
- text: `${trialLine}
161
- Learn about licensing: ${LICENSE_FAQ_URL}`
162
- };
180
+ color: trial.ended ? "yellow" : "green",
181
+ headline: trial.ended ? "Your EventCatalog trial has ended" : `You're on the ${TRIAL_LENGTH_DAYS}-day EventCatalog trial`,
182
+ rows: trialRows,
183
+ links: trial.ended ? [["Get a license", LICENSE_RENEW_URL], licensing] : [licensing]
184
+ });
163
185
  }
164
186
  if (license.state === "expired") {
165
- const expiredOn = license.expiresAt ? `expired on ${formatDate(license.expiresAt)} (${formatDays(Math.floor((now - license.expiresAt.getTime()) / DAY_IN_MS2))} ago)` : "has expired";
166
- return {
167
- title: "EventCatalog License Expired",
187
+ const expiredOn = license.expiresAt ? [
188
+ [
189
+ "Expired",
190
+ `${formatDate(license.expiresAt)} (${formatDays(Math.floor((now - license.expiresAt.getTime()) / DAY_IN_MS2))} ago)`
191
+ ]
192
+ ] : [];
193
+ return message({
194
+ title: "EventCatalog license",
168
195
  color: "yellow",
169
- text: [
170
- `Your EventCatalog commercial license${license.org ? ` for ${license.org}` : ""} ${expiredOn}.`,
171
- `Renew it to keep using EventCatalog commercially: ${LICENSE_RENEW_URL}`,
172
- trialLine,
173
- `Learn about licensing: ${LICENSE_FAQ_URL}`
174
- ].filter(Boolean).join("\n")
175
- };
196
+ headline: "Your commercial license has expired",
197
+ rows: [...licensedTo, ...expiredOn, ...trialRows],
198
+ links: [renew, licensing]
199
+ });
176
200
  }
177
- return {
201
+ return message({
178
202
  title: "EventCatalog license",
179
203
  color: "yellow",
180
- text: [`Your license.jwt could not be verified: ${license.reason}.`, trialLine, `Learn about licensing: ${LICENSE_FAQ_URL}`].filter(Boolean).join("\n")
181
- };
204
+ headline: "Your license.jwt couldn't be verified",
205
+ rows: [["Reason", license.reason.charAt(0).toUpperCase() + license.reason.slice(1)], ...trialRows],
206
+ links: [licensing]
207
+ });
182
208
  };
183
209
  var printLicenseStatus = (license, tsd) => {
184
- const message = getLicenseStatusMessage(license, tsd);
185
- if (!message) return;
210
+ const status = getLicenseStatusMessage(license, tsd);
211
+ if (!status) return;
186
212
  console.log(
187
- boxen(message.text, {
188
- padding: 1,
213
+ boxen(render(status, COLOURS), {
214
+ padding: { top: 1, bottom: 1, left: 2, right: 2 },
189
215
  margin: 1,
190
216
  borderStyle: "round",
191
- borderColor: message.color,
192
- title: message.title,
193
- titleAlignment: "center"
217
+ borderColor: status.color,
218
+ title: status.title,
219
+ titleAlignment: "left"
194
220
  })
195
221
  );
196
222
  };
@@ -0,0 +1,17 @@
1
+ // src/analytics/telemetry.ts
2
+ var TELEMETRY_REQUEST_TIMEOUT_MS = 2e3;
3
+ var isOptOutEnvValue = (value) => {
4
+ if (typeof value !== "string") return false;
5
+ const normalized = value.trim().toLowerCase();
6
+ return normalized === "1" || normalized === "true";
7
+ };
8
+ var isTelemetryDisabled = (config, env) => {
9
+ if (isOptOutEnvValue(env.EVENTCATALOG_TELEMETRY_DISABLED)) return true;
10
+ if (isOptOutEnvValue(env.DO_NOT_TRACK)) return true;
11
+ return config?.telemetry === false;
12
+ };
13
+
14
+ export {
15
+ TELEMETRY_REQUEST_TIMEOUT_MS,
16
+ isTelemetryDisabled
17
+ };
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getLicenseAnalytics
3
- } from "./chunk-TQLRG35T.js";
3
+ } from "./chunk-AWOO63ME.js";
4
4
  import {
5
5
  countResources,
6
6
  hashCatalogContent,
@@ -8,7 +8,11 @@ import {
8
8
  } from "./chunk-ZAZHAVKB.js";
9
9
  import {
10
10
  raiseEvent
11
- } from "./chunk-XARPIXWF.js";
11
+ } from "./chunk-WHYRRLHE.js";
12
+ import {
13
+ TELEMETRY_REQUEST_TIMEOUT_MS,
14
+ isTelemetryDisabled
15
+ } from "./chunk-CPW6G62V.js";
12
16
  import {
13
17
  getEventCatalogConfigFile,
14
18
  verifyRequiredFieldsAreInCatalogConfigFile
@@ -69,50 +73,69 @@ var toCloudResourceCounts = (counts) => ({
69
73
  customPages: counts.customPages || 0,
70
74
  customApis: counts.customApis || 0
71
75
  });
72
- var reportCloudResourceInventory = async (configFile, resourceCounts) => {
76
+ var getEnabledCloudAnalytics = (configFile) => {
73
77
  const analytics = configFile.cloud?.analytics;
74
- if (!analytics?.enabled || !analytics.trackingId || !analytics.writeKey) return;
78
+ if (!analytics?.enabled || !analytics.trackingId || !analytics.writeKey) return null;
79
+ return analytics;
80
+ };
81
+ var reportCloudResourceInventory = async (configFile, resourceCounts) => {
82
+ const analytics = getEnabledCloudAnalytics(configFile);
83
+ if (!analytics) return;
75
84
  const endpoint = analytics.endpoint || CLOUD_ANALYTICS_ENDPOINT;
76
- await fetch(endpoint, {
77
- method: "POST",
78
- headers: {
79
- "Content-Type": "application/json",
80
- "X-EventCatalog-Analytics-Key": analytics.writeKey
81
- },
82
- body: JSON.stringify({
83
- trackingId: analytics.trackingId,
84
- event: "catalog.resource_inventory_reported",
85
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
86
- counts: toCloudResourceCounts(resourceCounts)
87
- })
88
- });
85
+ try {
86
+ await fetch(endpoint, {
87
+ method: "POST",
88
+ headers: {
89
+ "Content-Type": "application/json",
90
+ "X-EventCatalog-Analytics-Key": analytics.writeKey
91
+ },
92
+ body: JSON.stringify({
93
+ trackingId: analytics.trackingId,
94
+ event: "catalog.resource_inventory_reported",
95
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
96
+ counts: toCloudResourceCounts(resourceCounts)
97
+ }),
98
+ signal: AbortSignal.timeout(TELEMETRY_REQUEST_TIMEOUT_MS)
99
+ });
100
+ } catch {
101
+ }
89
102
  };
90
103
  var main = async (projectDir, { command = "build", license } = {}) => {
91
104
  try {
92
105
  await verifyRequiredFieldsAreInCatalogConfigFile(projectDir);
93
106
  const configFile = await getEventCatalogConfigFile(projectDir);
107
+ if (isTelemetryDisabled(configFile, process.env)) {
108
+ if (getEnabledCloudAnalytics(configFile)) {
109
+ const resourceCounts2 = await countResources(projectDir);
110
+ await reportCloudResourceInventory(configFile, resourceCounts2);
111
+ }
112
+ return;
113
+ }
94
114
  const { cId, tsd, organizationName, generators = [] } = configFile;
95
115
  const generatorNames = generators.length > 0 ? generators.map((generator) => generator[0]) : ["none"];
96
116
  const features = await getFeatures(configFile);
97
117
  const resourceCounts = await countResources(projectDir);
98
118
  const contentHash = await hashCatalogContent(projectDir);
99
119
  await reportCloudResourceInventory(configFile, resourceCounts);
100
- await raiseEvent({
101
- command,
102
- org: organizationName,
103
- cId,
104
- // Trial start date (unix ms) from eventcatalog.config.js
105
- tsd,
106
- // Commercial license or trial, and when each expires (unix ms)
107
- ...getLicenseAnalytics(license, tsd),
108
- // CI redeploys and human-run builds are different signals; tag rather than suppress
109
- ci: process.env.CI ? "true" : "false",
110
- contentHash,
111
- generators: generatorNames.toString(),
112
- features: Object.keys(features).map((feature) => `${feature}:${features[feature]}`).join(","),
113
- directorySources: serializeDirectorySources(configFile),
114
- resources: serializeCounts(resourceCounts)
115
- });
120
+ await raiseEvent(
121
+ {
122
+ command,
123
+ org: organizationName,
124
+ cId,
125
+ // Trial start date (unix ms) from eventcatalog.config.js
126
+ tsd,
127
+ // Commercial license or trial, and when each expires (unix ms)
128
+ ...getLicenseAnalytics(license, tsd),
129
+ // CI redeploys and human-run builds are different signals; tag rather than suppress
130
+ ci: process.env.CI ? "true" : "false",
131
+ contentHash,
132
+ generators: generatorNames.toString(),
133
+ features: Object.keys(features).map((feature) => `${feature}:${features[feature]}`).join(","),
134
+ directorySources: serializeDirectorySources(configFile),
135
+ resources: serializeCounts(resourceCounts)
136
+ },
137
+ configFile
138
+ );
116
139
  } catch (error) {
117
140
  }
118
141
  };
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  logger
3
- } from "./chunk-4J2ZM2HX.js";
3
+ } from "./chunk-W6KDW6ZC.js";
4
4
  import {
5
5
  cleanup,
6
6
  getEventCatalogConfigFile
@@ -1,5 +1,5 @@
1
1
  // package.json
2
- var version = "5.0.0-beta.2";
2
+ var version = "5.0.0-beta.21";
3
3
 
4
4
  // src/constants.ts
5
5
  var VERSION = version;
@@ -0,0 +1,29 @@
1
+ // src/utils/child-process-signals.ts
2
+ import { constants } from "os";
3
+ var FORWARDED_SIGNALS = ["SIGINT", "SIGTERM", "SIGHUP"];
4
+ var isRunning = (child) => child.exitCode === null && child.signalCode === null;
5
+ var stopChildWithParent = (child, parent = process) => {
6
+ let received;
7
+ const onSignal = (signal) => {
8
+ received = signal;
9
+ if (isRunning(child)) child.kill(signal);
10
+ };
11
+ const onExit = () => {
12
+ if (isRunning(child)) child.kill("SIGTERM");
13
+ };
14
+ for (const signal of FORWARDED_SIGNALS) parent.on(signal, onSignal);
15
+ parent.on("exit", onExit);
16
+ return {
17
+ childClosed: () => {
18
+ for (const signal of FORWARDED_SIGNALS) parent.off(signal, onSignal);
19
+ parent.off("exit", onExit);
20
+ if (!received) return false;
21
+ parent.exit(128 + constants.signals[received]);
22
+ return true;
23
+ }
24
+ };
25
+ };
26
+
27
+ export {
28
+ stopChildWithParent
29
+ };
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  VERSION
3
- } from "./chunk-62EV4IJA.js";
3
+ } from "./chunk-RIRRWE7D.js";
4
4
 
5
5
  // src/utils/cli-logger.ts
6
6
  import pc from "picocolors";