@flowuent-org/diagramming-core 1.3.10 → 1.4.1
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/.editorconfig +13 -13
- package/.eslintignore +1 -1
- package/.eslintrc.json +35 -35
- package/.prettierignore +3 -3
- package/.prettierrc +3 -3
- package/.vscode/settings.json +6 -6
- package/README.md +95 -95
- package/apps/authentication/tsconfig.app.json +23 -23
- package/apps/authentication/tsconfig.json +21 -21
- package/apps/authentication/tsconfig.spec.json +28 -28
- package/apps/diagramming/.eslintrc.json +18 -18
- package/apps/diagramming/index.html +16 -16
- package/apps/diagramming/project.json +53 -53
- package/apps/diagramming/public/aws-icons/compute/App Runner.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/Application Auto Scaling.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/Batch.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/Bottlerocket.svg +19 -19
- package/apps/diagramming/public/aws-icons/compute/Compute Optimizer.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/EC2 Auto Scaling.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/EC2 Image Builder.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/EC2.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/Elastic Beanstalk.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/Elastic Fabric Adapter.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/Fargate.svg +19 -19
- package/apps/diagramming/public/aws-icons/compute/Genomics CLI.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/Lambda.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/Local Zones.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/NICE DCV.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/NICE EnginFrame.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/Nitro Enclaves.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/Outposts family.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/Outposts rack.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/Outposts servers.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/ParallelCluster.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/Serverless Application Repository.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/SimSpace Weaver.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/Thinkbox Deadline.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/Thinkbox Frost.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/Thinkbox Sequoia.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/Thinkbox Stoke.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/Thinkbox XMesh.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/VMware Cloud on AWS.svg +17 -17
- package/apps/diagramming/public/aws-icons/compute/Wavelength.svg +17 -17
- package/apps/diagramming/public/aws-icons/container/ECS Anywhere.svg +17 -17
- package/apps/diagramming/public/aws-icons/container/EKS Anywhere.svg +17 -17
- package/apps/diagramming/public/aws-icons/container/EKS Cloud.svg +17 -17
- package/apps/diagramming/public/aws-icons/container/EKS Distro.svg +17 -17
- package/apps/diagramming/public/aws-icons/container/Elastic Container Registry.svg +17 -17
- package/apps/diagramming/public/aws-icons/container/Elastic Container Service.svg +17 -17
- package/apps/diagramming/public/aws-icons/container/Elastic Kubernetes Service.svg +17 -17
- package/apps/diagramming/public/aws-icons/container/Fargate.svg +19 -19
- package/apps/diagramming/public/aws-icons/container/Red Hat OpenShift Service on AWS.svg +17 -17
- package/apps/diagramming/public/aws-icons/database/Aurora.svg +17 -17
- package/apps/diagramming/public/aws-icons/database/Database Migration Service.svg +17 -17
- package/apps/diagramming/public/aws-icons/database/DocumentDB.svg +17 -17
- package/apps/diagramming/public/aws-icons/database/ElastiCache.svg +17 -17
- package/apps/diagramming/public/aws-icons/database/Keyspaces.svg +15 -15
- package/apps/diagramming/public/aws-icons/database/MemoryDB for Redis.svg +17 -17
- package/apps/diagramming/public/aws-icons/database/Neptune.svg +17 -17
- package/apps/diagramming/public/aws-icons/database/RDS on VMware.svg +17 -17
- package/apps/diagramming/public/aws-icons/database/RDS.svg +17 -17
- package/apps/diagramming/public/aws-icons/database/Timestream.svg +17 -17
- package/apps/diagramming/public/aws-icons/networking/App Mesh.svg +17 -17
- package/apps/diagramming/public/aws-icons/networking/Client VPN.svg +17 -17
- package/apps/diagramming/public/aws-icons/networking/Cloud Directory.svg +17 -17
- package/apps/diagramming/public/aws-icons/networking/Cloud Map.svg +17 -17
- package/apps/diagramming/public/aws-icons/networking/Cloud WAN.svg +17 -17
- package/apps/diagramming/public/aws-icons/networking/CloudFront.svg +17 -17
- package/apps/diagramming/public/aws-icons/networking/Direct Connect.svg +17 -17
- package/apps/diagramming/public/aws-icons/networking/Elastic Load Balancing.svg +17 -17
- package/apps/diagramming/public/aws-icons/networking/Global Accelerator.svg +17 -17
- package/apps/diagramming/public/aws-icons/networking/Private 5G.svg +17 -17
- package/apps/diagramming/public/aws-icons/networking/PrivateLink.svg +17 -17
- package/apps/diagramming/public/aws-icons/networking/Route 53.svg +17 -17
- package/apps/diagramming/public/aws-icons/networking/Site to Site VPN.svg +17 -17
- package/apps/diagramming/public/aws-icons/networking/Transit Gateway.svg +17 -17
- package/apps/diagramming/public/aws-icons/networking/VPC Lattice.svg +17 -17
- package/apps/diagramming/public/aws-icons/networking/Verified Access.svg +17 -17
- package/apps/diagramming/public/aws-icons/networking/Virtual Private Cloud.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/Artifact.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/Audit Manager.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/Certificate Manager.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/CloudHSM.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/Cognito.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/Detective.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/Directory Service.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/Firewall Manager.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/GuardDuty.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/IAM Identity Center.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/Identity and Access Management.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/Inspector.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/Key Management Service.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/Macie.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/Network Firewall.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/Resource Access Manager.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/Secrets Manager.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/Security Hub.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/Security Lake.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/Shield.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/Signer.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/Verified Permissions.svg +17 -17
- package/apps/diagramming/public/aws-icons/security/WAF.svg +17 -17
- package/apps/diagramming/public/aws-icons/storage/Backup.svg +17 -17
- package/apps/diagramming/public/aws-icons/storage/EFS.svg +17 -17
- package/apps/diagramming/public/aws-icons/storage/Elastic Block Store.svg +17 -17
- package/apps/diagramming/public/aws-icons/storage/Elastic Disaster Recovery.svg +15 -15
- package/apps/diagramming/public/aws-icons/storage/FSx for Lustre.svg +17 -17
- package/apps/diagramming/public/aws-icons/storage/FSx for NetApp ONTAP.svg +17 -17
- package/apps/diagramming/public/aws-icons/storage/FSx for OpenZFS.svg +17 -17
- package/apps/diagramming/public/aws-icons/storage/FSx for WFS.svg +17 -17
- package/apps/diagramming/public/aws-icons/storage/FSx.svg +17 -17
- package/apps/diagramming/public/aws-icons/storage/File Cache.svg +17 -17
- package/apps/diagramming/public/aws-icons/storage/S3 on Outposts.svg +17 -17
- package/apps/diagramming/public/aws-icons/storage/Simple Storage Service Glacier.svg +17 -17
- package/apps/diagramming/public/aws-icons/storage/Simple Storage Service.svg +17 -17
- package/apps/diagramming/public/aws-icons/storage/Snowball Edge.svg +17 -17
- package/apps/diagramming/public/aws-icons/storage/Snowball.svg +17 -17
- package/apps/diagramming/public/aws-icons/storage/Snowcone.svg +17 -17
- package/apps/diagramming/public/aws-icons/storage/Snowmobile.svg +17 -17
- package/apps/diagramming/public/aws-icons/storage/Storage Gateway.svg +17 -17
- package/apps/diagramming/public/azure-icons/compute/02112-icon-service-Automanaged-VM.svg +1 -1
- package/apps/diagramming/public/azure-icons/databases/02390-icon-service-Azure-SQL.svg +1 -1
- package/apps/diagramming/public/azure-icons/databases/02392-icon-service-SSIS-Lift-And-Shift-IR.svg +1 -1
- package/apps/diagramming/public/azure-icons/networking/02145-icon-service-Resource-Management-Private-Link.svg +1 -1
- package/apps/diagramming/public/azure-icons/security/02247-icon-service-Microsoft-Defender-for-IoT.svg +1 -1
- package/apps/diagramming/public/sample-node-complete.json +63 -63
- package/apps/diagramming/public/sample-node-data.json +63 -63
- package/apps/diagramming/src/AutomationDiagramData.ts +147 -480
- package/apps/diagramming/src/CollaborationDiagramData.ts +127 -127
- package/apps/diagramming/src/CustomIconExamples.ts +233 -233
- package/apps/diagramming/src/DiagramTabs.tsx +205 -205
- package/apps/diagramming/src/Pages/DevPlayground.tsx +3 -3
- package/apps/diagramming/src/Pages/Home.tsx +111 -111
- package/apps/diagramming/src/SequenceDiagramData.ts +215 -215
- package/apps/diagramming/src/StateMachineDiagramData.ts +64 -64
- package/apps/diagramming/src/UseCaseDiagramData.ts +52 -52
- package/apps/diagramming/src/cloud-data.ts +371 -371
- package/apps/diagramming/src/components/AddNodeView.tsx +252 -252
- package/apps/diagramming/src/createSelecors.tsx +17 -17
- package/apps/diagramming/src/index.scss +12 -12
- package/apps/diagramming/src/main.tsx +463 -463
- package/apps/diagramming/src/node-data.ts +664 -664
- package/apps/diagramming/src/sample-workflow-content.ts +55 -55
- package/apps/diagramming/src/stencil-items.ts +31 -31
- package/apps/diagramming/src/style.css +13 -13
- package/apps/diagramming/src/tabsStore.tsx +152 -152
- package/apps/diagramming/src/vite-env.d.ts +1 -1
- package/apps/diagramming/tsconfig.app.json +23 -23
- package/apps/diagramming/tsconfig.json +21 -21
- package/apps/diagramming/tsconfig.spec.json +28 -28
- package/apps/diagramming/vite.config.ts +34 -34
- package/apps/diagramming/webpack.config.js +13 -13
- package/apps/workflow/.eslintrc.json +18 -18
- package/apps/workflow/group/group-form-hooks/index.ts +3 -3
- package/apps/workflow/group/group-form-hooks/useFormValidation.ts +20 -20
- package/apps/workflow/group/group-form-schema/SettingsTabFormSchema.ts +7 -7
- package/apps/workflow/group/group-form-schema/index.ts +3 -3
- package/apps/workflow/i18n.ts +19 -19
- package/apps/workflow/index.html +16 -16
- package/apps/workflow/locales/en/translation.json +713 -713
- package/apps/workflow/project.json +8 -8
- package/apps/workflow/src/app/app.module.css +1 -1
- package/apps/workflow/src/app/app.spec.tsx +15 -15
- package/apps/workflow/src/app/app.tsx +370 -370
- package/apps/workflow/src/main.tsx +13 -13
- package/apps/workflow/src/styles.css +1 -1
- package/apps/workflow/src/theme/index.ts +546 -546
- package/apps/workflow/tsconfig.app.json +23 -23
- package/apps/workflow/tsconfig.json +21 -21
- package/apps/workflow/tsconfig.spec.json +28 -28
- package/apps/workflow/vite.config.ts +51 -51
- package/nx.json +58 -58
- package/package.json +1 -1
- package/packages/api/.babelrc +12 -12
- package/packages/api/.eslintrc.json +18 -18
- package/packages/api/README.md +7 -7
- package/packages/api/project.json +8 -8
- package/packages/api/src/index.ts +3 -3
- package/packages/api/src/lib/jsonPlaceholderService/endpoints.ts +3 -3
- package/packages/api/src/lib/jsonPlaceholderService/service.ts +13 -13
- package/packages/api/tsconfig.json +17 -17
- package/packages/api/tsconfig.lib.json +24 -24
- package/packages/atoms/.babelrc +12 -12
- package/packages/atoms/.eslintrc.json +18 -18
- package/packages/atoms/README.md +7 -7
- package/packages/atoms/forms/AuthenticationTabForm/authenticationTabForm.json +224 -224
- package/packages/atoms/forms/AuthenticationTabForm/index.tsx +255 -255
- package/packages/atoms/forms/SettingsTabForm/index.tsx +85 -85
- package/packages/atoms/forms/SettingsTabForm/settingTabForm.json +27 -27
- package/packages/atoms/forms/index.ts +4 -4
- package/packages/atoms/project.json +8 -8
- package/packages/atoms/src/index.ts +33 -33
- package/packages/atoms/src/lib/Accordion/Accordion.module.css +7 -7
- package/packages/atoms/src/lib/Accordion/Accordion.spec.tsx +13 -13
- package/packages/atoms/src/lib/Accordion/Accordion.tsx +29 -29
- package/packages/atoms/src/lib/Alert/Alert.module.css +7 -7
- package/packages/atoms/src/lib/Alert/Alert.spec.tsx +10 -10
- package/packages/atoms/src/lib/Alert/Alert.tsx +19 -19
- package/packages/atoms/src/lib/Avatar/Avatar.module.css +7 -7
- package/packages/atoms/src/lib/Avatar/Avatar.spec.tsx +10 -10
- package/packages/atoms/src/lib/Avatar/Avatar.tsx +22 -22
- package/packages/atoms/src/lib/Box/Box.module.css +7 -7
- package/packages/atoms/src/lib/Box/Box.spec.tsx +10 -10
- package/packages/atoms/src/lib/Box/Box.tsx +19 -19
- package/packages/atoms/src/lib/BulkEdit/BulkEdit.module.css +7 -7
- package/packages/atoms/src/lib/BulkEdit/BulkEdit.spec.tsx +10 -10
- package/packages/atoms/src/lib/BulkEdit/BulkEdit.tsx +15 -15
- package/packages/atoms/src/lib/Button/Button.module.css +7 -7
- package/packages/atoms/src/lib/Button/Button.spec.tsx +10 -10
- package/packages/atoms/src/lib/Button/Button.tsx +78 -78
- package/packages/atoms/src/lib/Card/Card.module.css +7 -7
- package/packages/atoms/src/lib/Card/Card.spec.tsx +10 -10
- package/packages/atoms/src/lib/Card/Card.tsx +19 -19
- package/packages/atoms/src/lib/CardContent/CardContent.module.css +7 -7
- package/packages/atoms/src/lib/CardContent/CardContent.spec.tsx +10 -10
- package/packages/atoms/src/lib/CardContent/CardContent.tsx +22 -22
- package/packages/atoms/src/lib/FormTextField/FormTextField.module.css +7 -7
- package/packages/atoms/src/lib/FormTextField/FormTextField.spec.tsx +10 -10
- package/packages/atoms/src/lib/FormTextField/FormTextField.tsx +35 -35
- package/packages/atoms/src/lib/Grid/Grid.module.css +7 -7
- package/packages/atoms/src/lib/Grid/Grid.spec.tsx +10 -10
- package/packages/atoms/src/lib/Grid/Grid.tsx +19 -19
- package/packages/atoms/src/lib/Stack/Stack.module.css +7 -7
- package/packages/atoms/src/lib/Stack/Stack.spec.tsx +10 -10
- package/packages/atoms/src/lib/Stack/Stack.tsx +19 -19
- package/packages/atoms/src/lib/Switch/Switch.module.css +7 -7
- package/packages/atoms/src/lib/Switch/Switch.spec.tsx +10 -10
- package/packages/atoms/src/lib/Switch/Switch.tsx +46 -46
- package/packages/atoms/src/lib/TableView/TableView.module.css +7 -7
- package/packages/atoms/src/lib/TableView/TableView.spec.tsx +10 -10
- package/packages/atoms/src/lib/TableView/TableView.tsx +88 -88
- package/packages/atoms/src/lib/TextField/TextField.module.css +7 -7
- package/packages/atoms/src/lib/TextField/TextField.spec.tsx +10 -10
- package/packages/atoms/src/lib/TextField/TextField.tsx +17 -17
- package/packages/atoms/src/lib/Typography/Typography.module.css +7 -7
- package/packages/atoms/src/lib/Typography/Typography.spec.tsx +10 -10
- package/packages/atoms/src/lib/Typography/Typography.tsx +22 -22
- package/packages/atoms/tsconfig.json +17 -17
- package/packages/atoms/tsconfig.lib.json +30 -30
- package/packages/common/.babelrc +12 -12
- package/packages/common/.eslintrc.json +18 -18
- package/packages/common/README.md +7 -7
- package/packages/common/project.json +8 -8
- package/packages/common/src/index.ts +4 -4
- package/packages/common/src/lib/generateRandomProfilePic.ts +3 -3
- package/packages/common/src/lib/generateValidationSchema.ts +46 -46
- package/packages/common/tsconfig.json +17 -17
- package/packages/common/tsconfig.lib.json +24 -24
- package/packages/contexts/.babelrc +12 -12
- package/packages/contexts/.eslintrc.json +18 -18
- package/packages/contexts/README.md +7 -7
- package/packages/contexts/project.json +8 -8
- package/packages/contexts/src/index.ts +2 -2
- package/packages/contexts/tsconfig.json +17 -17
- package/packages/contexts/tsconfig.lib.json +24 -24
- package/packages/diagrams/.babelrc +12 -12
- package/packages/diagrams/.ctirc +208 -208
- package/packages/diagrams/.eslintrc.json +17 -17
- package/packages/diagrams/CUSTOM_ICONS.md +232 -232
- package/packages/diagrams/GOOGLE_SHEETS_IMPLEMENTATION.md +233 -233
- package/packages/diagrams/NODE_DATA_UPDATE_API.md +430 -430
- package/packages/diagrams/README.md +7 -7
- package/packages/diagrams/UNDO_REDO_API.md +306 -306
- package/packages/diagrams/locales/en/translation.json +713 -713
- package/packages/diagrams/package.json +27 -27
- package/packages/diagrams/pnpm-lock.yaml +2606 -2606
- package/packages/diagrams/project.json +42 -42
- package/packages/diagrams/rollup.config.js +26 -26
- package/packages/diagrams/src/DiagramFlow.tsx +7 -7
- package/packages/diagrams/src/declarations.d.ts +7 -7
- package/packages/diagrams/src/index.ts +8 -1
- package/packages/diagrams/src/index.ts.bak +99 -99
- package/packages/diagrams/src/lib/assets/markers/markers.param.tsx +101 -101
- package/packages/diagrams/src/lib/assets/markers/markers.type.ts +10 -10
- package/packages/diagrams/src/lib/atoms/ActorNode.tsx +123 -123
- package/packages/diagrams/src/lib/atoms/AddParallelColButton.tsx +26 -26
- package/packages/diagrams/src/lib/atoms/BendpointNode.tsx +71 -71
- package/packages/diagrams/src/lib/atoms/CardBlockTypeSelector.tsx +35 -35
- package/packages/diagrams/src/lib/atoms/CardEditableTitle.tsx +76 -76
- package/packages/diagrams/src/lib/atoms/CardMainContent.tsx +19 -19
- package/packages/diagrams/src/lib/atoms/ConnectionPoints.tsx +149 -149
- package/packages/diagrams/src/lib/atoms/ContentAssist.tsx +341 -341
- package/packages/diagrams/src/lib/atoms/DiagramControls.tsx +56 -56
- package/packages/diagrams/src/lib/atoms/ExpressionInput.tsx +437 -437
- package/packages/diagrams/src/lib/atoms/FloatingConnectionLine.tsx +73 -73
- package/packages/diagrams/src/lib/atoms/LazyIcon.tsx +31 -31
- package/packages/diagrams/src/lib/atoms/MarkerSelector.tsx +106 -106
- package/packages/diagrams/src/lib/atoms/MultiSelectInput.tsx +87 -87
- package/packages/diagrams/src/lib/atoms/ParameterInput.tsx +199 -199
- package/packages/diagrams/src/lib/atoms/PropertyInput.tsx +114 -114
- package/packages/diagrams/src/lib/atoms/StyledBox.tsx +69 -69
- package/packages/diagrams/src/lib/atoms/ValidationError.tsx +37 -37
- package/packages/diagrams/src/lib/atoms/ValidationMessage.tsx +63 -63
- package/packages/diagrams/src/lib/components/AiButton.tsx +52 -52
- package/packages/diagrams/src/lib/components/ControlEdgeList.tsx +303 -303
- package/packages/diagrams/src/lib/components/CreateFunctionModal.tsx +264 -264
- package/packages/diagrams/src/lib/components/CustomCodeModal.tsx +287 -287
- package/packages/diagrams/src/lib/components/DiagramPanel.tsx +331 -331
- package/packages/diagrams/src/lib/components/FunctionModalTooltip.tsx +30 -30
- package/packages/diagrams/src/lib/components/GraphQLCustomCodeModal.tsx +210 -210
- package/packages/diagrams/src/lib/components/Header.tsx +143 -143
- package/packages/diagrams/src/lib/components/MiniMapCommon.tsx +24 -24
- package/packages/diagrams/src/lib/components/ResizeIcon.tsx +81 -81
- package/packages/diagrams/src/lib/components/SideBar.tsx +40 -40
- package/packages/diagrams/src/lib/components/automation/AISuggestionsModal.tsx +269 -269
- package/packages/diagrams/src/lib/components/automation/AISuggestionsPanel.tsx +28 -175
- package/packages/diagrams/src/lib/components/automation/AutomationApiNode.tsx +1 -1
- package/packages/diagrams/src/lib/components/automation/AutomationDecisionNode.tsx +94 -0
- package/packages/diagrams/src/lib/components/automation/AutomationEndNode.tsx +1 -1
- package/packages/diagrams/src/lib/components/automation/AutomationExecutionPanel.tsx +439 -439
- package/packages/diagrams/src/lib/components/automation/AutomationFormattingNode.tsx +1 -1
- package/packages/diagrams/src/lib/components/automation/AutomationInteractionNode.tsx +693 -693
- package/packages/diagrams/src/lib/components/automation/AutomationMonitoringNode.tsx +399 -399
- package/packages/diagrams/src/lib/components/automation/AutomationNavigationNode.tsx +1 -1
- package/packages/diagrams/src/lib/components/automation/AutomationNodeCard.tsx +414 -0
- package/packages/diagrams/src/lib/components/automation/AutomationSlackNode.tsx +694 -694
- package/packages/diagrams/src/lib/components/automation/AutomationSmsNode.tsx +62 -0
- package/packages/diagrams/src/lib/components/automation/AutomationStartNode.tsx +1 -1
- package/packages/diagrams/src/lib/components/automation/AutomationTelegramNode.tsx +664 -664
- package/packages/diagrams/src/lib/components/automation/AutomationVoiceCallNode.tsx +65 -0
- package/packages/diagrams/src/lib/components/automation/AutomationWorkflowNode.tsx +85 -0
- package/packages/diagrams/src/lib/components/automation/NodeAIAssistantPopup.tsx +504 -504
- package/packages/diagrams/src/lib/components/automation/index.ts +29 -19
- package/packages/diagrams/src/lib/components/automation/statusColors.ts +124 -124
- package/packages/diagrams/src/lib/contexts/CardDataProvider.tsx +111 -111
- package/packages/diagrams/src/lib/contexts/DiagramProvider.tsx +392 -391
- package/packages/diagrams/src/lib/contexts/diagramStoreTypes.tsx +134 -134
- package/packages/diagrams/src/lib/contexts/onConnect.ts +39 -39
- package/packages/diagrams/src/lib/contexts/onDragStart.ts +45 -45
- package/packages/diagrams/src/lib/contexts/onNodeDragEnd.ts +179 -179
- package/packages/diagrams/src/lib/contexts/onNodesChange.ts +406 -406
- package/packages/diagrams/src/lib/contexts/onReconnect.ts +59 -59
- package/packages/diagrams/src/lib/contexts/onWorkflowNodeDelete.ts +65 -65
- package/packages/diagrams/src/lib/contexts/setContentHeight.ts +14 -14
- package/packages/diagrams/src/lib/contexts/setDiagramType.ts +10 -10
- package/packages/diagrams/src/lib/contexts/setEdgeShapeType.ts +7 -7
- package/packages/diagrams/src/lib/contexts/setEdges.ts +9 -9
- package/packages/diagrams/src/lib/contexts/setLayoutDirection.ts +9 -9
- package/packages/diagrams/src/lib/contexts/setNodeSetting.ts +17 -17
- package/packages/diagrams/src/lib/contexts/setNodes.ts +10 -10
- package/packages/diagrams/src/lib/contexts/setPannable.ts +7 -7
- package/packages/diagrams/src/lib/contexts/setSelectedEdge.ts +7 -7
- package/packages/diagrams/src/lib/contexts/setSelectedNode.ts +7 -7
- package/packages/diagrams/src/lib/contexts/undo.ts +163 -163
- package/packages/diagrams/src/lib/contexts/updateNodeSetting.ts +17 -17
- package/packages/diagrams/src/lib/examples/TwilioWhatsAppConfigExample.ts +128 -128
- package/packages/diagrams/src/lib/externals.ts +4 -4
- package/packages/diagrams/src/lib/hooks/customUseReactFlow.tsx +90 -90
- package/packages/diagrams/src/lib/hooks/updateNodes.ts +45 -45
- package/packages/diagrams/src/lib/hooks/useAddChildButton.tsx +61 -61
- package/packages/diagrams/src/lib/hooks/useAddSwitchCase.ts +75 -75
- package/packages/diagrams/src/lib/hooks/useAutoRegisterFunctions.ts +135 -135
- package/packages/diagrams/src/lib/hooks/useAutoRegisterVariables.ts +286 -286
- package/packages/diagrams/src/lib/hooks/useDeleteNodeByEvent.ts +64 -64
- package/packages/diagrams/src/lib/hooks/useDragCallbacks.tsx +122 -122
- package/packages/diagrams/src/lib/hooks/useFormValidation.ts +349 -349
- package/packages/diagrams/src/lib/hooks/useFunctionFormCallbacks.ts +136 -136
- package/packages/diagrams/src/lib/hooks/useIsSelectedNode.ts +11 -11
- package/packages/diagrams/src/lib/hooks/useModalControls.ts +13 -13
- package/packages/diagrams/src/lib/hooks/useNodeDragHandlers.ts +43 -43
- package/packages/diagrams/src/lib/hooks/useNodeSelection.ts +55 -55
- package/packages/diagrams/src/lib/hooks/useRenderDividers.tsx +19 -19
- package/packages/diagrams/src/lib/hooks/useRenderPins.tsx +74 -74
- package/packages/diagrams/src/lib/hooks/useResizeObserver.ts +21 -21
- package/packages/diagrams/src/lib/hooks/useTreeChildNode.ts +536 -536
- package/packages/diagrams/src/lib/i18n.ts +42 -42
- package/packages/diagrams/src/lib/icons/icons.tsx +324 -0
- package/packages/diagrams/src/lib/icons/index.ts +29 -0
- package/packages/diagrams/src/lib/icons/types.ts +7 -0
- package/packages/diagrams/src/lib/molecules/AddingBlock.tsx +147 -147
- package/packages/diagrams/src/lib/molecules/AvailableVariablesDisplay.tsx +57 -57
- package/packages/diagrams/src/lib/molecules/Block.tsx +143 -143
- package/packages/diagrams/src/lib/molecules/BlockProvider.tsx +28 -28
- package/packages/diagrams/src/lib/molecules/BlockWrapper.tsx +14 -14
- package/packages/diagrams/src/lib/molecules/ConditionRule.tsx +131 -131
- package/packages/diagrams/src/lib/molecules/DraggablePane.tsx +198 -198
- package/packages/diagrams/src/lib/molecules/EntityNodeBlocks.tsx +66 -66
- package/packages/diagrams/src/lib/molecules/SideHandles.tsx +215 -215
- package/packages/diagrams/src/lib/molecules/StencilItem.tsx +85 -85
- package/packages/diagrams/src/lib/molecules/WorkflowNodeActionButtons.tsx +62 -62
- package/packages/diagrams/src/lib/molecules/animated-add-button.tsx +83 -83
- package/packages/diagrams/src/lib/molecules/json-viewer.tsx +107 -107
- package/packages/diagrams/src/lib/organisms/AddNodeView.tsx +102 -102
- package/packages/diagrams/src/lib/organisms/Card/EntityNode.tsx +259 -259
- package/packages/diagrams/src/lib/organisms/Card/card.params.ts +29 -29
- package/packages/diagrams/src/lib/organisms/Card/card.types.ts +5 -5
- package/packages/diagrams/src/lib/organisms/CodeModal.tsx +105 -105
- package/packages/diagrams/src/lib/organisms/ConditionRuleGroup.tsx +138 -138
- package/packages/diagrams/src/lib/organisms/CustomEdge/EdgeMarkers.tsx +51 -51
- package/packages/diagrams/src/lib/organisms/CustomEdge/custom-edge-generator.tsx +135 -135
- package/packages/diagrams/src/lib/organisms/CustomEdge/custom-edge.params.ts +6 -6
- package/packages/diagrams/src/lib/organisms/CustomEdge/custom-edge.type.ts +15 -15
- package/packages/diagrams/src/lib/organisms/CustomEdge/useCreateBendPoint.tsx +121 -121
- package/packages/diagrams/src/lib/organisms/CustomEdge/useEdgeModal.ts +37 -37
- package/packages/diagrams/src/lib/organisms/CustomEdge/useEdgePath.tsx +99 -99
- package/packages/diagrams/src/lib/organisms/DownloadPanel.tsx +345 -345
- package/packages/diagrams/src/lib/organisms/EdgeModal.tsx +243 -243
- package/packages/diagrams/src/lib/organisms/HistoryPane.tsx +118 -118
- package/packages/diagrams/src/lib/organisms/NodeContextMenu.tsx +259 -259
- package/packages/diagrams/src/lib/organisms/PropertiesPane.tsx +276 -276
- package/packages/diagrams/src/lib/organisms/SmartDynamicForm.tsx +226 -226
- package/packages/diagrams/src/lib/organisms/Stencil.tsx +60 -60
- package/packages/diagrams/src/lib/organisms/UseDiagramStore.tsx +4 -4
- package/packages/diagrams/src/lib/organisms/WorkFlowNode/NodeActionButtons.tsx +45 -45
- package/packages/diagrams/src/lib/organisms/WorkFlowNode/NodeTypeDisplay.tsx +114 -114
- package/packages/diagrams/src/lib/organisms/WorkFlowNode/WorkflowNodeIcons.tsx +21 -23
- package/packages/diagrams/src/lib/organisms/WorkflowNode.tsx +484 -484
- package/packages/diagrams/src/lib/services/GoogleSheetsService.ts +961 -961
- package/packages/diagrams/src/lib/services/SlackService.ts +134 -134
- package/packages/diagrams/src/lib/services/TwilioWhatsAppService.ts +273 -273
- package/packages/diagrams/src/lib/styles.css +55 -55
- package/packages/diagrams/src/lib/templates/PageLinks.tsx +13 -13
- package/packages/diagrams/src/lib/templates/arch/ArchDiagram.tsx +793 -793
- package/packages/diagrams/src/lib/templates/arch/components/EdgeDialog.tsx +82 -82
- package/packages/diagrams/src/lib/templates/arch/components/EdgeSettings.tsx +81 -81
- package/packages/diagrams/src/lib/templates/arch/components/GroupControls.tsx +59 -59
- package/packages/diagrams/src/lib/templates/arch/components/GroupSizeDialog.tsx +81 -81
- package/packages/diagrams/src/lib/templates/arch/components/NodeDialog.tsx +214 -214
- package/packages/diagrams/src/lib/templates/arch/components/nodeTypes.ts +91 -91
- package/packages/diagrams/src/lib/templates/arch/controls/ArchDiagramControls.tsx +349 -349
- package/packages/diagrams/src/lib/templates/arch/data/templatee-data.ts +212 -212
- package/packages/diagrams/src/lib/templates/cloud-arch/components/CloudArchitectureDiagram.tsx +3912 -3912
- package/packages/diagrams/src/lib/templates/cloud-arch/components/FormatConverter.tsx +809 -809
- package/packages/diagrams/src/lib/templates/cloud-arch/components/FragmentImporter.tsx +276 -276
- package/packages/diagrams/src/lib/templates/cloud-arch/components/PropertiesPanel.tsx +1063 -1063
- package/packages/diagrams/src/lib/templates/cloud-arch/components/ServiceIconPicker.tsx +138 -138
- package/packages/diagrams/src/lib/templates/cloud-arch/components/SettingsSidebar.tsx +656 -656
- package/packages/diagrams/src/lib/templates/cloud-arch/components/SubnetSelector.tsx +468 -468
- package/packages/diagrams/src/lib/templates/cloud-arch/components/nodes/ServiceNode.tsx +310 -310
- package/packages/diagrams/src/lib/templates/cloud-arch/components/nodes/SubnetNode.tsx +475 -475
- package/packages/diagrams/src/lib/templates/cloud-arch/components/nodes/UsersNode.tsx +277 -277
- package/packages/diagrams/src/lib/templates/cloud-arch/data/diagramManager.ts +364 -364
- package/packages/diagrams/src/lib/templates/cloud-arch/data/types.ts +183 -183
- package/packages/diagrams/src/lib/templates/cloud-arch/integration/diagramValidator.ts +379 -379
- package/packages/diagrams/src/lib/templates/cloud-arch/messages/errorMessages.json +95 -95
- package/packages/diagrams/src/lib/templates/cloud-arch/types/localization.ts +368 -368
- package/packages/diagrams/src/lib/templates/cloud-arch/types/validation.ts +72 -72
- package/packages/diagrams/src/lib/templates/cloud-arch/utils/aws-icons.ts +557 -557
- package/packages/diagrams/src/lib/templates/cloud-arch/utils/awsValidation.ts +446 -446
- package/packages/diagrams/src/lib/templates/cloud-arch/utils/azure-icons.ts +802 -802
- package/packages/diagrams/src/lib/templates/cloud-arch/utils/azureValidation.ts +495 -495
- package/packages/diagrams/src/lib/templates/cloud-arch/utils/cloudValidation.ts +929 -929
- package/packages/diagrams/src/lib/templates/cloud-arch/utils/errorMessages.ts +283 -283
- package/packages/diagrams/src/lib/templates/cloud-arch/utils/gcp-icons.ts +186 -186
- package/packages/diagrams/src/lib/templates/cloud-arch/utils/gcpValidation.ts +312 -312
- package/packages/diagrams/src/lib/templates/cloud-arch/utils/genericValidation.ts +689 -689
- package/packages/diagrams/src/lib/templates/cloud-arch/utils/iconMapping.ts +383 -383
- package/packages/diagrams/src/lib/templates/cloud-arch/utils/idGenerator.ts +220 -220
- package/packages/diagrams/src/lib/templates/cloud-arch/utils/localizationManager.ts +300 -300
- package/packages/diagrams/src/lib/templates/cloud-arch/utils/restrictionEngine.ts +550 -550
- package/packages/diagrams/src/lib/templates/cloud-arch/utils/restrictionValidator.ts +400 -400
- package/packages/diagrams/src/lib/templates/cloud-arch/utils/serviceIcons.tsx +129 -129
- package/packages/diagrams/src/lib/templates/cloud-arch/utils/serviceMapping.ts +330 -330
- package/packages/diagrams/src/lib/templates/cloud-arch/utils/translations.ts +54 -54
- package/packages/diagrams/src/lib/templates/cloud-arch/utils/validationExtractor.ts +342 -342
- package/packages/diagrams/src/lib/templates/collaborationDiagram/CollaborationDiagram.tsx +15 -15
- package/packages/diagrams/src/lib/templates/collaborationDiagram/components/AddCollabEdgeDialog.tsx +181 -181
- package/packages/diagrams/src/lib/templates/collaborationDiagram/components/CollabLayout.ts +182 -182
- package/packages/diagrams/src/lib/templates/collaborationDiagram/components/CollabObjectNodeSettings.tsx +86 -86
- package/packages/diagrams/src/lib/templates/collaborationDiagram/components/CollaborationDiagramFlow.tsx +731 -731
- package/packages/diagrams/src/lib/templates/collaborationDiagram/components/DraggableEdgeLabel.tsx +123 -123
- package/packages/diagrams/src/lib/templates/collaborationDiagram/controls/CollaborationControls.tsx +131 -131
- package/packages/diagrams/src/lib/templates/collaborationDiagram/nodes/CollabEdge.tsx +170 -170
- package/packages/diagrams/src/lib/templates/collaborationDiagram/nodes/CollabObjectNode.tsx +178 -178
- package/packages/diagrams/src/lib/templates/home.style.css +16 -16
- package/packages/diagrams/src/lib/templates/node-forms/ApiForm.tsx +416 -416
- package/packages/diagrams/src/lib/templates/node-forms/CallForm.tsx +370 -370
- package/packages/diagrams/src/lib/templates/node-forms/ForLoopNode.tsx +313 -313
- package/packages/diagrams/src/lib/templates/node-forms/FunctionForm.tsx +211 -211
- package/packages/diagrams/src/lib/templates/node-forms/GraphQLForm.tsx +679 -679
- package/packages/diagrams/src/lib/templates/node-forms/IfNodeForm.tsx +97 -97
- package/packages/diagrams/src/lib/templates/node-forms/LetNodeForm.tsx +533 -533
- package/packages/diagrams/src/lib/templates/node-forms/LoopNode.tsx +149 -149
- package/packages/diagrams/src/lib/templates/node-forms/NodeForm.tsx +383 -383
- package/packages/diagrams/src/lib/templates/node-forms/ReturnNodeForm.tsx +96 -96
- package/packages/diagrams/src/lib/templates/node-forms/SetNodeForm.tsx +141 -141
- package/packages/diagrams/src/lib/templates/node-forms/SwitchNodeForm.tsx +249 -249
- package/packages/diagrams/src/lib/templates/node-forms/TryCatchForm.tsx +167 -167
- package/packages/diagrams/src/lib/templates/nodeFormSchema.json +84 -84
- package/packages/diagrams/src/lib/templates/sequence/SequenceDiagram.tsx +22 -22
- package/packages/diagrams/src/lib/templates/sequence/components/ActivationBarNode.tsx +33 -33
- package/packages/diagrams/src/lib/templates/sequence/components/AddMessageDialog.tsx +302 -302
- package/packages/diagrams/src/lib/templates/sequence/components/CombinedFragmentNode.tsx +65 -65
- package/packages/diagrams/src/lib/templates/sequence/components/EntitySettings.tsx +559 -559
- package/packages/diagrams/src/lib/templates/sequence/components/FragmentSettings.tsx +116 -116
- package/packages/diagrams/src/lib/templates/sequence/components/SequenceComponents.tsx +14 -14
- package/packages/diagrams/src/lib/templates/sequence/components/SequenceDiagramFlow.tsx +1361 -1361
- package/packages/diagrams/src/lib/templates/sequence/components/SequenceEntityNode.tsx +394 -394
- package/packages/diagrams/src/lib/templates/sequence/components/SequenceMessageEdge.tsx +272 -272
- package/packages/diagrams/src/lib/templates/sequence/components/SimpleEntitySettings.tsx +89 -89
- package/packages/diagrams/src/lib/templates/sequence/controls/DiagramControls.tsx +707 -707
- package/packages/diagrams/src/lib/templates/sequence/data/template-data.ts +635 -635
- package/packages/diagrams/src/lib/templates/stateMachine/StateMachineDiagram.tsx +66 -66
- package/packages/diagrams/src/lib/templates/stateMachine/components/CompositeStateNodeSettings.tsx +638 -638
- package/packages/diagrams/src/lib/templates/stateMachine/components/CustomEdge.tsx +220 -220
- package/packages/diagrams/src/lib/templates/stateMachine/components/EdgeSettings.tsx +193 -193
- package/packages/diagrams/src/lib/templates/stateMachine/components/SelfConnectingEdge.tsx +41 -41
- package/packages/diagrams/src/lib/templates/stateMachine/components/StateMachineComponents.tsx +49 -49
- package/packages/diagrams/src/lib/templates/stateMachine/components/StateMachineDiagramFlow.tsx +1238 -1238
- package/packages/diagrams/src/lib/templates/stateMachine/components/StateMachineLayout.ts +350 -350
- package/packages/diagrams/src/lib/templates/stateMachine/components/StateNodeSettings.tsx +188 -188
- package/packages/diagrams/src/lib/templates/stateMachine/components/useSelfTransition.ts +114 -114
- package/packages/diagrams/src/lib/templates/stateMachine/controls/StateDiagramControls.tsx +488 -488
- package/packages/diagrams/src/lib/templates/stateMachine/data/template-data.ts +4 -4
- package/packages/diagrams/src/lib/templates/stateMachine/nodes/ChoicePointNode.tsx +54 -54
- package/packages/diagrams/src/lib/templates/stateMachine/nodes/CompositeStateNode.tsx +225 -225
- package/packages/diagrams/src/lib/templates/stateMachine/nodes/EntryPointNode.tsx +31 -31
- package/packages/diagrams/src/lib/templates/stateMachine/nodes/ExitPointNode.tsx +44 -44
- package/packages/diagrams/src/lib/templates/stateMachine/nodes/FinalStateNode.tsx +41 -41
- package/packages/diagrams/src/lib/templates/stateMachine/nodes/ForkJoinNode.tsx +53 -53
- package/packages/diagrams/src/lib/templates/stateMachine/nodes/HistoryStateNode.tsx +36 -36
- package/packages/diagrams/src/lib/templates/stateMachine/nodes/InitialStateNode.tsx +29 -29
- package/packages/diagrams/src/lib/templates/stateMachine/nodes/JunctionPointNode.tsx +33 -33
- package/packages/diagrams/src/lib/templates/stateMachine/nodes/PinPointNode.tsx +111 -111
- package/packages/diagrams/src/lib/templates/stateMachine/nodes/StateNode.tsx +124 -124
- package/packages/diagrams/src/lib/templates/stateMachine/nodes/bendPoint.tsx +71 -71
- package/packages/diagrams/src/lib/templates/systemFlow/SystemFlowDiagram.tsx +67 -67
- package/packages/diagrams/src/lib/templates/systemFlow/components/EdgeSettings.tsx +330 -330
- package/packages/diagrams/src/lib/templates/systemFlow/components/FloatingEdge.tsx +219 -219
- package/packages/diagrams/src/lib/templates/systemFlow/components/SystemFlowComponents.tsx +28 -28
- package/packages/diagrams/src/lib/templates/systemFlow/components/SystemFlowDiagramFlow.tsx +1179 -1179
- package/packages/diagrams/src/lib/templates/systemFlow/components/SystemFlowNodeSettings.tsx +151 -151
- package/packages/diagrams/src/lib/templates/systemFlow/controls/SystemFlowControls.tsx +435 -435
- package/packages/diagrams/src/lib/templates/systemFlow/data/template-data.ts +308 -308
- package/packages/diagrams/src/lib/templates/systemFlow/demo.tsx +91 -91
- package/packages/diagrams/src/lib/templates/systemFlow/index.ts +5 -5
- package/packages/diagrams/src/lib/templates/systemFlow/nodes/BendpointNode.tsx +80 -80
- package/packages/diagrams/src/lib/templates/systemFlow/nodes/SystemNode.tsx +92 -92
- package/packages/diagrams/src/lib/templates/systemFlow/nodes/TreeSystemNode.tsx +755 -755
- package/packages/diagrams/src/lib/templates/useCaseDiagram/UseCaseDiagram.tsx +16 -16
- package/packages/diagrams/src/lib/templates/useCaseDiagram/components/ActorNodeSettings.tsx +103 -103
- package/packages/diagrams/src/lib/templates/useCaseDiagram/components/AddRelationshipDialog.tsx +186 -186
- package/packages/diagrams/src/lib/templates/useCaseDiagram/components/PackageNodeSettings.tsx +205 -205
- package/packages/diagrams/src/lib/templates/useCaseDiagram/components/UseCaseDiagramFlow.tsx +637 -637
- package/packages/diagrams/src/lib/templates/useCaseDiagram/components/UseCaseNodeSettings.tsx +120 -120
- package/packages/diagrams/src/lib/templates/useCaseDiagram/controls/UseCaseControls.tsx +289 -289
- package/packages/diagrams/src/lib/templates/useCaseDiagram/nodes/PackageNode.tsx +83 -83
- package/packages/diagrams/src/lib/templates/useCaseDiagram/nodes/UseCaseEdge.tsx +115 -115
- package/packages/diagrams/src/lib/templates/useCaseDiagram/nodes/UseCaseNode.tsx +230 -230
- package/packages/diagrams/src/lib/templates/validationSchema.json +277 -277
- package/packages/diagrams/src/lib/theme.ts +439 -439
- package/packages/diagrams/src/lib/types/FunctionSignature.ts +11 -11
- package/packages/diagrams/src/lib/types/SmartDynamicFormField.ts +37 -37
- package/packages/diagrams/src/lib/types/automation-node-data-types.ts +45 -131
- package/packages/diagrams/src/lib/types/available-variables.ts +18 -18
- package/packages/diagrams/src/lib/types/card-node.ts +68 -68
- package/packages/diagrams/src/lib/types/collaboration-types.ts +114 -114
- package/packages/diagrams/src/lib/types/colors.ts +25 -25
- package/packages/diagrams/src/lib/types/condition-builder.ts +18 -18
- package/packages/diagrams/src/lib/types/diagram-types.ts +14 -14
- package/packages/diagrams/src/lib/types/edge-types.ts +39 -39
- package/packages/diagrams/src/lib/types/function-execution.ts +35 -35
- package/packages/diagrams/src/lib/types/hooks.types.ts +6 -6
- package/packages/diagrams/src/lib/types/ndoe-form-types.ts +139 -139
- package/packages/diagrams/src/lib/types/node-types.ts +13 -23
- package/packages/diagrams/src/lib/types/sequence-types.ts +178 -178
- package/packages/diagrams/src/lib/types/shared-node-types.ts +21 -21
- package/packages/diagrams/src/lib/types/state-machine-types.ts +225 -225
- package/packages/diagrams/src/lib/types/stencil-item.ts +7 -7
- package/packages/diagrams/src/lib/types/structures.ts +80 -80
- package/packages/diagrams/src/lib/types/system-flow-types.ts +129 -129
- package/packages/diagrams/src/lib/types/usecase-types.ts +84 -84
- package/packages/diagrams/src/lib/types/validation-types.ts +134 -134
- package/packages/diagrams/src/lib/types/workflow-content-dynamic-form-type.ts +23 -23
- package/packages/diagrams/src/lib/types/workflow-node-data-types.ts +172 -172
- package/packages/diagrams/src/lib/utils/AutomationExecutionEngine.ts +658 -1179
- package/packages/diagrams/src/lib/utils/add-new-block.ts +34 -34
- package/packages/diagrams/src/lib/utils/add-new-node.ts +52 -52
- package/packages/diagrams/src/lib/utils/addToHistory.ts +15 -15
- package/packages/diagrams/src/lib/utils/automation-flow-processor.ts +556 -619
- package/packages/diagrams/src/lib/utils/closestPoint.ts +45 -45
- package/packages/diagrams/src/lib/utils/color-options.tsx +26 -26
- package/packages/diagrams/src/lib/utils/compress-img.ts +59 -59
- package/packages/diagrams/src/lib/utils/configLoader.ts +329 -329
- package/packages/diagrams/src/lib/utils/constant-lengths.ts +8 -8
- package/packages/diagrams/src/lib/utils/create-updated.tsx +40 -40
- package/packages/diagrams/src/lib/utils/createHistoryChange.ts +3 -3
- package/packages/diagrams/src/lib/utils/dividerUtils.tsx +59 -59
- package/packages/diagrams/src/lib/utils/edge-hooks.ts +53 -53
- package/packages/diagrams/src/lib/utils/elkLayout.ts +297 -297
- package/packages/diagrams/src/lib/utils/event-hooks.ts +69 -69
- package/packages/diagrams/src/lib/utils/event-store.ts +58 -58
- package/packages/diagrams/src/lib/utils/flow-node-hooks.ts +28 -28
- package/packages/diagrams/src/lib/utils/flow-to-js.ts +1465 -1465
- package/packages/diagrams/src/lib/utils/functionGenerator.ts +38 -38
- package/packages/diagrams/src/lib/utils/generateEdgesFromNodeOrder.ts +113 -113
- package/packages/diagrams/src/lib/utils/helpers.types.ts +10 -10
- package/packages/diagrams/src/lib/utils/highlightText.tsx +93 -93
- package/packages/diagrams/src/lib/utils/iconMapper.tsx +76 -76
- package/packages/diagrams/src/lib/utils/logger.ts +5 -5
- package/packages/diagrams/src/lib/utils/model-hooks.ts +129 -129
- package/packages/diagrams/src/lib/utils/node-hooks.ts +78 -78
- package/packages/diagrams/src/lib/utils/nodeAIAssistantConfig.ts +54 -54
- package/packages/diagrams/src/lib/utils/nodeOrderByEdges.ts +437 -437
- package/packages/diagrams/src/lib/utils/nodeutils.ts +242 -242
- package/packages/diagrams/src/lib/utils/object.ts +13 -13
- package/packages/diagrams/src/lib/utils/useDebounce.ts +19 -19
- package/packages/diagrams/src/lib/utils/utilities.ts +105 -105
- package/packages/diagrams/src/lib/utils/validationEngine.ts +610 -610
- package/packages/diagrams/src/lib/utils/vhToPixels.ts +9 -9
- package/packages/diagrams/tsconfig.json +21 -21
- package/packages/diagrams/tsconfig.lib.json +26 -25
- package/packages/diagrams/webpack.config.js +17 -17
- package/packages/interfaces/.babelrc +12 -12
- package/packages/interfaces/.eslintrc.json +18 -18
- package/packages/interfaces/README.md +7 -7
- package/packages/interfaces/project.json +8 -8
- package/packages/interfaces/src/index.ts +21 -21
- package/packages/interfaces/src/lib/Button.tsx +1 -1
- package/packages/interfaces/src/lib/DataGrid.ts +14 -14
- package/packages/interfaces/src/lib/StyledBox.tsx +1 -1
- package/packages/interfaces/src/lib/ToolbarItem.ts +7 -7
- package/packages/interfaces/src/lib/UserCard.ts +8 -8
- package/packages/interfaces/src/lib/yup.ts +3 -3
- package/packages/interfaces/tsconfig.json +17 -17
- package/packages/interfaces/tsconfig.lib.json +24 -24
- package/packages/molecules/.babelrc +12 -12
- package/packages/molecules/.eslintrc.json +18 -18
- package/packages/molecules/README.md +7 -7
- package/packages/molecules/project.json +8 -8
- package/packages/molecules/src/index.ts +47 -41
- package/packages/molecules/src/lib/ActionTextField/ActionTextField.module.css +7 -7
- package/packages/molecules/src/lib/ActionTextField/ActionTextField.spec.tsx +10 -10
- package/packages/molecules/src/lib/ActionTextField/ActionTextField.tsx +33 -33
- package/packages/molecules/src/lib/ClosableButton/CloseableButton.module.css +7 -7
- package/packages/molecules/src/lib/ClosableButton/CloseableButton.spec.tsx +11 -11
- package/packages/molecules/src/lib/ClosableButton/CloseableButton.tsx +69 -69
- package/packages/molecules/src/lib/EditorTab/EditorTab.module.css +7 -7
- package/packages/molecules/src/lib/EditorTab/EditorTab.spec.tsx +10 -10
- package/packages/molecules/src/lib/EditorTab/EditorTab.tsx +42 -42
- package/packages/molecules/src/lib/EditorTab/TabPanel.tsx +25 -25
- package/packages/molecules/src/lib/ParamsActionField/ParamsActionField.module.css +7 -7
- package/packages/molecules/src/lib/ParamsActionField/ParamsActionField.spec.tsx +10 -10
- package/packages/molecules/src/lib/ParamsActionField/ParamsActionField.tsx +24 -24
- package/packages/molecules/src/lib/SvgIcons/icons.tsx +323 -291
- package/packages/molecules/src/lib/SvgIcons/index.ts +31 -25
- package/packages/molecules/src/lib/SvgIcons/types.ts +7 -7
- package/packages/molecules/src/lib/TableWithInlineView/TableWithInlineView.module.css +7 -7
- package/packages/molecules/src/lib/TableWithInlineView/TableWithInlineView.spec.tsx +10 -10
- package/packages/molecules/src/lib/TableWithInlineView/TableWithInlineView.tsx +47 -47
- package/packages/molecules/src/lib/UserCard/UserCard.module.css +7 -7
- package/packages/molecules/src/lib/UserCard/UserCard.spec.tsx +11 -11
- package/packages/molecules/src/lib/UserCard/UserCard.tsx +22 -22
- package/packages/molecules/src/lib/VerbSelection/HTTPVerbSelection.module.css +7 -7
- package/packages/molecules/src/lib/VerbSelection/HTTPVerbSelection.spec.tsx +10 -10
- package/packages/molecules/src/lib/VerbSelection/HTTPVerbSelection.tsx +72 -72
- package/packages/molecules/tsconfig.json +17 -17
- package/packages/molecules/tsconfig.lib.json +30 -30
- package/packages/organisms/.babelrc +12 -12
- package/packages/organisms/.eslintrc.json +18 -18
- package/packages/organisms/README.md +7 -7
- package/packages/organisms/project.json +8 -8
- package/packages/organisms/src/index.ts +4 -4
- package/packages/organisms/src/lib/EditorToolbar/EditorToolbar.module.css +7 -7
- package/packages/organisms/src/lib/EditorToolbar/EditorToolbar.spec.tsx +10 -10
- package/packages/organisms/src/lib/EditorToolbar/EditorToolbar.tsx +117 -117
- package/packages/organisms/src/lib/EditorToolbar/SortableItem.tsx +51 -51
- package/packages/organisms/src/lib/UserList/UserList.module.css +7 -7
- package/packages/organisms/src/lib/UserList/UserList.spec.tsx +11 -11
- package/packages/organisms/src/lib/UserList/UserList.tsx +48 -48
- package/packages/organisms/src/lib/UserList/store.ts +49 -49
- package/packages/organisms/tsconfig.json +17 -17
- package/packages/organisms/tsconfig.lib.json +24 -24
- package/packages/zustand/.babelrc +12 -12
- package/packages/zustand/.eslintrc.json +18 -18
- package/packages/zustand/README.md +7 -7
- package/packages/zustand/project.json +8 -8
- package/packages/zustand/src/index.ts +4 -4
- package/packages/zustand/tsconfig.json +17 -17
- package/packages/zustand/tsconfig.lib.json +24 -24
- package/tsconfig.base.json +29 -29
- package/packages/diagrams/src/lib/components/automation/AutomationAISuggestionNode.tsx +0 -304
- package/packages/diagrams/src/lib/components/automation/AutomationEmailNode.tsx +0 -773
- package/packages/diagrams/src/lib/components/automation/AutomationGoogleServicesNode.tsx +0 -779
- package/packages/diagrams/src/lib/components/automation/AutomationNoteNode.tsx +0 -422
- package/packages/diagrams/src/lib/components/automation/AutomationSheetsNode.tsx +0 -1135
- package/packages/diagrams/src/lib/examples/GoogleSheetsConfigurationExamples.ts +0 -306
|
@@ -1,447 +1,447 @@
|
|
|
1
|
-
import { Node } from 'reactflow';
|
|
2
|
-
import { getTranslatedMessage, getCloudProviderMessageId, formatPlacementRules } from './translations';
|
|
3
|
-
import {
|
|
4
|
-
AWS_CATEGORIES,
|
|
5
|
-
AWS_COMPUTE_ICONS,
|
|
6
|
-
AWS_STORAGE_ICONS,
|
|
7
|
-
AWS_DATABASE_ICONS,
|
|
8
|
-
AWS_NETWORKING_ICONS,
|
|
9
|
-
AWS_SECURITY_ICONS,
|
|
10
|
-
AWS_CONTAINER_ICONS
|
|
11
|
-
} from './aws-icons';
|
|
12
|
-
|
|
13
|
-
// Define types for validation results
|
|
14
|
-
interface ValidationResult {
|
|
15
|
-
isValid: boolean;
|
|
16
|
-
message?: string;
|
|
17
|
-
suggestions?: string[];
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
type AWSResourceType =
|
|
21
|
-
// Container types
|
|
22
|
-
| 'account'
|
|
23
|
-
| 'vpc'
|
|
24
|
-
| 'subnet'
|
|
25
|
-
| 'availability-zone'
|
|
26
|
-
| 'local-zone'
|
|
27
|
-
// Service categories
|
|
28
|
-
| 'compute'
|
|
29
|
-
| 'storage'
|
|
30
|
-
| 'database'
|
|
31
|
-
| 'networking'
|
|
32
|
-
| 'security'
|
|
33
|
-
| 'containers'
|
|
34
|
-
| 'serverless';
|
|
35
|
-
|
|
36
|
-
// Define container rules with detailed descriptions
|
|
37
|
-
const containerRules: Record<string, {
|
|
38
|
-
canContain: string[];
|
|
39
|
-
cannotContain: string[];
|
|
40
|
-
description: string;
|
|
41
|
-
placementRules: string[];
|
|
42
|
-
}> = {
|
|
43
|
-
account: {
|
|
44
|
-
canContain: [
|
|
45
|
-
'vpc',
|
|
46
|
-
'availability-zone',
|
|
47
|
-
'local-zone',
|
|
48
|
-
'storage',
|
|
49
|
-
'serverless',
|
|
50
|
-
'security',
|
|
51
|
-
'networking'
|
|
52
|
-
],
|
|
53
|
-
cannotContain: ['account'],
|
|
54
|
-
description: 'AWS Account is the root container for all resources',
|
|
55
|
-
placementRules: [
|
|
56
|
-
'Must be at the root level',
|
|
57
|
-
'Can contain VPCs and global services',
|
|
58
|
-
'Cannot contain other Accounts',
|
|
59
|
-
'Global services should be at Account level',
|
|
60
|
-
'Region-specific services should be in appropriate regions'
|
|
61
|
-
]
|
|
62
|
-
},
|
|
63
|
-
vpc: {
|
|
64
|
-
canContain: [
|
|
65
|
-
'subnet',
|
|
66
|
-
'availability-zone',
|
|
67
|
-
'local-zone',
|
|
68
|
-
'networking',
|
|
69
|
-
'security',
|
|
70
|
-
'compute'
|
|
71
|
-
],
|
|
72
|
-
cannotContain: ['vpc', 'storage', 'serverless'],
|
|
73
|
-
description: 'VPC is an isolated network in AWS',
|
|
74
|
-
placementRules: [
|
|
75
|
-
'Must be placed within an Account',
|
|
76
|
-
'Can contain Subnets and networking resources',
|
|
77
|
-
'Cannot contain global services',
|
|
78
|
-
'Cannot contain other VPCs',
|
|
79
|
-
'Must be in a single region'
|
|
80
|
-
]
|
|
81
|
-
},
|
|
82
|
-
subnet: {
|
|
83
|
-
canContain: [
|
|
84
|
-
'compute',
|
|
85
|
-
'database',
|
|
86
|
-
'containers',
|
|
87
|
-
'networking'
|
|
88
|
-
],
|
|
89
|
-
cannotContain: ['subnet', 'vpc', 'storage', 'serverless'],
|
|
90
|
-
description: 'Subnet is a range of IP addresses in a VPC',
|
|
91
|
-
placementRules: [
|
|
92
|
-
'Must be placed within a VPC',
|
|
93
|
-
'Can contain compute resources',
|
|
94
|
-
'Can contain database instances',
|
|
95
|
-
'Cannot contain global services',
|
|
96
|
-
'Must be in a single Availability Zone'
|
|
97
|
-
]
|
|
98
|
-
},
|
|
99
|
-
'availability-zone': {
|
|
100
|
-
canContain: [
|
|
101
|
-
'subnet',
|
|
102
|
-
'compute',
|
|
103
|
-
'database',
|
|
104
|
-
'containers'
|
|
105
|
-
],
|
|
106
|
-
cannotContain: ['availability-zone', 'local-zone', 'vpc', 'storage', 'serverless'],
|
|
107
|
-
description: 'Availability Zone is a distinct location within a region',
|
|
108
|
-
placementRules: [
|
|
109
|
-
'Must be placed within a VPC or Account',
|
|
110
|
-
'Can contain Subnets and compute resources',
|
|
111
|
-
'Cannot contain other Availability Zones',
|
|
112
|
-
'Resources within must be in the same AZ'
|
|
113
|
-
]
|
|
114
|
-
},
|
|
115
|
-
'local-zone': {
|
|
116
|
-
canContain: [
|
|
117
|
-
'subnet',
|
|
118
|
-
'compute',
|
|
119
|
-
'database',
|
|
120
|
-
'containers'
|
|
121
|
-
],
|
|
122
|
-
cannotContain: ['local-zone', 'availability-zone', 'vpc', 'storage', 'serverless'],
|
|
123
|
-
description: 'Local Zone brings AWS services closer to end users',
|
|
124
|
-
placementRules: [
|
|
125
|
-
'Must be placed within a VPC or Account',
|
|
126
|
-
'Can contain Subnets and compute resources',
|
|
127
|
-
'Cannot contain other Local Zones',
|
|
128
|
-
'Provides low-latency access to applications'
|
|
129
|
-
]
|
|
130
|
-
}
|
|
131
|
-
};
|
|
132
|
-
|
|
133
|
-
// Helper function to get resource category from service name
|
|
134
|
-
function getAWSResourceCategory(service: string): string | null {
|
|
135
|
-
// Check in each category's icons
|
|
136
|
-
|
|
137
|
-
// Check compute services
|
|
138
|
-
if (service in AWS_COMPUTE_ICONS) {
|
|
139
|
-
return AWS_COMPUTE_ICONS[service as keyof typeof AWS_COMPUTE_ICONS].category;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
// Check storage services
|
|
143
|
-
if (service in AWS_STORAGE_ICONS) {
|
|
144
|
-
return AWS_STORAGE_ICONS[service as keyof typeof AWS_STORAGE_ICONS].category;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
// Check database services
|
|
148
|
-
if (service in AWS_DATABASE_ICONS) {
|
|
149
|
-
return AWS_DATABASE_ICONS[service as keyof typeof AWS_DATABASE_ICONS].category;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
// Check networking services
|
|
153
|
-
if (service in AWS_NETWORKING_ICONS) {
|
|
154
|
-
return AWS_NETWORKING_ICONS[service as keyof typeof AWS_NETWORKING_ICONS].category;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
// Check security services
|
|
158
|
-
if (service in AWS_SECURITY_ICONS) {
|
|
159
|
-
return AWS_SECURITY_ICONS[service as keyof typeof AWS_SECURITY_ICONS].category;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
// Check container services
|
|
163
|
-
if (service in AWS_CONTAINER_ICONS) {
|
|
164
|
-
return AWS_CONTAINER_ICONS[service as keyof typeof AWS_CONTAINER_ICONS].category;
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
// If not found in any category, return null (will be handled gracefully)
|
|
168
|
-
return null;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
// Helper function to get resource type from node
|
|
172
|
-
function getAWSResourceType(node: Node): AWSResourceType | null {
|
|
173
|
-
if (!node.data?.service) return null;
|
|
174
|
-
|
|
175
|
-
const service = node.data.service;
|
|
176
|
-
|
|
177
|
-
// Container types
|
|
178
|
-
if (service === 'account' || service === 'aws-account') return 'account';
|
|
179
|
-
if (service === 'vpc') return 'vpc';
|
|
180
|
-
if (service === 'subnet') return 'subnet';
|
|
181
|
-
if (service === 'availability-zone') return 'availability-zone';
|
|
182
|
-
if (service === 'local-zone') return 'local-zone';
|
|
183
|
-
|
|
184
|
-
// Map service to its category type
|
|
185
|
-
const category = getAWSResourceCategory(service);
|
|
186
|
-
if (category) {
|
|
187
|
-
switch (category) {
|
|
188
|
-
case AWS_CATEGORIES.COMPUTE: return 'compute';
|
|
189
|
-
case AWS_CATEGORIES.STORAGE: return 'storage';
|
|
190
|
-
case AWS_CATEGORIES.DATABASE: return 'database';
|
|
191
|
-
case AWS_CATEGORIES.NETWORKING: return 'networking';
|
|
192
|
-
case AWS_CATEGORIES.SECURITY: return 'security';
|
|
193
|
-
case AWS_CATEGORIES.CONTAINERS: return 'containers';
|
|
194
|
-
case AWS_CATEGORIES.SERVERLESS: return 'serverless';
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
return null;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
// Helper function to validate container placement
|
|
202
|
-
function validateContainerPlacement(
|
|
203
|
-
node: Node,
|
|
204
|
-
parentNode: Node | null,
|
|
205
|
-
resourceType: string,
|
|
206
|
-
allNodes: Node[]
|
|
207
|
-
): ValidationResult {
|
|
208
|
-
const parentType = parentNode ? getAWSResourceType(parentNode) : null;
|
|
209
|
-
|
|
210
|
-
// If no parent, only account is allowed at root
|
|
211
|
-
if (!parentNode && resourceType !== 'account') {
|
|
212
|
-
return {
|
|
213
|
-
isValid: false,
|
|
214
|
-
message: getTranslatedMessage(
|
|
215
|
-
getCloudProviderMessageId('aws', 'must_be_in_account'),
|
|
216
|
-
{ resourceType }
|
|
217
|
-
)
|
|
218
|
-
};
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
// Check if the resource can be placed in the parent container
|
|
222
|
-
if (parentNode && parentType) {
|
|
223
|
-
const rules = containerRules[parentType];
|
|
224
|
-
if (!rules) {
|
|
225
|
-
return {
|
|
226
|
-
isValid: false,
|
|
227
|
-
message: getTranslatedMessage(
|
|
228
|
-
getCloudProviderMessageId('aws', 'invalid_parent_container'),
|
|
229
|
-
{ parentType }
|
|
230
|
-
)
|
|
231
|
-
};
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
if (!rules.canContain.includes(resourceType)) {
|
|
235
|
-
const suggestedContainer = getSuggestedContainer(resourceType as AWSResourceType);
|
|
236
|
-
return {
|
|
237
|
-
isValid: false,
|
|
238
|
-
message: getTranslatedMessage(
|
|
239
|
-
getCloudProviderMessageId('aws', 'container_validation'),
|
|
240
|
-
{
|
|
241
|
-
parentType,
|
|
242
|
-
resourceType,
|
|
243
|
-
description: rules.description,
|
|
244
|
-
rules: formatPlacementRules(rules.placementRules),
|
|
245
|
-
suggestion: suggestedContainer
|
|
246
|
-
}
|
|
247
|
-
)
|
|
248
|
-
};
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
return { isValid: true };
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
// Helper function to validate service placement
|
|
256
|
-
function validateServicePlacement(
|
|
257
|
-
node: Node,
|
|
258
|
-
parentNode: Node | null,
|
|
259
|
-
resourceType: string,
|
|
260
|
-
allNodes: Node[]
|
|
261
|
-
): ValidationResult {
|
|
262
|
-
const parentType = parentNode ? getAWSResourceType(parentNode) : null;
|
|
263
|
-
|
|
264
|
-
// If no parent, only global services are allowed at root
|
|
265
|
-
if (!parentNode) {
|
|
266
|
-
const globalServices = ['storage', 'security', 'serverless'];
|
|
267
|
-
if (!globalServices.includes(resourceType)) {
|
|
268
|
-
return {
|
|
269
|
-
isValid: false,
|
|
270
|
-
message: getTranslatedMessage(
|
|
271
|
-
getCloudProviderMessageId('aws', 'must_be_in_container'),
|
|
272
|
-
{ resourceType, suggestion: getSuggestedContainer(resourceType as AWSResourceType) }
|
|
273
|
-
)
|
|
274
|
-
};
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
// Check if the resource can be placed in the parent container
|
|
279
|
-
if (parentNode && parentType) {
|
|
280
|
-
const rules = containerRules[parentType];
|
|
281
|
-
if (!rules) {
|
|
282
|
-
return {
|
|
283
|
-
isValid: false,
|
|
284
|
-
message: getTranslatedMessage(
|
|
285
|
-
getCloudProviderMessageId('aws', 'invalid_parent_container'),
|
|
286
|
-
{ parentType }
|
|
287
|
-
)
|
|
288
|
-
};
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
if (!rules.canContain.includes(resourceType)) {
|
|
292
|
-
const suggestedContainer = getSuggestedContainer(resourceType as AWSResourceType);
|
|
293
|
-
return {
|
|
294
|
-
isValid: false,
|
|
295
|
-
message: getTranslatedMessage(
|
|
296
|
-
getCloudProviderMessageId('aws', 'container_validation'),
|
|
297
|
-
{
|
|
298
|
-
parentType,
|
|
299
|
-
resourceType,
|
|
300
|
-
description: rules.description,
|
|
301
|
-
rules: formatPlacementRules(rules.placementRules),
|
|
302
|
-
suggestion: suggestedContainer
|
|
303
|
-
}
|
|
304
|
-
)
|
|
305
|
-
};
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
// Special placement rules for specific services
|
|
309
|
-
if (resourceType === 'compute' && parentType !== 'subnet' && node.data.service === 'ec2') {
|
|
310
|
-
return {
|
|
311
|
-
isValid: false,
|
|
312
|
-
message: getTranslatedMessage(
|
|
313
|
-
getCloudProviderMessageId('aws', 'ec2_must_be_in_subnet')
|
|
314
|
-
)
|
|
315
|
-
};
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
if (resourceType === 'database' && parentType !== 'subnet' && ['rds', 'aurora'].includes(node.data.service)) {
|
|
319
|
-
return {
|
|
320
|
-
isValid: false,
|
|
321
|
-
message: getTranslatedMessage(
|
|
322
|
-
getCloudProviderMessageId('aws', 'database_must_be_in_subnet')
|
|
323
|
-
)
|
|
324
|
-
};
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
if (resourceType === 'storage' && parentType !== 'account' && node.data.service === 's3') {
|
|
328
|
-
return {
|
|
329
|
-
isValid: false,
|
|
330
|
-
message: getTranslatedMessage(
|
|
331
|
-
getCloudProviderMessageId('aws', 'storage_must_be_in_account')
|
|
332
|
-
)
|
|
333
|
-
};
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
return { isValid: true };
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
// Validate placement of an AWS resource
|
|
341
|
-
export const validateAWSPlacement = (
|
|
342
|
-
node: Node,
|
|
343
|
-
parentNode: Node | null,
|
|
344
|
-
allNodes: Node[]
|
|
345
|
-
): ValidationResult => {
|
|
346
|
-
// Only validate AWS resources
|
|
347
|
-
if (node.data?.cloudProvider !== 'aws') {
|
|
348
|
-
return { isValid: true };
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
const resourceType = getAWSResourceType(node);
|
|
352
|
-
|
|
353
|
-
// If resource type is not recognized, allow it but with a warning
|
|
354
|
-
if (!resourceType) {
|
|
355
|
-
return {
|
|
356
|
-
isValid: true,
|
|
357
|
-
message: getTranslatedMessage('cloudProviders.aws.warnings.unknownResource', {
|
|
358
|
-
resource: node.data?.service || 'Unknown',
|
|
359
|
-
suggestions: 'This service might be new or have a different name. It will be placed as a generic service.'
|
|
360
|
-
})
|
|
361
|
-
};
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
// Container type validation
|
|
365
|
-
if (['account', 'vpc', 'subnet', 'availability-zone', 'local-zone'].includes(resourceType)) {
|
|
366
|
-
return validateContainerPlacement(node, parentNode, resourceType, allNodes);
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
// Service type validation
|
|
370
|
-
return validateServicePlacement(node, parentNode, resourceType, allNodes);
|
|
371
|
-
};
|
|
372
|
-
|
|
373
|
-
// Helper function to suggest the correct container
|
|
374
|
-
const getSuggestedContainer = (resourceType: AWSResourceType): string => {
|
|
375
|
-
const suggestions: Record<AWSResourceType, string> = {
|
|
376
|
-
account: 'AWS Account must be at the root level',
|
|
377
|
-
vpc: 'VPC must be placed in an AWS Account',
|
|
378
|
-
subnet: 'Subnet must be placed in a VPC',
|
|
379
|
-
'availability-zone': 'Availability Zone must be placed in a VPC or Account',
|
|
380
|
-
'local-zone': 'Local Zone must be placed in a VPC or Account',
|
|
381
|
-
compute: 'Compute services should be placed in a Subnet (EC2) or Account (Lambda)',
|
|
382
|
-
storage: 'Storage services should typically be placed at the Account level',
|
|
383
|
-
database: 'Database services should be placed in a Subnet',
|
|
384
|
-
networking: 'Networking services can be placed in VPC or Account depending on scope',
|
|
385
|
-
security: 'Security services can be placed in VPC or Account depending on scope',
|
|
386
|
-
containers: 'Container services should be placed in a Subnet',
|
|
387
|
-
serverless: 'Serverless services should be placed at the Account level'
|
|
388
|
-
};
|
|
389
|
-
|
|
390
|
-
return suggestions[resourceType] || 'Please check AWS documentation for placement rules';
|
|
391
|
-
};
|
|
392
|
-
|
|
393
|
-
// Validate the entire AWS diagram
|
|
394
|
-
export const validateAWSDiagram = (nodes: Node[]): ValidationResult & { messages?: string[] } => {
|
|
395
|
-
const messages: string[] = [];
|
|
396
|
-
|
|
397
|
-
// Get all AWS nodes
|
|
398
|
-
const awsNodes = nodes.filter(node => node.data?.cloudProvider === 'aws');
|
|
399
|
-
|
|
400
|
-
// Validate each node
|
|
401
|
-
for (const node of awsNodes) {
|
|
402
|
-
const foundParentNode = node.parentNode
|
|
403
|
-
? nodes.find(n => n.id === node.parentNode)
|
|
404
|
-
: null;
|
|
405
|
-
const parentNode = foundParentNode || null;
|
|
406
|
-
|
|
407
|
-
const validation = validateAWSPlacement(node, parentNode, nodes);
|
|
408
|
-
if (!validation.isValid && validation.message) {
|
|
409
|
-
messages.push(validation.message);
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
|
|
413
|
-
// Additional diagram-wide validations
|
|
414
|
-
const accounts = awsNodes.filter(
|
|
415
|
-
node => getAWSResourceType(node) === 'account'
|
|
416
|
-
);
|
|
417
|
-
|
|
418
|
-
// Check if there are multiple accounts
|
|
419
|
-
if (accounts.length > 1) {
|
|
420
|
-
messages.push(
|
|
421
|
-
getTranslatedMessage(getCloudProviderMessageId('aws', 'multiple_accounts'))
|
|
422
|
-
);
|
|
423
|
-
}
|
|
424
|
-
|
|
425
|
-
// Check for cross-region dependencies in VPCs
|
|
426
|
-
const vpcs = awsNodes.filter(
|
|
427
|
-
node => getAWSResourceType(node) === 'vpc'
|
|
428
|
-
);
|
|
429
|
-
|
|
430
|
-
for (const vpc of vpcs) {
|
|
431
|
-
const vpcResources = awsNodes.filter(node => node.parentNode === vpc.id);
|
|
432
|
-
const regions = new Set(vpcResources.map(r => r.data?.region));
|
|
433
|
-
if (regions.size > 1) {
|
|
434
|
-
messages.push(
|
|
435
|
-
getTranslatedMessage(
|
|
436
|
-
getCloudProviderMessageId('aws', 'cross_region_resources'),
|
|
437
|
-
{ vpcName: vpc.data?.label }
|
|
438
|
-
)
|
|
439
|
-
);
|
|
440
|
-
}
|
|
441
|
-
}
|
|
442
|
-
|
|
443
|
-
return {
|
|
444
|
-
isValid: messages.length === 0,
|
|
445
|
-
messages
|
|
446
|
-
};
|
|
1
|
+
import { Node } from 'reactflow';
|
|
2
|
+
import { getTranslatedMessage, getCloudProviderMessageId, formatPlacementRules } from './translations';
|
|
3
|
+
import {
|
|
4
|
+
AWS_CATEGORIES,
|
|
5
|
+
AWS_COMPUTE_ICONS,
|
|
6
|
+
AWS_STORAGE_ICONS,
|
|
7
|
+
AWS_DATABASE_ICONS,
|
|
8
|
+
AWS_NETWORKING_ICONS,
|
|
9
|
+
AWS_SECURITY_ICONS,
|
|
10
|
+
AWS_CONTAINER_ICONS
|
|
11
|
+
} from './aws-icons';
|
|
12
|
+
|
|
13
|
+
// Define types for validation results
|
|
14
|
+
export interface ValidationResult {
|
|
15
|
+
isValid: boolean;
|
|
16
|
+
message?: string;
|
|
17
|
+
suggestions?: string[];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
type AWSResourceType =
|
|
21
|
+
// Container types
|
|
22
|
+
| 'account'
|
|
23
|
+
| 'vpc'
|
|
24
|
+
| 'subnet'
|
|
25
|
+
| 'availability-zone'
|
|
26
|
+
| 'local-zone'
|
|
27
|
+
// Service categories
|
|
28
|
+
| 'compute'
|
|
29
|
+
| 'storage'
|
|
30
|
+
| 'database'
|
|
31
|
+
| 'networking'
|
|
32
|
+
| 'security'
|
|
33
|
+
| 'containers'
|
|
34
|
+
| 'serverless';
|
|
35
|
+
|
|
36
|
+
// Define container rules with detailed descriptions
|
|
37
|
+
const containerRules: Record<string, {
|
|
38
|
+
canContain: string[];
|
|
39
|
+
cannotContain: string[];
|
|
40
|
+
description: string;
|
|
41
|
+
placementRules: string[];
|
|
42
|
+
}> = {
|
|
43
|
+
account: {
|
|
44
|
+
canContain: [
|
|
45
|
+
'vpc',
|
|
46
|
+
'availability-zone',
|
|
47
|
+
'local-zone',
|
|
48
|
+
'storage',
|
|
49
|
+
'serverless',
|
|
50
|
+
'security',
|
|
51
|
+
'networking'
|
|
52
|
+
],
|
|
53
|
+
cannotContain: ['account'],
|
|
54
|
+
description: 'AWS Account is the root container for all resources',
|
|
55
|
+
placementRules: [
|
|
56
|
+
'Must be at the root level',
|
|
57
|
+
'Can contain VPCs and global services',
|
|
58
|
+
'Cannot contain other Accounts',
|
|
59
|
+
'Global services should be at Account level',
|
|
60
|
+
'Region-specific services should be in appropriate regions'
|
|
61
|
+
]
|
|
62
|
+
},
|
|
63
|
+
vpc: {
|
|
64
|
+
canContain: [
|
|
65
|
+
'subnet',
|
|
66
|
+
'availability-zone',
|
|
67
|
+
'local-zone',
|
|
68
|
+
'networking',
|
|
69
|
+
'security',
|
|
70
|
+
'compute'
|
|
71
|
+
],
|
|
72
|
+
cannotContain: ['vpc', 'storage', 'serverless'],
|
|
73
|
+
description: 'VPC is an isolated network in AWS',
|
|
74
|
+
placementRules: [
|
|
75
|
+
'Must be placed within an Account',
|
|
76
|
+
'Can contain Subnets and networking resources',
|
|
77
|
+
'Cannot contain global services',
|
|
78
|
+
'Cannot contain other VPCs',
|
|
79
|
+
'Must be in a single region'
|
|
80
|
+
]
|
|
81
|
+
},
|
|
82
|
+
subnet: {
|
|
83
|
+
canContain: [
|
|
84
|
+
'compute',
|
|
85
|
+
'database',
|
|
86
|
+
'containers',
|
|
87
|
+
'networking'
|
|
88
|
+
],
|
|
89
|
+
cannotContain: ['subnet', 'vpc', 'storage', 'serverless'],
|
|
90
|
+
description: 'Subnet is a range of IP addresses in a VPC',
|
|
91
|
+
placementRules: [
|
|
92
|
+
'Must be placed within a VPC',
|
|
93
|
+
'Can contain compute resources',
|
|
94
|
+
'Can contain database instances',
|
|
95
|
+
'Cannot contain global services',
|
|
96
|
+
'Must be in a single Availability Zone'
|
|
97
|
+
]
|
|
98
|
+
},
|
|
99
|
+
'availability-zone': {
|
|
100
|
+
canContain: [
|
|
101
|
+
'subnet',
|
|
102
|
+
'compute',
|
|
103
|
+
'database',
|
|
104
|
+
'containers'
|
|
105
|
+
],
|
|
106
|
+
cannotContain: ['availability-zone', 'local-zone', 'vpc', 'storage', 'serverless'],
|
|
107
|
+
description: 'Availability Zone is a distinct location within a region',
|
|
108
|
+
placementRules: [
|
|
109
|
+
'Must be placed within a VPC or Account',
|
|
110
|
+
'Can contain Subnets and compute resources',
|
|
111
|
+
'Cannot contain other Availability Zones',
|
|
112
|
+
'Resources within must be in the same AZ'
|
|
113
|
+
]
|
|
114
|
+
},
|
|
115
|
+
'local-zone': {
|
|
116
|
+
canContain: [
|
|
117
|
+
'subnet',
|
|
118
|
+
'compute',
|
|
119
|
+
'database',
|
|
120
|
+
'containers'
|
|
121
|
+
],
|
|
122
|
+
cannotContain: ['local-zone', 'availability-zone', 'vpc', 'storage', 'serverless'],
|
|
123
|
+
description: 'Local Zone brings AWS services closer to end users',
|
|
124
|
+
placementRules: [
|
|
125
|
+
'Must be placed within a VPC or Account',
|
|
126
|
+
'Can contain Subnets and compute resources',
|
|
127
|
+
'Cannot contain other Local Zones',
|
|
128
|
+
'Provides low-latency access to applications'
|
|
129
|
+
]
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
// Helper function to get resource category from service name
|
|
134
|
+
function getAWSResourceCategory(service: string): string | null {
|
|
135
|
+
// Check in each category's icons
|
|
136
|
+
|
|
137
|
+
// Check compute services
|
|
138
|
+
if (service in AWS_COMPUTE_ICONS) {
|
|
139
|
+
return AWS_COMPUTE_ICONS[service as keyof typeof AWS_COMPUTE_ICONS].category;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Check storage services
|
|
143
|
+
if (service in AWS_STORAGE_ICONS) {
|
|
144
|
+
return AWS_STORAGE_ICONS[service as keyof typeof AWS_STORAGE_ICONS].category;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Check database services
|
|
148
|
+
if (service in AWS_DATABASE_ICONS) {
|
|
149
|
+
return AWS_DATABASE_ICONS[service as keyof typeof AWS_DATABASE_ICONS].category;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Check networking services
|
|
153
|
+
if (service in AWS_NETWORKING_ICONS) {
|
|
154
|
+
return AWS_NETWORKING_ICONS[service as keyof typeof AWS_NETWORKING_ICONS].category;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Check security services
|
|
158
|
+
if (service in AWS_SECURITY_ICONS) {
|
|
159
|
+
return AWS_SECURITY_ICONS[service as keyof typeof AWS_SECURITY_ICONS].category;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// Check container services
|
|
163
|
+
if (service in AWS_CONTAINER_ICONS) {
|
|
164
|
+
return AWS_CONTAINER_ICONS[service as keyof typeof AWS_CONTAINER_ICONS].category;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// If not found in any category, return null (will be handled gracefully)
|
|
168
|
+
return null;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// Helper function to get resource type from node
|
|
172
|
+
function getAWSResourceType(node: Node): AWSResourceType | null {
|
|
173
|
+
if (!node.data?.service) return null;
|
|
174
|
+
|
|
175
|
+
const service = node.data.service;
|
|
176
|
+
|
|
177
|
+
// Container types
|
|
178
|
+
if (service === 'account' || service === 'aws-account') return 'account';
|
|
179
|
+
if (service === 'vpc') return 'vpc';
|
|
180
|
+
if (service === 'subnet') return 'subnet';
|
|
181
|
+
if (service === 'availability-zone') return 'availability-zone';
|
|
182
|
+
if (service === 'local-zone') return 'local-zone';
|
|
183
|
+
|
|
184
|
+
// Map service to its category type
|
|
185
|
+
const category = getAWSResourceCategory(service);
|
|
186
|
+
if (category) {
|
|
187
|
+
switch (category) {
|
|
188
|
+
case AWS_CATEGORIES.COMPUTE: return 'compute';
|
|
189
|
+
case AWS_CATEGORIES.STORAGE: return 'storage';
|
|
190
|
+
case AWS_CATEGORIES.DATABASE: return 'database';
|
|
191
|
+
case AWS_CATEGORIES.NETWORKING: return 'networking';
|
|
192
|
+
case AWS_CATEGORIES.SECURITY: return 'security';
|
|
193
|
+
case AWS_CATEGORIES.CONTAINERS: return 'containers';
|
|
194
|
+
case AWS_CATEGORIES.SERVERLESS: return 'serverless';
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// Helper function to validate container placement
|
|
202
|
+
function validateContainerPlacement(
|
|
203
|
+
node: Node,
|
|
204
|
+
parentNode: Node | null,
|
|
205
|
+
resourceType: string,
|
|
206
|
+
allNodes: Node[]
|
|
207
|
+
): ValidationResult {
|
|
208
|
+
const parentType = parentNode ? getAWSResourceType(parentNode) : null;
|
|
209
|
+
|
|
210
|
+
// If no parent, only account is allowed at root
|
|
211
|
+
if (!parentNode && resourceType !== 'account') {
|
|
212
|
+
return {
|
|
213
|
+
isValid: false,
|
|
214
|
+
message: getTranslatedMessage(
|
|
215
|
+
getCloudProviderMessageId('aws', 'must_be_in_account'),
|
|
216
|
+
{ resourceType }
|
|
217
|
+
)
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// Check if the resource can be placed in the parent container
|
|
222
|
+
if (parentNode && parentType) {
|
|
223
|
+
const rules = containerRules[parentType];
|
|
224
|
+
if (!rules) {
|
|
225
|
+
return {
|
|
226
|
+
isValid: false,
|
|
227
|
+
message: getTranslatedMessage(
|
|
228
|
+
getCloudProviderMessageId('aws', 'invalid_parent_container'),
|
|
229
|
+
{ parentType }
|
|
230
|
+
)
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
if (!rules.canContain.includes(resourceType)) {
|
|
235
|
+
const suggestedContainer = getSuggestedContainer(resourceType as AWSResourceType);
|
|
236
|
+
return {
|
|
237
|
+
isValid: false,
|
|
238
|
+
message: getTranslatedMessage(
|
|
239
|
+
getCloudProviderMessageId('aws', 'container_validation'),
|
|
240
|
+
{
|
|
241
|
+
parentType,
|
|
242
|
+
resourceType,
|
|
243
|
+
description: rules.description,
|
|
244
|
+
rules: formatPlacementRules(rules.placementRules),
|
|
245
|
+
suggestion: suggestedContainer
|
|
246
|
+
}
|
|
247
|
+
)
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
return { isValid: true };
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// Helper function to validate service placement
|
|
256
|
+
function validateServicePlacement(
|
|
257
|
+
node: Node,
|
|
258
|
+
parentNode: Node | null,
|
|
259
|
+
resourceType: string,
|
|
260
|
+
allNodes: Node[]
|
|
261
|
+
): ValidationResult {
|
|
262
|
+
const parentType = parentNode ? getAWSResourceType(parentNode) : null;
|
|
263
|
+
|
|
264
|
+
// If no parent, only global services are allowed at root
|
|
265
|
+
if (!parentNode) {
|
|
266
|
+
const globalServices = ['storage', 'security', 'serverless'];
|
|
267
|
+
if (!globalServices.includes(resourceType)) {
|
|
268
|
+
return {
|
|
269
|
+
isValid: false,
|
|
270
|
+
message: getTranslatedMessage(
|
|
271
|
+
getCloudProviderMessageId('aws', 'must_be_in_container'),
|
|
272
|
+
{ resourceType, suggestion: getSuggestedContainer(resourceType as AWSResourceType) }
|
|
273
|
+
)
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// Check if the resource can be placed in the parent container
|
|
279
|
+
if (parentNode && parentType) {
|
|
280
|
+
const rules = containerRules[parentType];
|
|
281
|
+
if (!rules) {
|
|
282
|
+
return {
|
|
283
|
+
isValid: false,
|
|
284
|
+
message: getTranslatedMessage(
|
|
285
|
+
getCloudProviderMessageId('aws', 'invalid_parent_container'),
|
|
286
|
+
{ parentType }
|
|
287
|
+
)
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
if (!rules.canContain.includes(resourceType)) {
|
|
292
|
+
const suggestedContainer = getSuggestedContainer(resourceType as AWSResourceType);
|
|
293
|
+
return {
|
|
294
|
+
isValid: false,
|
|
295
|
+
message: getTranslatedMessage(
|
|
296
|
+
getCloudProviderMessageId('aws', 'container_validation'),
|
|
297
|
+
{
|
|
298
|
+
parentType,
|
|
299
|
+
resourceType,
|
|
300
|
+
description: rules.description,
|
|
301
|
+
rules: formatPlacementRules(rules.placementRules),
|
|
302
|
+
suggestion: suggestedContainer
|
|
303
|
+
}
|
|
304
|
+
)
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
// Special placement rules for specific services
|
|
309
|
+
if (resourceType === 'compute' && parentType !== 'subnet' && node.data.service === 'ec2') {
|
|
310
|
+
return {
|
|
311
|
+
isValid: false,
|
|
312
|
+
message: getTranslatedMessage(
|
|
313
|
+
getCloudProviderMessageId('aws', 'ec2_must_be_in_subnet')
|
|
314
|
+
)
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
if (resourceType === 'database' && parentType !== 'subnet' && ['rds', 'aurora'].includes(node.data.service)) {
|
|
319
|
+
return {
|
|
320
|
+
isValid: false,
|
|
321
|
+
message: getTranslatedMessage(
|
|
322
|
+
getCloudProviderMessageId('aws', 'database_must_be_in_subnet')
|
|
323
|
+
)
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
if (resourceType === 'storage' && parentType !== 'account' && node.data.service === 's3') {
|
|
328
|
+
return {
|
|
329
|
+
isValid: false,
|
|
330
|
+
message: getTranslatedMessage(
|
|
331
|
+
getCloudProviderMessageId('aws', 'storage_must_be_in_account')
|
|
332
|
+
)
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
return { isValid: true };
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
// Validate placement of an AWS resource
|
|
341
|
+
export const validateAWSPlacement = (
|
|
342
|
+
node: Node,
|
|
343
|
+
parentNode: Node | null,
|
|
344
|
+
allNodes: Node[]
|
|
345
|
+
): ValidationResult => {
|
|
346
|
+
// Only validate AWS resources
|
|
347
|
+
if (node.data?.cloudProvider !== 'aws') {
|
|
348
|
+
return { isValid: true };
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
const resourceType = getAWSResourceType(node);
|
|
352
|
+
|
|
353
|
+
// If resource type is not recognized, allow it but with a warning
|
|
354
|
+
if (!resourceType) {
|
|
355
|
+
return {
|
|
356
|
+
isValid: true,
|
|
357
|
+
message: getTranslatedMessage('cloudProviders.aws.warnings.unknownResource', {
|
|
358
|
+
resource: node.data?.service || 'Unknown',
|
|
359
|
+
suggestions: 'This service might be new or have a different name. It will be placed as a generic service.'
|
|
360
|
+
})
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
// Container type validation
|
|
365
|
+
if (['account', 'vpc', 'subnet', 'availability-zone', 'local-zone'].includes(resourceType)) {
|
|
366
|
+
return validateContainerPlacement(node, parentNode, resourceType, allNodes);
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
// Service type validation
|
|
370
|
+
return validateServicePlacement(node, parentNode, resourceType, allNodes);
|
|
371
|
+
};
|
|
372
|
+
|
|
373
|
+
// Helper function to suggest the correct container
|
|
374
|
+
const getSuggestedContainer = (resourceType: AWSResourceType): string => {
|
|
375
|
+
const suggestions: Record<AWSResourceType, string> = {
|
|
376
|
+
account: 'AWS Account must be at the root level',
|
|
377
|
+
vpc: 'VPC must be placed in an AWS Account',
|
|
378
|
+
subnet: 'Subnet must be placed in a VPC',
|
|
379
|
+
'availability-zone': 'Availability Zone must be placed in a VPC or Account',
|
|
380
|
+
'local-zone': 'Local Zone must be placed in a VPC or Account',
|
|
381
|
+
compute: 'Compute services should be placed in a Subnet (EC2) or Account (Lambda)',
|
|
382
|
+
storage: 'Storage services should typically be placed at the Account level',
|
|
383
|
+
database: 'Database services should be placed in a Subnet',
|
|
384
|
+
networking: 'Networking services can be placed in VPC or Account depending on scope',
|
|
385
|
+
security: 'Security services can be placed in VPC or Account depending on scope',
|
|
386
|
+
containers: 'Container services should be placed in a Subnet',
|
|
387
|
+
serverless: 'Serverless services should be placed at the Account level'
|
|
388
|
+
};
|
|
389
|
+
|
|
390
|
+
return suggestions[resourceType] || 'Please check AWS documentation for placement rules';
|
|
391
|
+
};
|
|
392
|
+
|
|
393
|
+
// Validate the entire AWS diagram
|
|
394
|
+
export const validateAWSDiagram = (nodes: Node[]): ValidationResult & { messages?: string[] } => {
|
|
395
|
+
const messages: string[] = [];
|
|
396
|
+
|
|
397
|
+
// Get all AWS nodes
|
|
398
|
+
const awsNodes = nodes.filter(node => node.data?.cloudProvider === 'aws');
|
|
399
|
+
|
|
400
|
+
// Validate each node
|
|
401
|
+
for (const node of awsNodes) {
|
|
402
|
+
const foundParentNode = node.parentNode
|
|
403
|
+
? nodes.find(n => n.id === node.parentNode)
|
|
404
|
+
: null;
|
|
405
|
+
const parentNode = foundParentNode || null;
|
|
406
|
+
|
|
407
|
+
const validation = validateAWSPlacement(node, parentNode, nodes);
|
|
408
|
+
if (!validation.isValid && validation.message) {
|
|
409
|
+
messages.push(validation.message);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
// Additional diagram-wide validations
|
|
414
|
+
const accounts = awsNodes.filter(
|
|
415
|
+
node => getAWSResourceType(node) === 'account'
|
|
416
|
+
);
|
|
417
|
+
|
|
418
|
+
// Check if there are multiple accounts
|
|
419
|
+
if (accounts.length > 1) {
|
|
420
|
+
messages.push(
|
|
421
|
+
getTranslatedMessage(getCloudProviderMessageId('aws', 'multiple_accounts'))
|
|
422
|
+
);
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
// Check for cross-region dependencies in VPCs
|
|
426
|
+
const vpcs = awsNodes.filter(
|
|
427
|
+
node => getAWSResourceType(node) === 'vpc'
|
|
428
|
+
);
|
|
429
|
+
|
|
430
|
+
for (const vpc of vpcs) {
|
|
431
|
+
const vpcResources = awsNodes.filter(node => node.parentNode === vpc.id);
|
|
432
|
+
const regions = new Set(vpcResources.map(r => r.data?.region));
|
|
433
|
+
if (regions.size > 1) {
|
|
434
|
+
messages.push(
|
|
435
|
+
getTranslatedMessage(
|
|
436
|
+
getCloudProviderMessageId('aws', 'cross_region_resources'),
|
|
437
|
+
{ vpcName: vpc.data?.label }
|
|
438
|
+
)
|
|
439
|
+
);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
return {
|
|
444
|
+
isValid: messages.length === 0,
|
|
445
|
+
messages
|
|
446
|
+
};
|
|
447
447
|
};
|