@eventcatalog/core 5.0.0-beta.9 → 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.
- package/LICENSE +13 -12
- package/README.md +5 -5
- package/dist/analytics/analytics.cjs +1 -1
- package/dist/analytics/analytics.js +2 -2
- package/dist/analytics/log-build.cjs +91 -44
- package/dist/analytics/log-build.d.cts +2 -2
- package/dist/analytics/log-build.d.ts +2 -2
- package/dist/analytics/log-build.js +6 -5
- package/dist/analytics/studio-usage.cjs +90 -0
- package/dist/analytics/studio-usage.d.cts +5 -0
- package/dist/analytics/studio-usage.d.ts +5 -0
- package/dist/analytics/studio-usage.js +10 -0
- package/dist/catalog-runtime.cjs +1 -1
- package/dist/{chunk-RFIXKATC.js → chunk-4G7FSRPN.js} +35 -42
- package/dist/{chunk-AWOO63ME.js → chunk-AD7CL772.js} +11 -4
- package/dist/chunk-CA6WCQ2T.js +54 -0
- package/dist/{chunk-GAHKCOQM.js → chunk-JZN4RSMF.js} +1 -1
- package/dist/{chunk-JQMYHZWI.js → chunk-NEAVAFSJ.js} +16 -8
- package/dist/{chunk-4CFZUHGG.js → chunk-NIVST4WY.js} +1 -1
- package/dist/{chunk-ENAG6UH7.js → chunk-NKNOXQ62.js} +1 -6
- package/dist/{chunk-ZEY2XUJN.js → chunk-OX6TSVHY.js} +6 -6
- package/dist/{chunk-36RYTYT5.js → chunk-PD7KTSYN.js} +1 -1
- package/dist/{chunk-EUNQJO3J.js → chunk-RE7UTPWH.js} +1 -1
- package/dist/chunk-S5GWAUG5.js +29 -0
- package/dist/{chunk-TZVDMWQX.js → chunk-YQGRMDRB.js} +4 -2
- package/dist/constants.cjs +1 -1
- package/dist/constants.js +1 -1
- package/dist/docs/api/02-config.md +57 -7
- package/dist/docs/development/00-why-eventcatalog.md +11 -11
- package/dist/docs/development/01-fundamentals.md +20 -13
- package/dist/docs/development/01-getting-started/configuration-overview.md +2 -2
- package/dist/docs/development/01-getting-started/installation.md +9 -1
- package/dist/docs/development/_getting-started.mdx +1 -1
- package/dist/docs/development/ask-your-architecture/01-intro.md +5 -5
- package/dist/docs/development/ask-your-architecture/02-eventcatalog-assistant/01-what-is-eventcatalog-assistant.md +0 -4
- package/dist/docs/development/ask-your-architecture/02-eventcatalog-assistant/02-configuration.md +15 -3
- package/dist/docs/development/ask-your-architecture/02-eventcatalog-assistant/03-bring-your-own-tools.md +0 -3
- package/dist/docs/development/ask-your-architecture/02-eventcatalog-assistant/_category_.json +1 -1
- package/dist/docs/development/ask-your-architecture/02-llms.txt.md +1 -1
- package/dist/docs/development/ask-your-architecture/{05-skills/01-introduction.md → 03-install-skills.md} +57 -7
- package/dist/docs/development/ask-your-architecture/03-mcp-server/_category_.json +1 -1
- package/dist/docs/development/ask-your-architecture/03-mcp-server/getting-started.md +86 -33
- package/dist/docs/development/ask-your-architecture/03-mcp-server/introduction.md +14 -4
- package/dist/docs/development/ask-your-architecture/03-schemas.txt.md +1 -1
- package/dist/docs/development/ask-your-architecture/04-agents/_category_.json +1 -1
- package/dist/docs/development/authentication/01-introduction.md +2 -23
- package/dist/docs/development/authentication/02-enabling-authentication.md +0 -20
- package/dist/docs/development/authentication/07-rbac-middleware.md +0 -2
- package/dist/docs/development/authentication/providers/03-setting-up-github.md +0 -2
- package/dist/docs/development/authentication/providers/03a-setting-up-google.md +0 -2
- package/dist/docs/development/authentication/providers/04-setting-up-azure-ad.md +0 -2
- package/dist/docs/development/authentication/providers/05-setting-up-okta.md +0 -3
- package/dist/docs/development/authentication/providers/06-setting-up-auth0.md +0 -2
- package/dist/docs/development/bring-your-own-documentation/01-introduction.md +0 -4
- package/dist/docs/development/bring-your-own-documentation/custom-pages/01-introduction.md +0 -3
- package/dist/docs/development/bring-your-own-documentation/custom-pages/02-adding-custom-docs.md +0 -17
- package/dist/docs/development/bring-your-own-documentation/custom-pages/03-components.md +0 -4
- package/dist/docs/development/bring-your-own-documentation/custom-pages/04-owners.md +0 -2
- package/dist/docs/development/bring-your-own-documentation/resource-docs/01-introduction.md +1 -3
- package/dist/docs/development/bring-your-own-documentation/resource-docs/02-adding-resource-docs.md +1 -4
- package/dist/docs/development/bring-your-own-documentation/resource-docs/03-categories.md +0 -2
- package/dist/docs/development/bring-your-own-documentation/resource-docs/04-versioning.md +1 -3
- package/dist/docs/development/components/components/11-flow.md +17 -0
- package/dist/docs/development/components/components/15-nodegraph.md +43 -10
- package/dist/docs/development/components/components/18-remote-schema.md +1 -4
- package/dist/docs/development/components/custom-components/07-reference.md +14 -0
- package/dist/docs/development/customization/02-themes.md +0 -5
- package/dist/docs/development/customization/03-search.md +1 -1
- package/dist/docs/development/customization/05-custom-pages-and-api-routes/01-introduction.md +0 -2
- package/dist/docs/development/customization/05-custom-pages-and-api-routes/04-reference.md +7 -1
- package/dist/docs/development/customization/05-resource-sidebar.md +1 -1
- package/dist/docs/development/customization/09-embed-eventcatalog.md +20 -25
- package/dist/docs/development/deployment/hosting-options.md +7 -2
- package/dist/docs/development/developer-tools/eventcatalog-linter/how-to/05-fix-common-problems.md +16 -0
- package/dist/docs/development/developer-tools/eventcatalog-linter/reference/03-rules.md +31 -1
- package/dist/docs/development/developer-tools/eventcatalog-linter/reference/05-supported-resources.md +1 -1
- package/dist/docs/development/governance/architecture-change-detection/01-introduction.md +0 -10
- package/dist/docs/development/governance/architecture-change-detection/06-pipeline-gates.md +0 -4
- package/dist/docs/development/guides/97-architecture-graph.md +1 -1
- package/dist/docs/development/guides/99-adding-analytics.md +0 -7
- package/dist/docs/development/guides/domains/03-model-subdomains.md +2 -2
- package/dist/docs/development/guides/domains/04-add-resources-to-domains/01-add-systems-to-domains.md +3 -1
- package/dist/docs/development/guides/domains/04-add-resources-to-domains/02-add-services-to-domains.md +5 -1
- package/dist/docs/development/guides/domains/04-add-resources-to-domains/03-add-messages-to-domains.md +2 -2
- package/dist/docs/development/guides/domains/04-add-resources-to-domains/05-add-entities-to-domains.md +1 -1
- package/dist/docs/development/guides/domains/04-add-resources-to-domains/06-domain-resources-page.md +40 -0
- package/dist/docs/development/guides/domains/06-visualize-domains/01-domain-diagram.md +89 -0
- package/dist/docs/development/guides/domains/06-visualize-domains/_category_.json +1 -2
- package/dist/docs/development/guides/domains/09-reference.md +4 -4
- package/dist/docs/development/guides/owners/automated-teams-and-users/create-your-own-connector.md +0 -2
- package/dist/docs/development/guides/owners/automated-teams-and-users/sync-from-github.md +0 -3
- package/dist/docs/development/guides/owners/automated-teams-and-users/sync-from-microsoft-entra.md +0 -2
- package/dist/docs/development/guides/resources/adrs/03-linking-resources.md +8 -0
- package/dist/docs/development/guides/resources/adrs/06-reference.md +4 -4
- package/dist/docs/development/guides/resources/agents/11-reference.md +1 -1
- package/dist/docs/development/guides/resources/data/04-reference.md +1 -1
- package/dist/docs/development/guides/resources/data-products/07-reference.md +1 -1
- package/dist/docs/development/guides/resources/entities/05-entity-maps.md +1 -1
- package/dist/docs/development/guides/resources/entities/06-reference.md +2 -2
- package/dist/docs/development/guides/resources/flows/01-introduction.md +11 -1
- package/dist/docs/development/guides/resources/flows/03-model-flow-steps.md +65 -6
- package/dist/docs/development/guides/resources/flows/05-explore-flows.md +112 -0
- package/dist/docs/development/guides/resources/flows/06-reference.md +25 -4
- package/dist/docs/development/guides/resources/messages/01-what-are-messages.md +19 -0
- package/dist/docs/development/guides/resources/messages/04-message-channels/01-introduction.md +16 -0
- package/dist/docs/development/guides/resources/messages/04-message-channels/05-reference.md +2 -1
- package/dist/docs/development/guides/resources/messages/10-reference.md +6 -3
- package/dist/docs/development/guides/resources/schemas/04-explore-schemas/01-schema-explorer.md +2 -2
- package/dist/docs/development/guides/resources/schemas/04-explore-schemas/02-fields-explorer.md +0 -9
- package/dist/docs/development/guides/resources/schemas/05-schema-api.md +0 -3
- package/dist/docs/development/guides/resources/schemas/06-schema-mcp.md +11 -3
- package/dist/docs/development/guides/resources/services/04-add-resources-to-services/03-add-entities-to-services.md +1 -1
- package/dist/docs/development/guides/resources/services/05-resources-page.md +50 -0
- package/dist/docs/development/guides/resources/services/08-reference.md +2 -1
- package/dist/docs/development/guides/systems/01-introduction.md +1 -1
- package/dist/docs/development/guides/systems/02-create-system.md +2 -2
- package/dist/docs/development/guides/systems/03-add-resources-to-systems.md +35 -9
- package/dist/docs/development/guides/systems/04-model-relationships-and-actors.md +5 -3
- package/dist/docs/development/guides/systems/05-system-context-maps.md +39 -22
- package/dist/docs/development/guides/systems/06-reference.md +4 -4
- package/dist/docs/development/license/01-license-file.md +151 -0
- package/dist/docs/development/license/_category_.json +12 -0
- package/dist/docs/development/license-keys/_category_.json +3 -3
- package/dist/docs/development/license-keys/integrations.md +7 -37
- package/dist/docs/development/license-keys/license-validation.md +4 -0
- package/dist/docs/development/license-keys/overview.md +5 -1
- package/dist/docs/development/license-keys/plans.md +4 -2
- package/dist/docs/development/studio/01-introduction.md +60 -0
- package/dist/docs/development/studio/02-create-a-canvas.md +103 -0
- package/dist/docs/development/studio/03-set-up-persistent-storage.md +59 -0
- package/dist/docs/development/studio/04-collaborate-on-a-canvas.md +78 -0
- package/dist/docs/development/studio/05-connect-your-agent.md +102 -0
- package/dist/docs/development/studio/06-run-studio-in-production.md +54 -0
- package/dist/docs/development/studio/07-reference.md +294 -0
- package/dist/docs/development/studio/_category_.json +12 -0
- package/dist/docs/development/upgrading/v5.md +345 -0
- package/dist/docs/federation/00-overview.md +2 -8
- package/dist/docs/federation/01-first-federation.md +6 -18
- package/dist/docs/federation/explanation/how-it-works.md +0 -4
- package/dist/docs/federation/explanation/lockfile-and-cache.md +0 -4
- package/dist/docs/federation/explanation/mvp-status-and-feedback.md +0 -4
- package/dist/docs/federation/explanation/ownership-and-references.md +0 -4
- package/dist/docs/federation/how-to/configure-github-sources.md +6 -5
- package/dist/docs/federation/how-to/configure-validation-rules.md +0 -4
- package/dist/docs/federation/how-to/run-in-ci.md +2 -9
- package/dist/docs/federation/how-to/share-assets-and-components.md +0 -4
- package/dist/docs/federation/how-to/use-local-sources.md +0 -4
- package/dist/docs/federation/legacy-federation/00-introduction.md +4 -22
- package/dist/docs/federation/legacy-federation/01-installation.md +7 -58
- package/dist/docs/federation/legacy-federation/02-plugin-configuration.md +3 -21
- package/dist/docs/federation/legacy-federation/03-examples.md +3 -5
- package/dist/docs/federation/legacy-federation/04-configuration.md +3 -8
- package/dist/docs/federation/legacy-federation/05-setup-team-catalog.md +3 -6
- package/dist/docs/federation/reference/cli.md +2 -8
- package/dist/docs/federation/reference/configuration.md +0 -4
- package/dist/docs/federation/reference/diagnostic-rules.md +0 -5
- package/dist/docs/federation/reference/generated-output.md +0 -4
- package/dist/docs/federation/reference/supported-content.md +0 -4
- package/dist/docs/federation/reference/troubleshooting.md +0 -14
- package/dist/docs/plugins/02-generators.md +1 -1
- package/dist/docs/plugins/amazon-apigateway/00-intro.md +3 -28
- package/dist/docs/plugins/amazon-apigateway/01-installation.md +4 -56
- package/dist/docs/plugins/amazon-apigateway/02-plugin-configuration.md +1 -6
- package/dist/docs/plugins/apicurio/00-intro.md +2 -31
- package/dist/docs/plugins/apicurio/01-installation.md +2 -26
- package/dist/docs/plugins/apicurio/02-plugin-configuration.md +5 -13
- package/dist/docs/plugins/apicurio/03-features.md +1 -3
- package/dist/docs/plugins/asyncapi/00-intro.md +2 -28
- package/dist/docs/plugins/asyncapi/01-installation.md +3 -54
- package/dist/docs/plugins/asyncapi/02-plugin-configuration.md +2 -1
- package/dist/docs/plugins/aws-glue-registry/00-intro.md +4 -32
- package/dist/docs/plugins/aws-glue-registry/00a-installation.md +3 -53
- package/dist/docs/plugins/azure-schema-registry/00-intro.md +4 -32
- package/dist/docs/plugins/azure-schema-registry/01-installation.md +6 -33
- package/dist/docs/plugins/azure-schema-registry/02-plugin-configuration.md +1 -14
- package/dist/docs/plugins/azure-schema-registry/04-examples.md +0 -2
- package/dist/docs/plugins/backstage/00-overview.md +1 -7
- package/dist/docs/plugins/backstage/01-get-started.md +6 -15
- package/dist/docs/plugins/backstage/06-configuration.md +2 -8
- package/dist/docs/plugins/confluent-schema-registry/00-intro.md +2 -29
- package/dist/docs/plugins/confluent-schema-registry/01-installation.md +2 -26
- package/dist/docs/plugins/eventbridge/00-intro.md +0 -4
- package/dist/docs/plugins/eventbridge/00a-installation.md +1 -87
- package/dist/docs/plugins/eventbridge/03-api.md +2 -20
- package/dist/docs/plugins/github/00-intro.md +0 -31
- package/dist/docs/plugins/github/01-installation.md +2 -34
- package/dist/docs/plugins/graphql/00-intro.md +0 -30
- package/dist/docs/plugins/graphql/01-installation.md +1 -53
- package/dist/docs/plugins/graphql/02-plugin-configuration.md +0 -1
- package/dist/docs/plugins/hookdeck/01-intro.md +1 -1
- package/dist/docs/plugins/openapi/00-intro.md +0 -30
- package/dist/docs/plugins/openapi/01-installation.md +1 -57
- package/dist/docs/plugins/openapi/02-plugin-configuration.md +0 -5
- package/dist/docs/plugins/openapi/03-features.md +0 -4
- package/dist/eventcatalog-config-file-utils.cjs +34 -41
- package/dist/eventcatalog-config-file-utils.d.cts +56 -58
- package/dist/eventcatalog-config-file-utils.d.ts +56 -58
- package/dist/eventcatalog-config-file-utils.js +1 -1
- package/dist/eventcatalog.cjs +340 -249
- package/dist/eventcatalog.config.d.cts +18 -15
- package/dist/eventcatalog.config.d.ts +18 -15
- package/dist/eventcatalog.js +51 -33
- package/dist/features.cjs +36 -49
- package/dist/features.d.cts +1 -3
- package/dist/features.d.ts +1 -3
- package/dist/features.js +4 -6
- package/dist/federation/federate.cjs +37 -44
- package/dist/federation/federate.js +5 -5
- package/dist/federation/source-provider.js +2 -2
- package/dist/generate.cjs +37 -42
- package/dist/generate.js +4 -4
- package/dist/resolve-catalog-dependencies.cjs +34 -41
- package/dist/resolve-catalog-dependencies.js +2 -2
- package/dist/runtime-dependencies/@eventcatalog__visualiser__studio-fonts.css.mjs +3 -0
- package/dist/runtime-dependencies/@eventcatalog__visualiser__studio.css.mjs +3 -0
- package/dist/runtime-dependencies/@eventcatalog__visualiser__studio.mjs +3 -0
- package/dist/runtime-dependencies/htmlparser2.mjs +3 -0
- package/dist/runtime-dependencies/manifest.json +5 -1
- package/dist/runtime-dependencies/react-syntax-highlighter__dist__cjs__create-element.js.mjs +3 -0
- package/dist/utils/child-process-signals.cjs +53 -0
- package/dist/utils/child-process-signals.d.cts +19 -0
- package/dist/utils/child-process-signals.d.ts +19 -0
- package/dist/utils/child-process-signals.js +6 -0
- package/dist/utils/cli-logger.cjs +1 -1
- package/dist/utils/cli-logger.js +2 -2
- package/dist/utils/license-status.cjs +11 -4
- package/dist/utils/license-status.d.cts +3 -2
- package/dist/utils/license-status.d.ts +3 -2
- package/dist/utils/license-status.js +1 -1
- package/eventcatalog/astro.config.mjs +21 -1
- package/eventcatalog/integrations/config-loader.mjs +56 -58
- package/eventcatalog/integrations/skip-startup-reload.mjs +31 -0
- package/eventcatalog/integrations/stable-dependency-order.mjs +29 -0
- package/eventcatalog/integrations/storage.mjs +20 -0
- package/eventcatalog/integrations/studio-server.mjs +4 -1
- package/eventcatalog/src/components/CatalogGraph/CatalogForceGraph.tsx +39 -0
- package/eventcatalog/src/components/ChatPanel/ChatPanel.tsx +2 -0
- package/eventcatalog/src/components/Homepage/CatalogDashboard.astro +342 -0
- package/eventcatalog/src/components/MDX/NodeGraph/AstroNodeGraph.tsx +60 -4
- package/eventcatalog/src/components/MDX/NodeGraph/NodeGraph.astro +5 -1
- package/eventcatalog/src/components/NavigationProgress.astro +7 -0
- package/eventcatalog/src/components/SchemaExplorer/ApiContentViewer.tsx +2 -0
- package/eventcatalog/src/components/SchemaExplorer/ExamplesViewer.tsx +2 -0
- package/eventcatalog/src/components/SchemaExplorer/SchemaCodeModal.tsx +2 -0
- package/eventcatalog/src/components/SchemaExplorer/SchemaContentViewer.tsx +2 -0
- package/eventcatalog/src/components/Search/SearchDataLoader.astro +16 -28
- package/eventcatalog/src/components/Search/SearchModal.tsx +2 -10
- package/eventcatalog/src/components/Search/search-utils.ts +26 -0
- package/eventcatalog/src/components/Seo.astro +5 -1
- package/eventcatalog/src/components/Settings/AssistantSettingsForm.tsx +53 -48
- package/eventcatalog/src/components/Settings/GeneralSettingsForm.tsx +183 -178
- package/eventcatalog/src/components/Settings/LicenseSettings.tsx +140 -31
- package/eventcatalog/src/components/Settings/LlmAccessSettingsForm.tsx +40 -35
- package/eventcatalog/src/components/Settings/LogoUpload.tsx +1 -1
- package/eventcatalog/src/components/Settings/McpSettingsForm.tsx +9 -8
- package/eventcatalog/src/components/Settings/Row.tsx +7 -4
- package/eventcatalog/src/components/Settings/SettingsShared.tsx +3 -3
- package/eventcatalog/src/components/SideNav/NestedSideBar/index.tsx +37 -76
- package/eventcatalog/src/components/SideNav/NestedSideBar/storage.ts +2 -0
- package/eventcatalog/src/components/SideNav/NestedSideBar/utils.ts +122 -1
- package/eventcatalog/src/components/SideNav/SideNav.astro +9 -1
- package/eventcatalog/src/components/TrialBadge.astro +20 -9
- package/eventcatalog/src/content.config.ts +19 -2
- package/eventcatalog/src/features/auth/error.astro +4 -2
- package/eventcatalog/src/features/auth/login.astro +2 -1
- package/eventcatalog/src/features/auth/middleware/middleware-auth.ts +21 -1
- package/eventcatalog/src/features/auth/unauthorized.astro +1 -1
- package/eventcatalog/src/features/fields/pages/fields.astro +1 -1
- package/eventcatalog/src/features/integrations/eventcatalog-features.ts +13 -7
- package/eventcatalog/src/features/mcp/apps/architecture-diagram/node-chat.tsx +6 -45
- package/eventcatalog/src/features/mcp/apps/canvas/shared.ts +3 -3
- package/eventcatalog/src/features/mcp/apps/canvas/styles.css +3 -1
- package/eventcatalog/src/features/mcp/apps/canvas/view.tsx +7 -5
- package/eventcatalog/src/features/mcp/apps/generated/canvas.html +123 -98
- package/eventcatalog/src/features/mcp/apps/generated/viewer.html +118 -101
- package/eventcatalog/src/features/mcp/mcp-server.ts +20 -4
- package/eventcatalog/src/features/server/start.ts +25 -0
- package/eventcatalog/src/features/storage/database.ts +88 -0
- package/eventcatalog/src/features/storage/migrations.ts +85 -0
- package/eventcatalog/src/features/storage/sql/database.sql +5 -0
- package/eventcatalog/src/features/storage/sql/migrations/0001-studio-canvases.sql +12 -0
- package/eventcatalog/src/features/storage/sql/migrations.sql +15 -0
- package/eventcatalog/src/features/storage/sql.ts +28 -0
- package/eventcatalog/src/features/studio/agent-choreography.ts +13 -10
- package/eventcatalog/src/features/studio/agents.ts +28 -0
- package/eventcatalog/src/features/studio/api/canvases-api.ts +219 -0
- package/eventcatalog/src/features/studio/api/canvases.ts +25 -0
- package/eventcatalog/src/features/studio/api/client.ts +40 -0
- package/eventcatalog/src/features/studio/canvas-actions.ts +160 -34
- package/eventcatalog/src/features/studio/canvas-preview.ts +1 -2
- package/eventcatalog/src/features/studio/catalog.ts +16 -14
- package/eventcatalog/src/features/studio/components/CanvasHeader.tsx +274 -105
- package/eventcatalog/src/features/studio/components/CanvasStatusMenu.tsx +15 -14
- package/eventcatalog/src/features/studio/components/ConnectAgentDialog.tsx +272 -119
- package/eventcatalog/src/features/studio/components/ConnectionsChooser.tsx +1 -2
- package/eventcatalog/src/features/studio/components/DeleteCanvasDialog.tsx +65 -0
- package/eventcatalog/src/features/studio/components/Dialog.tsx +60 -0
- package/eventcatalog/src/features/studio/components/JoinForm.tsx +101 -26
- package/eventcatalog/src/features/studio/components/LeftPanel.tsx +122 -230
- package/eventcatalog/src/features/studio/components/NodeDetails.tsx +183 -0
- package/eventcatalog/src/features/studio/components/OpenInStudioDialog.tsx +79 -0
- package/eventcatalog/src/features/studio/components/Presence.tsx +52 -45
- package/eventcatalog/src/features/studio/components/ShareDialog.tsx +277 -141
- package/eventcatalog/src/features/studio/components/ShortcutsDialog.tsx +41 -0
- package/eventcatalog/src/features/studio/components/StudioDesigner.tsx +1314 -385
- package/eventcatalog/src/features/studio/components/StudioNotice.astro +24 -0
- package/eventcatalog/src/features/studio/document-name.ts +7 -0
- package/eventcatalog/src/features/studio/from-visualiser.ts +138 -0
- package/eventcatalog/src/features/studio/hooks/presence-sender.ts +19 -2
- package/eventcatalog/src/features/studio/hooks/use-canvas-webmcp.ts +9 -3
- package/eventcatalog/src/features/studio/hooks/use-comments.ts +2 -2
- package/eventcatalog/src/features/studio/hooks/use-follow-camera.ts +8 -3
- package/eventcatalog/src/features/studio/hooks/use-studio-flow.ts +244 -32
- package/eventcatalog/src/features/studio/identity.ts +25 -1
- package/eventcatalog/src/features/studio/limits.ts +2 -0
- package/eventcatalog/src/features/studio/pages/[id].astro +42 -16
- package/eventcatalog/src/features/studio/pages/index.astro +596 -373
- package/eventcatalog/src/features/studio/pages/webmcp-relay.ts +12 -15
- package/eventcatalog/src/features/studio/server/canvas-mcp.ts +8 -23
- package/eventcatalog/src/features/studio/server/runtime.ts +150 -46
- package/eventcatalog/src/features/studio/server/sql/storage.sql +18 -0
- package/eventcatalog/src/features/studio/server/storage.ts +53 -73
- package/eventcatalog/src/features/studio/webmcp-relay/LICENSE +21 -0
- package/eventcatalog/src/features/studio/webmcp-relay/README.md +5 -0
- package/eventcatalog/src/features/studio/webmcp-relay/embed.js +2 -0
- package/eventcatalog/src/features/studio/webmcp-relay/widget.html +10 -0
- package/eventcatalog/src/features/studio/webmcp-relay/widget.js +1 -0
- package/eventcatalog/src/features/tools/catalog-tools.ts +3 -1
- package/eventcatalog/src/layouts/BaseLayout.astro +4 -4
- package/eventcatalog/src/layouts/SettingsLayout.astro +2 -2
- package/eventcatalog/src/layouts/VerticalSideBarLayout.astro +3 -2
- package/eventcatalog/src/pages/_index.astro +5 -342
- package/eventcatalog/src/pages/architecture/[type]/[id]/[version]/_index.data.spec.ts +2 -3
- package/eventcatalog/src/pages/architecture/[type]/[id]/[version]/_index.data.ts +0 -7
- package/eventcatalog/src/pages/architecture/[type]/[id]/[version]/index.astro +3 -1
- package/eventcatalog/src/pages/diagrams/[id]/[version]/_index.data.ts +0 -7
- package/eventcatalog/src/pages/diagrams/[id]/[version]/embed.astro +1 -0
- package/eventcatalog/src/pages/diagrams/[id]/[version]/index.astro +1 -0
- package/eventcatalog/src/pages/directory/[type]/_index.data.ts +5 -7
- package/eventcatalog/src/pages/directory/[type]/index.astro +3 -1
- package/eventcatalog/src/pages/discover/[type]/_index.data.ts +5 -7
- package/eventcatalog/src/pages/discover/[type]/index.astro +3 -1
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/[docVersion]/_index.data.ts +0 -7
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/[docVersion]/index.astro +1 -0
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/_index.data.ts +0 -7
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/[docType]/[docId]/index.astro +1 -0
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/_index.data.ts +0 -7
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/asyncapi/[filename].astro +3 -1
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/asyncapi/_[filename].data.ts +0 -7
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/changelog/_index.data.ts +0 -7
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/changelog/index.astro +1 -0
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/examples/[...filename].astro +1 -0
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/examples/_[...filename].data.ts +0 -4
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/field-lineage/_index.data.ts +0 -7
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/field-lineage/index.astro +1 -0
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/graphql/[filename].astro +3 -1
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/graphql/_[filename].data.ts +0 -7
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/index.astro +1 -0
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/resources/_index.data.spec.ts +2 -3
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/resources/_index.data.ts +0 -7
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/resources/index.astro +1 -0
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/spec/[filename].astro +1 -0
- package/eventcatalog/src/pages/docs/[type]/[id]/[version]/spec/_[filename].data.ts +0 -7
- package/eventcatalog/src/pages/docs/[type]/[id]/_index.data.ts +0 -7
- package/eventcatalog/src/pages/docs/[type]/[id]/index.astro +2 -1
- package/eventcatalog/src/pages/docs/[type]/[id]/language/[dictionaryId]/_index.data.ts +0 -7
- package/eventcatalog/src/pages/docs/[type]/[id]/language/[dictionaryId]/index.astro +1 -0
- package/eventcatalog/src/pages/docs/[type]/[id]/language/_index.data.ts +0 -7
- package/eventcatalog/src/pages/docs/[type]/[id]/language/index.astro +1 -0
- package/eventcatalog/src/pages/docs/custom/[...path]/_index.data.ts +0 -7
- package/eventcatalog/src/pages/docs/custom/[...path]/index.astro +1 -0
- package/eventcatalog/src/pages/docs/services/[id]/[docType]/[docId]/index.astro +1 -1
- package/eventcatalog/src/pages/docs/services/[id]/[version]/resources/index.astro +1 -0
- package/eventcatalog/src/pages/docs/services/[id]/asyncapi/[filename].astro +1 -1
- package/eventcatalog/src/pages/docs/services/[id]/changelog/index.astro +1 -1
- package/eventcatalog/src/pages/docs/services/[id]/graphql/[filename].astro +1 -1
- package/eventcatalog/src/pages/docs/services/[id]/spec/[filename].astro +1 -1
- package/eventcatalog/src/pages/docs/teams/[id]/_index.data.ts +0 -7
- package/eventcatalog/src/pages/docs/teams/[id]/index.astro +1 -0
- package/eventcatalog/src/pages/docs/users/[id]/_index.data.ts +0 -7
- package/eventcatalog/src/pages/docs/users/[id]/index.astro +1 -0
- package/eventcatalog/src/pages/index.astro +4 -2
- package/eventcatalog/src/pages/schemas/[type]/[id]/[version]/_index.data.ts +0 -7
- package/eventcatalog/src/pages/schemas/[type]/[id]/[version]/index.astro +9 -1
- package/eventcatalog/src/pages/schemas/explorer/_index.data.ts +0 -7
- package/eventcatalog/src/pages/schemas/explorer/index.astro +4 -2
- package/eventcatalog/src/pages/settings/license.astro +9 -1
- package/eventcatalog/src/pages/triggers/[type]/[id]/[version]/_index.data.ts +0 -7
- package/eventcatalog/src/pages/triggers/[type]/[id]/[version]/index.astro +1 -0
- package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/_index.data.ts +0 -7
- package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/data/_index.data.ts +0 -7
- package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/data/index.astro +1 -0
- package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/entity-map/_index.data.ts +0 -7
- package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/entity-map/index.astro +1 -0
- package/eventcatalog/src/pages/visualiser/[type]/[id]/[version]/index.astro +1 -0
- package/eventcatalog/src/pages/visualiser/[type]/[id]/_index.data.ts +38 -0
- package/eventcatalog/src/pages/visualiser/[type]/[id]/index.astro +18 -41
- package/eventcatalog/src/pages/visualiser/designs/[id]/_index.data.ts +0 -7
- package/eventcatalog/src/pages/visualiser/designs/[id]/index.astro +2 -1
- package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/entity-map/_index.data.ts +0 -7
- package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/entity-map/index.astro +1 -0
- package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/index.astro +1 -0
- package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/systems-context/_index.data.ts +0 -7
- package/eventcatalog/src/pages/visualiser/domains/[id]/[version]/systems-context/index.astro +1 -0
- package/eventcatalog/src/pages/visualiser/systems/[id]/[version]/context/_index.data.ts +0 -7
- package/eventcatalog/src/pages/visualiser/systems/[id]/[version]/context/index.astro +1 -0
- package/eventcatalog/src/pages/visualiser/systems/[id]/[version]/index.astro +1 -0
- package/eventcatalog/src/types/react-syntax-highlighter.d.ts +10 -0
- package/eventcatalog/src/utils/collections/flows.ts +20 -7
- package/eventcatalog/src/utils/collections/resource-owners.ts +8 -2
- package/eventcatalog/src/utils/collections/resources.ts +2 -0
- package/eventcatalog/src/utils/collections/util.ts +8 -4
- package/eventcatalog/src/utils/git.ts +11 -0
- package/eventcatalog/src/utils/homepage-dashboard.ts +143 -0
- package/eventcatalog/src/utils/license.ts +1 -1
- package/eventcatalog/src/utils/link-validation.ts +25 -19
- package/eventcatalog/src/utils/node-graphs/domain-entity-map.ts +3 -1
- package/eventcatalog/src/utils/node-graphs/domain-levels-node-graph.ts +3 -3
- package/eventcatalog/src/utils/node-graphs/field-node-graph.ts +4 -2
- package/eventcatalog/src/utils/node-graphs/layout-node-graph.ts +20 -1
- package/eventcatalog/src/utils/node-graphs/node-resource.ts +67 -0
- package/eventcatalog/src/utils/node-graphs/systems-node-graph.ts +1 -1
- package/eventcatalog/src/utils/page-loaders/hybrid-page.ts +4 -15
- package/eventcatalog/src/utils/page-title.ts +15 -0
- package/eventcatalog/src/utils/syntax-highlighter-renderer.ts +64 -0
- package/eventcatalog/src/utils/trial.ts +13 -0
- package/package.json +11 -11
- package/dist/docs/development/ask-your-architecture/05-skills/02-installation.md +0 -60
- package/dist/docs/development/ask-your-architecture/05-skills/_category_.json +0 -11
- package/dist/docs/development/ask-your-architecture/06-slack-integration/01-introduction.md +0 -63
- package/dist/docs/development/ask-your-architecture/06-slack-integration/02-slack-app-setup.md +0 -154
- package/dist/docs/development/ask-your-architecture/06-slack-integration/03-installation.md +0 -169
- package/dist/docs/development/ask-your-architecture/06-slack-integration/04-deployment.md +0 -236
- package/dist/docs/development/ask-your-architecture/06-slack-integration/05-usage.md +0 -140
- package/dist/docs/development/ask-your-architecture/06-slack-integration/06-troubleshooting.md +0 -268
- package/dist/docs/development/ask-your-architecture/06-slack-integration/_category_.json +0 -13
- package/dist/docs/development/guides/domains/06-visualize-domains/01-domain-integration-map.md +0 -40
- package/dist/runtime-dependencies/@mcp-b__webmcp-local-relay.mjs +0 -3
- package/eventcatalog/src/features/studio/canvas-doc.ts +0 -409
- package/eventcatalog/src/features/studio/clipboard.ts +0 -97
- package/eventcatalog/src/features/studio/components/CanvasControls.tsx +0 -154
- package/eventcatalog/src/features/studio/components/Comments.tsx +0 -770
- package/eventcatalog/src/features/studio/components/ContainerChooser.tsx +0 -145
- package/eventcatalog/src/features/studio/components/DragGhost.tsx +0 -115
- package/eventcatalog/src/features/studio/components/Picture.tsx +0 -21
- package/eventcatalog/src/features/studio/components/PropertiesPanel.tsx +0 -212
- package/eventcatalog/src/features/studio/components/canvas-nodes.tsx +0 -255
- package/eventcatalog/src/features/studio/components/icons.ts +0 -53
- package/eventcatalog/src/features/studio/components/status.ts +0 -51
- package/eventcatalog/src/features/studio/edges.ts +0 -56
- package/eventcatalog/src/features/studio/flow-state.ts +0 -92
- package/eventcatalog/src/features/studio/grouping.ts +0 -226
- package/eventcatalog/src/features/studio/layout.ts +0 -42
- package/eventcatalog/src/features/studio/levels.ts +0 -282
- package/eventcatalog/src/features/studio/node-types.ts +0 -205
- package/eventcatalog/src/features/studio/pages/new.astro +0 -24
- package/eventcatalog/src/features/studio/pages/wake.ts +0 -15
- package/eventcatalog/src/features/studio/placement.ts +0 -197
- package/eventcatalog/src/features/studio/studio.css +0 -273
- package/dist/{chunk-A2RZR3U4.js → chunk-6K7XZAYI.js} +3 -3
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { ApiCanvas } from './canvases-api';
|
|
2
|
+
import type { DiagramLevelsSpec, NewCanvasEdges, NodeSpecs } from '../canvas-actions';
|
|
3
|
+
|
|
4
|
+
/** Using the Studio API from the browser (Studio's pages), at `apiUrl` (its address on this catalog) */
|
|
5
|
+
|
|
6
|
+
const errorOf = async (response: Response, fallback: string) => {
|
|
7
|
+
const body = (await response.json().catch(() => null)) as { error?: string } | null;
|
|
8
|
+
return new Error(body?.error ?? `${fallback} (${response.status})`);
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
/** Creates a canvas, starting with the nodes and edges given, if any */
|
|
12
|
+
export const createCanvasThroughApi = async (
|
|
13
|
+
apiUrl: string,
|
|
14
|
+
canvas: { title?: string; createdBy?: string; nodes?: NodeSpecs; edges?: NewCanvasEdges; levels?: DiagramLevelsSpec }
|
|
15
|
+
) => {
|
|
16
|
+
const response = await fetch(apiUrl, {
|
|
17
|
+
method: 'POST',
|
|
18
|
+
headers: { 'Content-Type': 'application/json', Accept: 'application/json' },
|
|
19
|
+
body: JSON.stringify(canvas),
|
|
20
|
+
});
|
|
21
|
+
if (!response.ok) throw await errorOf(response, 'Could not create the canvas');
|
|
22
|
+
return ((await response.json()) as { canvas: ApiCanvas }).canvas;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
/** Copies a canvas's design to a new draft */
|
|
26
|
+
export const copyCanvasThroughApi = async (apiUrl: string, canvasId: string, copy: { createdBy?: string } = {}) => {
|
|
27
|
+
const response = await fetch(`${apiUrl}/${canvasId}/copy`, {
|
|
28
|
+
method: 'POST',
|
|
29
|
+
headers: { 'Content-Type': 'application/json', Accept: 'application/json' },
|
|
30
|
+
body: JSON.stringify(copy),
|
|
31
|
+
});
|
|
32
|
+
if (!response.ok) throw await errorOf(response, 'Could not copy the canvas');
|
|
33
|
+
return ((await response.json()) as { canvas: ApiCanvas }).canvas;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
/** Deletes a canvas (one that's already gone counts as deleted) */
|
|
37
|
+
export const deleteCanvasThroughApi = async (apiUrl: string, canvasId: string) => {
|
|
38
|
+
const response = await fetch(`${apiUrl}/${canvasId}`, { method: 'DELETE', headers: { Accept: 'application/json' } });
|
|
39
|
+
if (!response.ok && response.status !== 404) throw await errorOf(response, 'Could not delete the canvas');
|
|
40
|
+
};
|
|
@@ -1,21 +1,20 @@
|
|
|
1
1
|
import type { Edge, Node, XYPosition } from '@xyflow/react';
|
|
2
2
|
import type * as Y from 'yjs';
|
|
3
3
|
import { z } from 'zod';
|
|
4
|
-
import { buildNode, getCanvasMaps, getCanvasStatus, readCanvas, updateNodeData } from './canvas-doc';
|
|
5
|
-
import type { CatalogRelation, CatalogResource } from './catalog-resources';
|
|
6
|
-
import {
|
|
7
|
-
buildContainer,
|
|
8
|
-
canBeContainer,
|
|
9
|
-
catalogNodeData,
|
|
10
|
-
containerTypeFor,
|
|
11
|
-
getCatalogLink,
|
|
12
|
-
getRelatedEdges,
|
|
13
|
-
indexRelations,
|
|
14
|
-
} from './catalog';
|
|
15
|
-
import { findGroupAtPoint, getAbsolutePosition, sizeOf } from './grouping';
|
|
16
|
-
import { placeNodes, type Link } from './placement';
|
|
17
4
|
import {
|
|
5
|
+
buildNode,
|
|
6
|
+
getCanvasMaps,
|
|
7
|
+
getCanvasStatus,
|
|
8
|
+
readCanvas,
|
|
9
|
+
updateNodeData,
|
|
10
|
+
type CanvasContent,
|
|
11
|
+
containerFor,
|
|
12
|
+
getAbsolutePosition,
|
|
13
|
+
sizeOf,
|
|
14
|
+
placeNodes,
|
|
15
|
+
type Link,
|
|
18
16
|
canGoInContainer,
|
|
17
|
+
CATALOG_COLLECTIONS,
|
|
19
18
|
COMPONENT_TYPES,
|
|
20
19
|
getNodeDefinition,
|
|
21
20
|
getNodeLabel,
|
|
@@ -27,24 +26,23 @@ import {
|
|
|
27
26
|
isVersioned,
|
|
28
27
|
isWrittenOnCanvas,
|
|
29
28
|
updateResource,
|
|
30
|
-
} from '
|
|
29
|
+
} from '@eventcatalog/visualiser/studio';
|
|
30
|
+
import type { CatalogRelation, CatalogResource } from './catalog-resources';
|
|
31
|
+
import {
|
|
32
|
+
buildContainer,
|
|
33
|
+
canBeContainer,
|
|
34
|
+
catalogNodeData,
|
|
35
|
+
containerTypeFor,
|
|
36
|
+
getCatalogLink,
|
|
37
|
+
getRelatedEdges,
|
|
38
|
+
indexRelations,
|
|
39
|
+
} from './catalog';
|
|
31
40
|
|
|
32
41
|
/**
|
|
33
42
|
* What agents can do on a canvas, shared by the MCP tools (on the server) and the WebMCP tools (in the
|
|
34
43
|
* browser), so both describe and change a canvas the same way.
|
|
35
44
|
*/
|
|
36
45
|
|
|
37
|
-
export const CATALOG_COLLECTIONS = [
|
|
38
|
-
'domains',
|
|
39
|
-
'systems',
|
|
40
|
-
'services',
|
|
41
|
-
'events',
|
|
42
|
-
'commands',
|
|
43
|
-
'queries',
|
|
44
|
-
'channels',
|
|
45
|
-
'containers',
|
|
46
|
-
] as const;
|
|
47
|
-
|
|
48
46
|
// ---- Inputs ----
|
|
49
47
|
|
|
50
48
|
export const nodeSpecsSchema = z
|
|
@@ -71,6 +69,16 @@ export const nodeSpecsSchema = z
|
|
|
71
69
|
.describe('A ref (or node id) of a container (a domain or system added as one) to put this node inside'),
|
|
72
70
|
x: z.number().optional(),
|
|
73
71
|
y: z.number().optional(),
|
|
72
|
+
width: z
|
|
73
|
+
.number()
|
|
74
|
+
.positive()
|
|
75
|
+
.optional()
|
|
76
|
+
.describe('For a container: its width to start with (it grows to fit what is put in it)'),
|
|
77
|
+
height: z
|
|
78
|
+
.number()
|
|
79
|
+
.positive()
|
|
80
|
+
.optional()
|
|
81
|
+
.describe('For a container: its height to start with (it grows to fit what is put in it)'),
|
|
74
82
|
})
|
|
75
83
|
)
|
|
76
84
|
.min(1);
|
|
@@ -83,6 +91,83 @@ export const edgeSpecsSchema = z.array(
|
|
|
83
91
|
})
|
|
84
92
|
);
|
|
85
93
|
|
|
94
|
+
const pointSchema = z.object({ x: z.number(), y: z.number() });
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Edges for a new canvas (through the Studio API): as add_to_canvas takes them, and how each is drawn, if known
|
|
98
|
+
* (e.g. copied from a diagram): the points it goes through (canvas coordinates, at right angles) and where its
|
|
99
|
+
* label goes. It follows its nodes when they're moved.
|
|
100
|
+
*/
|
|
101
|
+
const routeSchema = z.object({ points: z.array(pointSchema).min(2).max(200), label: pointSchema.optional() });
|
|
102
|
+
export const newCanvasEdgesSchema = z.array(edgeSpecsSchema.element.extend({ route: routeSchema.optional() }));
|
|
103
|
+
export type NewCanvasEdges = z.output<typeof newCanvasEdgesSchema>;
|
|
104
|
+
|
|
105
|
+
const MAX_LEVEL_NODES = 1000;
|
|
106
|
+
const levelSchema = z.object({
|
|
107
|
+
nodes: z
|
|
108
|
+
.array(
|
|
109
|
+
z.object({
|
|
110
|
+
ref: z.string().describe("The ref of the node it is on the canvas (or its own id, if it's only on this level)"),
|
|
111
|
+
type: z.string(),
|
|
112
|
+
data: z.record(z.string(), z.unknown()),
|
|
113
|
+
parent: z.string().optional().describe('The ref of the node it is shown in on this level'),
|
|
114
|
+
x: z.number().describe('Its top-left corner (relative to its parent)'),
|
|
115
|
+
y: z.number(),
|
|
116
|
+
width: z.number().positive().optional().describe('For a container: its size'),
|
|
117
|
+
height: z.number().positive().optional(),
|
|
118
|
+
})
|
|
119
|
+
)
|
|
120
|
+
.max(MAX_LEVEL_NODES),
|
|
121
|
+
edges: z
|
|
122
|
+
.array(
|
|
123
|
+
z.object({
|
|
124
|
+
from: z.string(),
|
|
125
|
+
to: z.string(),
|
|
126
|
+
label: z.string().optional(),
|
|
127
|
+
type: z.string().optional(),
|
|
128
|
+
style: z.record(z.string(), z.unknown()).optional(),
|
|
129
|
+
markerEnd: z.unknown().optional(),
|
|
130
|
+
data: z.record(z.string(), z.unknown()).optional().describe("The edge's data, e.g. its route"),
|
|
131
|
+
})
|
|
132
|
+
)
|
|
133
|
+
.max(MAX_LEVEL_NODES * 2),
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* L1 and L2 of the diagram a canvas is opened from, laid out as the diagram showed them (by refs of the nodes given
|
|
138
|
+
* for the canvas): shown as they are until the canvas's structure changes
|
|
139
|
+
*/
|
|
140
|
+
const unavailableReason = z.string().max(300).optional();
|
|
141
|
+
export const diagramLevelsSchema = z.object({
|
|
142
|
+
1: levelSchema.optional(),
|
|
143
|
+
2: levelSchema.optional(),
|
|
144
|
+
unavailable: z
|
|
145
|
+
.object({ 1: unavailableReason, 2: unavailableReason })
|
|
146
|
+
.optional()
|
|
147
|
+
.describe("Levels the diagram doesn't have, and why"),
|
|
148
|
+
});
|
|
149
|
+
export type DiagramLevelsSpec = z.output<typeof diagramLevelsSchema>;
|
|
150
|
+
|
|
151
|
+
/** A diagram's level, with refs swapped for the ids of the nodes made for them */
|
|
152
|
+
const toDiagramLevel = (level: z.output<typeof levelSchema>, idOf: (ref: string) => string) => {
|
|
153
|
+
const shown = new Set(level.nodes.map((node) => node.ref));
|
|
154
|
+
return {
|
|
155
|
+
nodes: level.nodes.map(
|
|
156
|
+
({ ref, type, data, parent, x, y, width, height }): Node => ({
|
|
157
|
+
id: idOf(ref),
|
|
158
|
+
type,
|
|
159
|
+
data,
|
|
160
|
+
position: { x, y },
|
|
161
|
+
...(parent && shown.has(parent) && { parentId: idOf(parent) }),
|
|
162
|
+
...(width && height && { style: { width, height } }),
|
|
163
|
+
})
|
|
164
|
+
),
|
|
165
|
+
edges: level.edges
|
|
166
|
+
.filter((edge) => shown.has(edge.from) && shown.has(edge.to))
|
|
167
|
+
.map(({ from, to, ...edge }, index) => ({ ...edge, id: `diagram-${index}`, source: idOf(from), target: idOf(to) }) as Edge),
|
|
168
|
+
};
|
|
169
|
+
};
|
|
170
|
+
|
|
86
171
|
export const ADD_TO_CANVAS_DESCRIPTION = [
|
|
87
172
|
'Adds nodes (and connections between them) to the canvas, live for everyone on it.',
|
|
88
173
|
'A node is either a catalog resource (resource: { collection, id }), shown with its real name and summary and automatically connected to the related resources already on the canvas (e.g. a service to the events it publishes), or a new component (type, name, summary) for things that are not in the catalog yet, like a proposed service.',
|
|
@@ -199,6 +284,13 @@ export const planNodes = (existing: Node[], specs: NodeSpecs, catalog: CatalogIn
|
|
|
199
284
|
const errors: string[] = [];
|
|
200
285
|
const hasPosition = (spec: { x?: number; y?: number }) => spec.x !== undefined && spec.y !== undefined;
|
|
201
286
|
const centerOf = (spec: { x?: number; y?: number }) => (hasPosition(spec) ? { x: spec.x!, y: spec.y! } : { x: 0, y: 0 });
|
|
287
|
+
// A container at the size asked for, still centred where asked
|
|
288
|
+
const sized = (node: Node, spec: { x?: number; y?: number; width?: number; height?: number }): Node => {
|
|
289
|
+
if (!isGroupType(node.type) || !spec.width || !spec.height) return node;
|
|
290
|
+
const center = centerOf(spec);
|
|
291
|
+
const { width, height } = spec;
|
|
292
|
+
return { ...node, width, height, position: { x: center.x - width / 2, y: center.y - height / 2 } };
|
|
293
|
+
};
|
|
202
294
|
|
|
203
295
|
// Inside a container, at the canvas point asked for (relative to the container)
|
|
204
296
|
const putInside = (node: Node, parent: Node, spec: { x?: number; y?: number }): Node => {
|
|
@@ -222,7 +314,7 @@ export const planNodes = (existing: Node[], specs: NodeSpecs, catalog: CatalogIn
|
|
|
222
314
|
}
|
|
223
315
|
const asContainer = spec.container && canBeContainer(resource);
|
|
224
316
|
const node = asContainer
|
|
225
|
-
? buildContainer(resource, centerOf(spec))
|
|
317
|
+
? sized(buildContainer(resource, centerOf(spec)), spec)
|
|
226
318
|
: buildNode(resource.node.type, catalogNodeData(resource), centerOf(spec));
|
|
227
319
|
built = { node, name: resource.name, resource };
|
|
228
320
|
} else {
|
|
@@ -238,7 +330,7 @@ export const planNodes = (existing: Node[], specs: NodeSpecs, catalog: CatalogIn
|
|
|
238
330
|
...(spec.summary && { summary: spec.summary }),
|
|
239
331
|
...(spec.version && isVersioned(definition.type) && { version: spec.version }),
|
|
240
332
|
});
|
|
241
|
-
const node = buildNode(definition.type, data, centerOf(spec));
|
|
333
|
+
const node = sized(buildNode(definition.type, data, centerOf(spec)), spec);
|
|
242
334
|
built = { node, name: String(getResource(node.type, node.data).name ?? definition.label) };
|
|
243
335
|
}
|
|
244
336
|
|
|
@@ -297,11 +389,44 @@ export const planNodes = (existing: Node[], specs: NodeSpecs, catalog: CatalogIn
|
|
|
297
389
|
};
|
|
298
390
|
|
|
299
391
|
/** Edges given by refs (or ids of nodes already on the canvas), as node ids */
|
|
300
|
-
|
|
301
|
-
|
|
392
|
+
const refIds = (planned: PlannedNode[]) =>
|
|
393
|
+
new Map(planned.flatMap((entry) => (entry.ref ? [[entry.ref, entry.node.id] as const] : [])));
|
|
394
|
+
|
|
395
|
+
export const resolveEdgeRefs = <Spec extends EdgeSpecs[number]>(edges: Spec[], planned: PlannedNode[]) => {
|
|
396
|
+
const refs = refIds(planned);
|
|
302
397
|
return edges.map((edge) => ({ ...edge, from: refs.get(edge.from) ?? edge.from, to: refs.get(edge.to) ?? edge.to }));
|
|
303
398
|
};
|
|
304
399
|
|
|
400
|
+
/**
|
|
401
|
+
* A new canvas's content from nodes and edges given as add_to_canvas takes them. Only the connections asked for
|
|
402
|
+
* are made: related catalog resources aren't connected as well, so the canvas shows just what was asked for (e.g.
|
|
403
|
+
* a diagram's connections, which may go through channels). Says what's wrong if anything can't be followed.
|
|
404
|
+
*/
|
|
405
|
+
export const planCanvas = (
|
|
406
|
+
specs: NodeSpecs,
|
|
407
|
+
edges: NewCanvasEdges,
|
|
408
|
+
catalog: CatalogIndex,
|
|
409
|
+
levels?: DiagramLevelsSpec
|
|
410
|
+
): { content: CanvasContent; errors: string[] } => {
|
|
411
|
+
const { planned, errors } = planNodes([], specs, catalog, edges);
|
|
412
|
+
const ids = new Set(planned.map((entry) => entry.node.id));
|
|
413
|
+
const connections = resolveEdgeRefs(edges, planned);
|
|
414
|
+
for (const end of connections.flatMap((connection) => [connection.from, connection.to])) {
|
|
415
|
+
if (!ids.has(end)) errors.push(`Edges connect nodes by their ref: no node has the ref "${end}"`);
|
|
416
|
+
}
|
|
417
|
+
const refs = refIds(planned);
|
|
418
|
+
const idOf = (ref: string) => refs.get(ref) ?? ref;
|
|
419
|
+
const diagramLevels = levels && {
|
|
420
|
+
...(levels[1] && { 1: toDiagramLevel(levels[1], idOf) }),
|
|
421
|
+
...(levels[2] && { 2: toDiagramLevel(levels[2], idOf) }),
|
|
422
|
+
...(levels.unavailable && { unavailable: levels.unavailable }),
|
|
423
|
+
};
|
|
424
|
+
return {
|
|
425
|
+
content: { nodes: planned.map((entry) => entry.node), connections, ...(diagramLevels && { levels: diagramLevels }) },
|
|
426
|
+
errors: [...new Set(errors)],
|
|
427
|
+
};
|
|
428
|
+
};
|
|
429
|
+
|
|
305
430
|
export type NodeUpdate = { nodeId: string; name?: string; summary?: string; version?: string };
|
|
306
431
|
|
|
307
432
|
/** Renames, re-describes or re-versions a node. Catalog resources keep their catalog name, summary and version. */
|
|
@@ -377,9 +502,9 @@ export const getCatalogConnections = (
|
|
|
377
502
|
};
|
|
378
503
|
|
|
379
504
|
/**
|
|
380
|
-
* A catalog resource centred on a canvas point (inside the container
|
|
381
|
-
* it connects to placed around it like an architect would (what comes in before it, what goes out
|
|
382
|
-
* the connections between them and to what's already on the canvas. A service's data stores go in its container
|
|
505
|
+
* A catalog resource centred on a canvas point (inside the container asked for, else the one there, if any), with
|
|
506
|
+
* the resources it connects to placed around it like an architect would (what comes in before it, what goes out
|
|
507
|
+
* after it), and the connections between them and to what's already on the canvas. A service's data stores go in its container
|
|
383
508
|
* with it. Positions are relative to the containers they're in, as the canvas is now.
|
|
384
509
|
*/
|
|
385
510
|
export const planWithConnections = (
|
|
@@ -387,9 +512,10 @@ export const planWithConnections = (
|
|
|
387
512
|
resource: CatalogResource,
|
|
388
513
|
center: XYPosition,
|
|
389
514
|
include: CatalogResource[],
|
|
390
|
-
catalog: CatalogIndex
|
|
515
|
+
catalog: CatalogIndex,
|
|
516
|
+
inside?: string
|
|
391
517
|
): { nodes: Node[]; edges: Edge[] } => {
|
|
392
|
-
const container =
|
|
518
|
+
const container = containerFor(center, existing, inside);
|
|
393
519
|
const specOf = (entry: CatalogResource) => ({
|
|
394
520
|
resource: { collection: entry.collection as (typeof CATALOG_COLLECTIONS)[number], id: entry.id },
|
|
395
521
|
});
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { Edge, Node } from '@xyflow/react';
|
|
2
|
-
import { getAbsolutePosition, sizeOf } from '
|
|
3
|
-
import { isGroupType } from './node-types';
|
|
2
|
+
import { getAbsolutePosition, sizeOf, isGroupType } from '@eventcatalog/visualiser/studio';
|
|
4
3
|
|
|
5
4
|
/**
|
|
6
5
|
* A canvas drawn small, for lists of canvases: each node as a box where it is on the canvas (containers as outlines
|
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
import type { Edge, Node } from '@xyflow/react';
|
|
2
2
|
import type { CatalogRelation, CatalogResource } from './catalog-resources';
|
|
3
|
-
import { buildNode } from '
|
|
4
|
-
import { createEdge } from './edges';
|
|
5
|
-
import { layoutGraph, withGroupSizes } from './layout';
|
|
6
|
-
import { GROUP_TYPES, isGroupType } from './node-types';
|
|
3
|
+
import { buildNode, createEdge, layoutGraph, withGroupSizes, GROUP_TYPES, isGroupType } from '@eventcatalog/visualiser/studio';
|
|
7
4
|
|
|
8
5
|
/**
|
|
9
6
|
* Catalog resources on a canvas: the node for a resource, its connections to related resources already there,
|
|
@@ -66,16 +63,21 @@ export const canBeContainer = (resource: CatalogResource) =>
|
|
|
66
63
|
export const containerTypeFor = (resource: CatalogResource) =>
|
|
67
64
|
resource.collection === 'domains' ? GROUP_TYPES.domain : GROUP_TYPES.system;
|
|
68
65
|
|
|
69
|
-
/** A container's data: the domain or system it stands for, and where it is in the catalog */
|
|
70
|
-
export const catalogGroupData = (resource: CatalogResource) =>
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
66
|
+
/** A container's data: the domain or system it stands for (an external system marked as one), and where it is in the catalog */
|
|
67
|
+
export const catalogGroupData = (resource: CatalogResource) => {
|
|
68
|
+
const key = resource.collection === 'domains' ? 'domain' : 'system';
|
|
69
|
+
const { scope } = (resource.node.data[key] ?? {}) as { scope?: string };
|
|
70
|
+
return {
|
|
71
|
+
[key]: {
|
|
72
|
+
id: resource.id,
|
|
73
|
+
name: resource.name,
|
|
74
|
+
version: resource.version,
|
|
75
|
+
summary: resource.summary,
|
|
76
|
+
...(scope && { scope }),
|
|
77
|
+
},
|
|
78
|
+
catalog: { key: resource.key, url: resource.url, version: resource.version } satisfies CatalogLink,
|
|
79
|
+
};
|
|
80
|
+
};
|
|
79
81
|
|
|
80
82
|
/** What a domain or system contains in the catalog: a domain's systems and services, a system's services */
|
|
81
83
|
export const getContents = (
|