@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,551 +1,551 @@
|
|
|
1
|
-
// Generic Restriction Engine
|
|
2
|
-
// Handles evaluation of the new flexible restriction system
|
|
3
|
-
|
|
4
|
-
import {
|
|
5
|
-
RestrictionEntry,
|
|
6
|
-
PartialRestriction,
|
|
7
|
-
RestrictionEvaluationContext,
|
|
8
|
-
RestrictionEvaluationResult,
|
|
9
|
-
ResolvedRestriction,
|
|
10
|
-
} from '../types/validation';
|
|
11
|
-
|
|
12
|
-
export class RestrictionEngine {
|
|
13
|
-
private partialRestrictions: Map<string, PartialRestriction> = new Map();
|
|
14
|
-
private customFunctions: Map<string, Function> = new Map();
|
|
15
|
-
|
|
16
|
-
constructor() {
|
|
17
|
-
this.initializeCustomFunctions();
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
// Register partial restrictions for reuse
|
|
21
|
-
registerPartialRestriction(partial: PartialRestriction): void {
|
|
22
|
-
this.partialRestrictions.set(partial.id, partial);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
// Register custom validation functions
|
|
26
|
-
registerCustomFunction(name: string, fn: Function): void {
|
|
27
|
-
this.customFunctions.set(name, fn);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
// Resolve restrictions by processing partials and inheritance
|
|
31
|
-
resolveRestrictions(
|
|
32
|
-
entries: RestrictionEntry[],
|
|
33
|
-
partials?: string[],
|
|
34
|
-
inheritedFrom?: string[]
|
|
35
|
-
): ResolvedRestriction[] {
|
|
36
|
-
const resolved: ResolvedRestriction[] = [];
|
|
37
|
-
|
|
38
|
-
// Process partial restrictions first
|
|
39
|
-
if (partials) {
|
|
40
|
-
for (const partialId of partials) {
|
|
41
|
-
const partial = this.partialRestrictions.get(partialId);
|
|
42
|
-
if (partial) {
|
|
43
|
-
const resolvedPartial = this.expandPartialRestriction(partial);
|
|
44
|
-
resolved.push(...resolvedPartial);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// Process direct entries
|
|
50
|
-
for (const entry of entries) {
|
|
51
|
-
if (entry.extends) {
|
|
52
|
-
// Resolve extended restriction
|
|
53
|
-
const extended = this.resolveExtendedRestriction(entry);
|
|
54
|
-
resolved.push(extended);
|
|
55
|
-
} else {
|
|
56
|
-
// Direct restriction
|
|
57
|
-
resolved.push({ ...entry });
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// TODO: Process inherited restrictions from other resource types
|
|
62
|
-
// This would involve looking up restrictions from parent resource types
|
|
63
|
-
|
|
64
|
-
return this.deduplicateRestrictions(resolved);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
// Expand partial restriction into concrete restrictions
|
|
68
|
-
private expandPartialRestriction(partial: PartialRestriction): ResolvedRestriction[] {
|
|
69
|
-
const template = partial.template;
|
|
70
|
-
const resolved: ResolvedRestriction[] = [];
|
|
71
|
-
|
|
72
|
-
// Apply variable substitutions if any
|
|
73
|
-
const substitutions: Record<string, any> = {};
|
|
74
|
-
if (partial.variables) {
|
|
75
|
-
for (const [key, variable] of Object.entries(partial.variables)) {
|
|
76
|
-
substitutions[key] = variable.defaultValue;
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// Create resolved restriction from template
|
|
81
|
-
const restriction: ResolvedRestriction = {
|
|
82
|
-
id: `${partial.id}-resolved-${Date.now()}`,
|
|
83
|
-
...template,
|
|
84
|
-
resolvedFrom: partial.id,
|
|
85
|
-
substitutions
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
resolved.push(restriction);
|
|
89
|
-
return resolved;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// Resolve extended restriction with overrides
|
|
93
|
-
private resolveExtendedRestriction(entry: RestrictionEntry): ResolvedRestriction {
|
|
94
|
-
const basePartial = this.partialRestrictions.get(entry.extends!);
|
|
95
|
-
if (!basePartial) {
|
|
96
|
-
// Return as-is if base partial not found
|
|
97
|
-
return { ...entry };
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
// Merge base template with overrides
|
|
101
|
-
const resolved: ResolvedRestriction = {
|
|
102
|
-
...basePartial.template,
|
|
103
|
-
...entry,
|
|
104
|
-
...(entry.overrides || {}),
|
|
105
|
-
resolvedFrom: entry.extends,
|
|
106
|
-
substitutions: {}
|
|
107
|
-
};
|
|
108
|
-
|
|
109
|
-
return resolved;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
// Remove duplicate restrictions (same type + target)
|
|
113
|
-
private deduplicateRestrictions(restrictions: ResolvedRestriction[]): ResolvedRestriction[] {
|
|
114
|
-
const seen = new Set<string>();
|
|
115
|
-
const deduplicated: ResolvedRestriction[] = [];
|
|
116
|
-
|
|
117
|
-
for (const restriction of restrictions) {
|
|
118
|
-
const key = `${restriction.type}-${restriction.target || 'global'}`;
|
|
119
|
-
if (!seen.has(key)) {
|
|
120
|
-
seen.add(key);
|
|
121
|
-
deduplicated.push(restriction);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
return deduplicated;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
// Evaluate a single restriction against context
|
|
129
|
-
evaluateRestriction(
|
|
130
|
-
restriction: ResolvedRestriction,
|
|
131
|
-
context: RestrictionEvaluationContext
|
|
132
|
-
): RestrictionEvaluationResult {
|
|
133
|
-
try {
|
|
134
|
-
// Check conditions first
|
|
135
|
-
if (!this.evaluateConditions(restriction, context)) {
|
|
136
|
-
return {
|
|
137
|
-
isValid: true, // Condition not met, restriction doesn't apply
|
|
138
|
-
restrictionId: restriction.id,
|
|
139
|
-
restrictionType: restriction.type,
|
|
140
|
-
severity: restriction.metadata.severity,
|
|
141
|
-
message: 'Restriction condition not met, skipping evaluation',
|
|
142
|
-
metadata: {
|
|
143
|
-
category: restriction.metadata.category,
|
|
144
|
-
context: 'condition-skipped'
|
|
145
|
-
}
|
|
146
|
-
};
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
// Evaluate based on restriction type
|
|
150
|
-
const isValid = this.evaluateByType(restriction, context);
|
|
151
|
-
|
|
152
|
-
return {
|
|
153
|
-
isValid,
|
|
154
|
-
restrictionId: restriction.id,
|
|
155
|
-
restrictionType: restriction.type,
|
|
156
|
-
severity: restriction.metadata.severity,
|
|
157
|
-
message: this.formatMessage(restriction.validationMessage, context),
|
|
158
|
-
suggestion: this.generateSuggestion(restriction, context),
|
|
159
|
-
autoFix: restriction.metadata.autoFix,
|
|
160
|
-
metadata: {
|
|
161
|
-
category: restriction.metadata.category,
|
|
162
|
-
references: restriction.metadata.references,
|
|
163
|
-
context: restriction.condition?.context
|
|
164
|
-
}
|
|
165
|
-
};
|
|
166
|
-
} catch (error) {
|
|
167
|
-
return {
|
|
168
|
-
isValid: false,
|
|
169
|
-
restrictionId: restriction.id,
|
|
170
|
-
restrictionType: restriction.type,
|
|
171
|
-
severity: 'error',
|
|
172
|
-
message: `Restriction evaluation failed: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
173
|
-
metadata: {
|
|
174
|
-
category: 'system',
|
|
175
|
-
context: 'evaluation-error'
|
|
176
|
-
}
|
|
177
|
-
};
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
// Evaluate restriction conditions
|
|
182
|
-
private evaluateConditions(
|
|
183
|
-
restriction: ResolvedRestriction,
|
|
184
|
-
context: RestrictionEvaluationContext
|
|
185
|
-
): boolean {
|
|
186
|
-
if (!restriction.condition) return true;
|
|
187
|
-
|
|
188
|
-
const { unless, onlyIf, regions, tags, expression } = restriction.condition;
|
|
189
|
-
|
|
190
|
-
// Check 'unless' conditions (skip if any match)
|
|
191
|
-
if (unless && unless.length > 0) {
|
|
192
|
-
for (const condition of unless) {
|
|
193
|
-
if (this.evaluateConditionExpression(condition, context)) {
|
|
194
|
-
return false; // Skip this restriction
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
// Check 'onlyIf' conditions (apply only if all match)
|
|
200
|
-
if (onlyIf && onlyIf.length > 0) {
|
|
201
|
-
for (const condition of onlyIf) {
|
|
202
|
-
if (!this.evaluateConditionExpression(condition, context)) {
|
|
203
|
-
return false; // Skip this restriction
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
// Check region restrictions
|
|
209
|
-
if (regions && regions.length > 0) {
|
|
210
|
-
const sourceRegion = context.sourceResource.region;
|
|
211
|
-
if (!sourceRegion || !regions.includes(sourceRegion)) {
|
|
212
|
-
return false;
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
// Check tag restrictions
|
|
217
|
-
if (tags && Object.keys(tags).length > 0) {
|
|
218
|
-
const sourceTags = context.sourceResource.tags || {};
|
|
219
|
-
for (const [key, value] of Object.entries(tags)) {
|
|
220
|
-
if (sourceTags[key] !== value) {
|
|
221
|
-
return false;
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
// Check custom expression
|
|
227
|
-
if (expression) {
|
|
228
|
-
return this.evaluateExpression(expression, context);
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
return true;
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
// Evaluate restriction by its type
|
|
235
|
-
private evaluateByType(
|
|
236
|
-
restriction: ResolvedRestriction,
|
|
237
|
-
context: RestrictionEvaluationContext
|
|
238
|
-
): boolean {
|
|
239
|
-
switch (restriction.type) {
|
|
240
|
-
case 'canContain':
|
|
241
|
-
return this.evaluateCanContain(restriction, context);
|
|
242
|
-
case 'cannotContain':
|
|
243
|
-
return this.evaluateCannotContain(restriction, context);
|
|
244
|
-
case 'mustBeIn':
|
|
245
|
-
return this.evaluateMustBeIn(restriction, context);
|
|
246
|
-
case 'cannotBeIn':
|
|
247
|
-
return this.evaluateCannotBeIn(restriction, context);
|
|
248
|
-
case 'quota':
|
|
249
|
-
return this.evaluateQuota(restriction, context);
|
|
250
|
-
case 'limit':
|
|
251
|
-
return this.evaluateLimit(restriction, context);
|
|
252
|
-
case 'dependency':
|
|
253
|
-
return this.evaluateDependency(restriction, context);
|
|
254
|
-
case 'conflict':
|
|
255
|
-
return this.evaluateConflict(restriction, context);
|
|
256
|
-
case 'placement':
|
|
257
|
-
return this.evaluatePlacement(restriction, context);
|
|
258
|
-
case 'validation':
|
|
259
|
-
return this.evaluateValidation(restriction, context);
|
|
260
|
-
case 'region':
|
|
261
|
-
return this.evaluateRegion(restriction, context);
|
|
262
|
-
case 'network':
|
|
263
|
-
return this.evaluateNetwork(restriction, context);
|
|
264
|
-
case 'sizing':
|
|
265
|
-
return this.evaluateSizing(restriction, context);
|
|
266
|
-
case 'naming':
|
|
267
|
-
return this.evaluateNaming(restriction, context);
|
|
268
|
-
default:
|
|
269
|
-
throw new Error(`Unknown restriction type: ${restriction.type}`);
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
// Type-specific evaluation methods
|
|
274
|
-
private evaluateCanContain(restriction: RestrictionEntry, context: RestrictionEvaluationContext): boolean {
|
|
275
|
-
if (!restriction.target || !context.targetResource) return true;
|
|
276
|
-
|
|
277
|
-
// Check if target resource type is allowed
|
|
278
|
-
if (context.targetResource.type !== restriction.target) {
|
|
279
|
-
return true; // Not applicable to this target type
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
// Count existing children of this type
|
|
283
|
-
const childCount = context.allResources.filter(
|
|
284
|
-
resource => resource.parentId === context.sourceResource.id &&
|
|
285
|
-
resource.type === restriction.target
|
|
286
|
-
).length;
|
|
287
|
-
|
|
288
|
-
// Check max limit
|
|
289
|
-
if (restriction.max !== undefined && childCount >= restriction.max) {
|
|
290
|
-
return false;
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
return true;
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
private evaluateCannotContain(restriction: RestrictionEntry, context: RestrictionEvaluationContext): boolean {
|
|
297
|
-
if (!restriction.target || !context.targetResource) return true;
|
|
298
|
-
|
|
299
|
-
// Check if target resource type is forbidden
|
|
300
|
-
if (context.targetResource.type === restriction.target) {
|
|
301
|
-
// Check if this would be a direct child
|
|
302
|
-
const wouldBeChild = context.allResources.some(
|
|
303
|
-
resource => resource.parentId === context.sourceResource.id &&
|
|
304
|
-
resource.type === restriction.target
|
|
305
|
-
);
|
|
306
|
-
return !wouldBeChild;
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
return true;
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
private evaluateMustBeIn(restriction: RestrictionEntry, context: RestrictionEvaluationContext): boolean {
|
|
313
|
-
if (!restriction.target) return true;
|
|
314
|
-
|
|
315
|
-
// Find parent of source resource
|
|
316
|
-
const parent = context.allResources.find(
|
|
317
|
-
resource => resource.id === context.sourceResource.id
|
|
318
|
-
);
|
|
319
|
-
|
|
320
|
-
// Check if source is in required parent type
|
|
321
|
-
if (parent && parent.type === restriction.target) {
|
|
322
|
-
return true;
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
return false;
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
private evaluateCannotBeIn(restriction: RestrictionEntry, context: RestrictionEvaluationContext): boolean {
|
|
329
|
-
if (!restriction.target) return true;
|
|
330
|
-
|
|
331
|
-
// Find parent of source resource
|
|
332
|
-
const parent = context.allResources.find(
|
|
333
|
-
resource => resource.id === context.sourceResource.id
|
|
334
|
-
);
|
|
335
|
-
|
|
336
|
-
// Check if source is in forbidden parent type
|
|
337
|
-
if (parent && parent.type === restriction.target) {
|
|
338
|
-
return false;
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
return true;
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
private evaluateQuota(restriction: RestrictionEntry, context: RestrictionEvaluationContext): boolean {
|
|
345
|
-
if (!restriction.target || restriction.max === undefined) return true;
|
|
346
|
-
|
|
347
|
-
// Count resources of target type
|
|
348
|
-
const count = context.allResources.filter(
|
|
349
|
-
resource => resource.type === restriction.target
|
|
350
|
-
).length;
|
|
351
|
-
|
|
352
|
-
return count <= restriction.max;
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
private evaluateLimit(restriction: RestrictionEntry, context: RestrictionEvaluationContext): boolean {
|
|
356
|
-
const value = restriction.value;
|
|
357
|
-
if (value === undefined) return true;
|
|
358
|
-
|
|
359
|
-
// Generic limit evaluation based on target
|
|
360
|
-
switch (restriction.target) {
|
|
361
|
-
case 'totalNodes':
|
|
362
|
-
return context.diagramContext.totalNodes <= (value as number);
|
|
363
|
-
case 'totalEdges':
|
|
364
|
-
return context.diagramContext.totalEdges <= (value as number);
|
|
365
|
-
case 'cloudProviders':
|
|
366
|
-
return context.diagramContext.cloudProviders.length <= (value as number);
|
|
367
|
-
default:
|
|
368
|
-
return true;
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
private evaluateDependency(restriction: RestrictionEntry, context: RestrictionEvaluationContext): boolean {
|
|
373
|
-
if (!restriction.target) return true;
|
|
374
|
-
|
|
375
|
-
// Check if required dependency exists
|
|
376
|
-
const hasDependency = context.allResources.some(
|
|
377
|
-
resource => resource.type === restriction.target
|
|
378
|
-
);
|
|
379
|
-
|
|
380
|
-
return hasDependency;
|
|
381
|
-
}
|
|
382
|
-
|
|
383
|
-
private evaluateConflict(restriction: RestrictionEntry, context: RestrictionEvaluationContext): boolean {
|
|
384
|
-
if (!restriction.target) return true;
|
|
385
|
-
|
|
386
|
-
// Check if conflicting resource exists
|
|
387
|
-
const hasConflict = context.allResources.some(
|
|
388
|
-
resource => resource.type === restriction.target &&
|
|
389
|
-
resource.id !== context.sourceResource.id
|
|
390
|
-
);
|
|
391
|
-
|
|
392
|
-
return !hasConflict;
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
private evaluatePlacement(restriction: RestrictionEntry, context: RestrictionEvaluationContext): boolean {
|
|
396
|
-
// Custom placement logic based on target and value
|
|
397
|
-
return true; // Placeholder - implement specific placement rules
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
private evaluateValidation(restriction: RestrictionEntry, context: RestrictionEvaluationContext): boolean {
|
|
401
|
-
// Custom validation logic
|
|
402
|
-
if (restriction.condition?.expression) {
|
|
403
|
-
return this.evaluateExpression(restriction.condition.expression, context);
|
|
404
|
-
}
|
|
405
|
-
return true;
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
private evaluateRegion(restriction: RestrictionEntry, context: RestrictionEvaluationContext): boolean {
|
|
409
|
-
if (!restriction.target) return true;
|
|
410
|
-
|
|
411
|
-
const sourceRegion = context.sourceResource.region;
|
|
412
|
-
return sourceRegion === restriction.target;
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
private evaluateNetwork(restriction: RestrictionEntry, context: RestrictionEvaluationContext): boolean {
|
|
416
|
-
// Network-specific validation logic
|
|
417
|
-
return true; // Placeholder
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
private evaluateSizing(restriction: RestrictionEntry, context: RestrictionEvaluationContext): boolean {
|
|
421
|
-
// Size-specific validation logic
|
|
422
|
-
return true; // Placeholder
|
|
423
|
-
}
|
|
424
|
-
|
|
425
|
-
private evaluateNaming(restriction: RestrictionEntry, context: RestrictionEvaluationContext): boolean {
|
|
426
|
-
if (!restriction.target || typeof restriction.value !== 'string') return true;
|
|
427
|
-
|
|
428
|
-
// Validate naming pattern
|
|
429
|
-
const namePattern = new RegExp(restriction.value);
|
|
430
|
-
const resourceName = context.sourceResource.properties.name || context.sourceResource.id;
|
|
431
|
-
|
|
432
|
-
return namePattern.test(resourceName);
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
// Helper methods
|
|
436
|
-
private evaluateConditionExpression(condition: string, context: RestrictionEvaluationContext): boolean {
|
|
437
|
-
// Simple condition evaluation - could be enhanced with a proper expression parser
|
|
438
|
-
try {
|
|
439
|
-
// Replace context variables in the condition
|
|
440
|
-
const processedCondition = this.substituteContextVariables(condition, context);
|
|
441
|
-
return new Function('return ' + processedCondition)();
|
|
442
|
-
} catch {
|
|
443
|
-
return false;
|
|
444
|
-
}
|
|
445
|
-
}
|
|
446
|
-
|
|
447
|
-
private evaluateExpression(expression: string, context: RestrictionEvaluationContext): boolean {
|
|
448
|
-
try {
|
|
449
|
-
const processedExpression = this.substituteContextVariables(expression, context);
|
|
450
|
-
return new Function('return ' + processedExpression)();
|
|
451
|
-
} catch {
|
|
452
|
-
return false;
|
|
453
|
-
}
|
|
454
|
-
}
|
|
455
|
-
|
|
456
|
-
private substituteContextVariables(expression: string, context: RestrictionEvaluationContext): string {
|
|
457
|
-
return expression
|
|
458
|
-
.replace(/\$sourceType/g, `"${context.sourceResource.type}"`)
|
|
459
|
-
.replace(/\$targetType/g, `"${context.targetResource?.type || ''}"`)
|
|
460
|
-
.replace(/\$sourceRegion/g, `"${context.sourceResource.region || ''}"`)
|
|
461
|
-
.replace(/\$totalNodes/g, context.diagramContext.totalNodes.toString())
|
|
462
|
-
.replace(/\$totalEdges/g, context.diagramContext.totalEdges.toString())
|
|
463
|
-
.replace(/\$cloudProviders/g, context.diagramContext.cloudProviders.length.toString());
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
private formatMessage(template: string, context: RestrictionEvaluationContext): string {
|
|
467
|
-
return this.substituteContextVariables(template, context);
|
|
468
|
-
}
|
|
469
|
-
|
|
470
|
-
private generateSuggestion(restriction: RestrictionEntry, context: RestrictionEvaluationContext): string | undefined {
|
|
471
|
-
// Generate helpful suggestions based on restriction type and context
|
|
472
|
-
switch (restriction.type) {
|
|
473
|
-
case 'canContain':
|
|
474
|
-
if (restriction.max !== undefined) {
|
|
475
|
-
return `Consider removing some ${restriction.target} resources or increase the limit.`;
|
|
476
|
-
}
|
|
477
|
-
break;
|
|
478
|
-
case 'mustBeIn':
|
|
479
|
-
return `Place this resource inside a ${restriction.target} container.`;
|
|
480
|
-
case 'cannotBeIn':
|
|
481
|
-
return `Move this resource outside of the ${restriction.target} container.`;
|
|
482
|
-
case 'quota':
|
|
483
|
-
return `You have reached the quota limit for ${restriction.target} resources.`;
|
|
484
|
-
}
|
|
485
|
-
return undefined;
|
|
486
|
-
}
|
|
487
|
-
|
|
488
|
-
// Initialize default custom functions
|
|
489
|
-
private initializeCustomFunctions(): void {
|
|
490
|
-
this.customFunctions.set('containsAll', (required: string[], actual: string[]) => {
|
|
491
|
-
return required.every(item => actual.includes(item));
|
|
492
|
-
});
|
|
493
|
-
|
|
494
|
-
this.customFunctions.set('containsAny', (options: string[], actual: string[]) => {
|
|
495
|
-
return options.some(item => actual.includes(item));
|
|
496
|
-
});
|
|
497
|
-
|
|
498
|
-
this.customFunctions.set('inRange', (value: number, min: number, max: number) => {
|
|
499
|
-
return value >= min && value <= max;
|
|
500
|
-
});
|
|
501
|
-
}
|
|
502
|
-
|
|
503
|
-
// Evaluate all restrictions for a context
|
|
504
|
-
evaluateAllRestrictions(
|
|
505
|
-
restrictions: ResolvedRestriction[],
|
|
506
|
-
context: RestrictionEvaluationContext
|
|
507
|
-
): RestrictionEvaluationResult[] {
|
|
508
|
-
return restrictions.map(restriction => this.evaluateRestriction(restriction, context));
|
|
509
|
-
}
|
|
510
|
-
|
|
511
|
-
// Get summary of restriction evaluation results
|
|
512
|
-
getEvaluationSummary(results: RestrictionEvaluationResult[]): {
|
|
513
|
-
totalRestrictions: number;
|
|
514
|
-
passed: number;
|
|
515
|
-
failed: number;
|
|
516
|
-
warnings: number;
|
|
517
|
-
errors: number;
|
|
518
|
-
categories: Record<string, number>;
|
|
519
|
-
} {
|
|
520
|
-
const summary = {
|
|
521
|
-
totalRestrictions: results.length,
|
|
522
|
-
passed: 0,
|
|
523
|
-
failed: 0,
|
|
524
|
-
warnings: 0,
|
|
525
|
-
errors: 0,
|
|
526
|
-
categories: {} as Record<string, number>
|
|
527
|
-
};
|
|
528
|
-
|
|
529
|
-
for (const result of results) {
|
|
530
|
-
if (result.isValid) {
|
|
531
|
-
summary.passed++;
|
|
532
|
-
} else {
|
|
533
|
-
summary.failed++;
|
|
534
|
-
if (result.severity === 'warning') {
|
|
535
|
-
summary.warnings++;
|
|
536
|
-
} else if (result.severity === 'error') {
|
|
537
|
-
summary.errors++;
|
|
538
|
-
}
|
|
539
|
-
}
|
|
540
|
-
|
|
541
|
-
// Count by category
|
|
542
|
-
const category = result.metadata.category;
|
|
543
|
-
summary.categories[category] = (summary.categories[category] || 0) + 1;
|
|
544
|
-
}
|
|
545
|
-
|
|
546
|
-
return summary;
|
|
547
|
-
}
|
|
548
|
-
}
|
|
549
|
-
|
|
550
|
-
// Export singleton instance
|
|
1
|
+
// Generic Restriction Engine
|
|
2
|
+
// Handles evaluation of the new flexible restriction system
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
RestrictionEntry,
|
|
6
|
+
PartialRestriction,
|
|
7
|
+
RestrictionEvaluationContext,
|
|
8
|
+
RestrictionEvaluationResult,
|
|
9
|
+
ResolvedRestriction,
|
|
10
|
+
} from '../types/validation';
|
|
11
|
+
|
|
12
|
+
export class RestrictionEngine {
|
|
13
|
+
private partialRestrictions: Map<string, PartialRestriction> = new Map();
|
|
14
|
+
private customFunctions: Map<string, Function> = new Map();
|
|
15
|
+
|
|
16
|
+
constructor() {
|
|
17
|
+
this.initializeCustomFunctions();
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// Register partial restrictions for reuse
|
|
21
|
+
registerPartialRestriction(partial: PartialRestriction): void {
|
|
22
|
+
this.partialRestrictions.set(partial.id, partial);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Register custom validation functions
|
|
26
|
+
registerCustomFunction(name: string, fn: Function): void {
|
|
27
|
+
this.customFunctions.set(name, fn);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Resolve restrictions by processing partials and inheritance
|
|
31
|
+
resolveRestrictions(
|
|
32
|
+
entries: RestrictionEntry[],
|
|
33
|
+
partials?: string[],
|
|
34
|
+
inheritedFrom?: string[]
|
|
35
|
+
): ResolvedRestriction[] {
|
|
36
|
+
const resolved: ResolvedRestriction[] = [];
|
|
37
|
+
|
|
38
|
+
// Process partial restrictions first
|
|
39
|
+
if (partials) {
|
|
40
|
+
for (const partialId of partials) {
|
|
41
|
+
const partial = this.partialRestrictions.get(partialId);
|
|
42
|
+
if (partial) {
|
|
43
|
+
const resolvedPartial = this.expandPartialRestriction(partial);
|
|
44
|
+
resolved.push(...resolvedPartial);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Process direct entries
|
|
50
|
+
for (const entry of entries) {
|
|
51
|
+
if (entry.extends) {
|
|
52
|
+
// Resolve extended restriction
|
|
53
|
+
const extended = this.resolveExtendedRestriction(entry);
|
|
54
|
+
resolved.push(extended);
|
|
55
|
+
} else {
|
|
56
|
+
// Direct restriction
|
|
57
|
+
resolved.push({ ...entry });
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// TODO: Process inherited restrictions from other resource types
|
|
62
|
+
// This would involve looking up restrictions from parent resource types
|
|
63
|
+
|
|
64
|
+
return this.deduplicateRestrictions(resolved);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Expand partial restriction into concrete restrictions
|
|
68
|
+
private expandPartialRestriction(partial: PartialRestriction): ResolvedRestriction[] {
|
|
69
|
+
const template = partial.template;
|
|
70
|
+
const resolved: ResolvedRestriction[] = [];
|
|
71
|
+
|
|
72
|
+
// Apply variable substitutions if any
|
|
73
|
+
const substitutions: Record<string, any> = {};
|
|
74
|
+
if (partial.variables) {
|
|
75
|
+
for (const [key, variable] of Object.entries(partial.variables)) {
|
|
76
|
+
substitutions[key] = variable.defaultValue;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Create resolved restriction from template
|
|
81
|
+
const restriction: ResolvedRestriction = {
|
|
82
|
+
id: `${partial.id}-resolved-${Date.now()}`,
|
|
83
|
+
...template,
|
|
84
|
+
resolvedFrom: partial.id,
|
|
85
|
+
substitutions
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
resolved.push(restriction);
|
|
89
|
+
return resolved;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Resolve extended restriction with overrides
|
|
93
|
+
private resolveExtendedRestriction(entry: RestrictionEntry): ResolvedRestriction {
|
|
94
|
+
const basePartial = this.partialRestrictions.get(entry.extends!);
|
|
95
|
+
if (!basePartial) {
|
|
96
|
+
// Return as-is if base partial not found
|
|
97
|
+
return { ...entry };
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Merge base template with overrides
|
|
101
|
+
const resolved: ResolvedRestriction = {
|
|
102
|
+
...basePartial.template,
|
|
103
|
+
...entry,
|
|
104
|
+
...(entry.overrides || {}),
|
|
105
|
+
resolvedFrom: entry.extends,
|
|
106
|
+
substitutions: {}
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
return resolved;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Remove duplicate restrictions (same type + target)
|
|
113
|
+
private deduplicateRestrictions(restrictions: ResolvedRestriction[]): ResolvedRestriction[] {
|
|
114
|
+
const seen = new Set<string>();
|
|
115
|
+
const deduplicated: ResolvedRestriction[] = [];
|
|
116
|
+
|
|
117
|
+
for (const restriction of restrictions) {
|
|
118
|
+
const key = `${restriction.type}-${restriction.target || 'global'}`;
|
|
119
|
+
if (!seen.has(key)) {
|
|
120
|
+
seen.add(key);
|
|
121
|
+
deduplicated.push(restriction);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
return deduplicated;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Evaluate a single restriction against context
|
|
129
|
+
evaluateRestriction(
|
|
130
|
+
restriction: ResolvedRestriction,
|
|
131
|
+
context: RestrictionEvaluationContext
|
|
132
|
+
): RestrictionEvaluationResult {
|
|
133
|
+
try {
|
|
134
|
+
// Check conditions first
|
|
135
|
+
if (!this.evaluateConditions(restriction, context)) {
|
|
136
|
+
return {
|
|
137
|
+
isValid: true, // Condition not met, restriction doesn't apply
|
|
138
|
+
restrictionId: restriction.id,
|
|
139
|
+
restrictionType: restriction.type,
|
|
140
|
+
severity: restriction.metadata.severity,
|
|
141
|
+
message: 'Restriction condition not met, skipping evaluation',
|
|
142
|
+
metadata: {
|
|
143
|
+
category: restriction.metadata.category,
|
|
144
|
+
context: 'condition-skipped'
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Evaluate based on restriction type
|
|
150
|
+
const isValid = this.evaluateByType(restriction, context);
|
|
151
|
+
|
|
152
|
+
return {
|
|
153
|
+
isValid,
|
|
154
|
+
restrictionId: restriction.id,
|
|
155
|
+
restrictionType: restriction.type,
|
|
156
|
+
severity: restriction.metadata.severity,
|
|
157
|
+
message: this.formatMessage(restriction.validationMessage, context),
|
|
158
|
+
suggestion: this.generateSuggestion(restriction, context),
|
|
159
|
+
autoFix: restriction.metadata.autoFix,
|
|
160
|
+
metadata: {
|
|
161
|
+
category: restriction.metadata.category,
|
|
162
|
+
references: restriction.metadata.references,
|
|
163
|
+
context: restriction.condition?.context
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
} catch (error) {
|
|
167
|
+
return {
|
|
168
|
+
isValid: false,
|
|
169
|
+
restrictionId: restriction.id,
|
|
170
|
+
restrictionType: restriction.type,
|
|
171
|
+
severity: 'error',
|
|
172
|
+
message: `Restriction evaluation failed: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
173
|
+
metadata: {
|
|
174
|
+
category: 'system',
|
|
175
|
+
context: 'evaluation-error'
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// Evaluate restriction conditions
|
|
182
|
+
private evaluateConditions(
|
|
183
|
+
restriction: ResolvedRestriction,
|
|
184
|
+
context: RestrictionEvaluationContext
|
|
185
|
+
): boolean {
|
|
186
|
+
if (!restriction.condition) return true;
|
|
187
|
+
|
|
188
|
+
const { unless, onlyIf, regions, tags, expression } = restriction.condition;
|
|
189
|
+
|
|
190
|
+
// Check 'unless' conditions (skip if any match)
|
|
191
|
+
if (unless && unless.length > 0) {
|
|
192
|
+
for (const condition of unless) {
|
|
193
|
+
if (this.evaluateConditionExpression(condition, context)) {
|
|
194
|
+
return false; // Skip this restriction
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// Check 'onlyIf' conditions (apply only if all match)
|
|
200
|
+
if (onlyIf && onlyIf.length > 0) {
|
|
201
|
+
for (const condition of onlyIf) {
|
|
202
|
+
if (!this.evaluateConditionExpression(condition, context)) {
|
|
203
|
+
return false; // Skip this restriction
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// Check region restrictions
|
|
209
|
+
if (regions && regions.length > 0) {
|
|
210
|
+
const sourceRegion = context.sourceResource.region;
|
|
211
|
+
if (!sourceRegion || !regions.includes(sourceRegion)) {
|
|
212
|
+
return false;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// Check tag restrictions
|
|
217
|
+
if (tags && Object.keys(tags).length > 0) {
|
|
218
|
+
const sourceTags = context.sourceResource.tags || {};
|
|
219
|
+
for (const [key, value] of Object.entries(tags)) {
|
|
220
|
+
if (sourceTags[key] !== value) {
|
|
221
|
+
return false;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// Check custom expression
|
|
227
|
+
if (expression) {
|
|
228
|
+
return this.evaluateExpression(expression, context);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
return true;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// Evaluate restriction by its type
|
|
235
|
+
private evaluateByType(
|
|
236
|
+
restriction: ResolvedRestriction,
|
|
237
|
+
context: RestrictionEvaluationContext
|
|
238
|
+
): boolean {
|
|
239
|
+
switch (restriction.type) {
|
|
240
|
+
case 'canContain':
|
|
241
|
+
return this.evaluateCanContain(restriction, context);
|
|
242
|
+
case 'cannotContain':
|
|
243
|
+
return this.evaluateCannotContain(restriction, context);
|
|
244
|
+
case 'mustBeIn':
|
|
245
|
+
return this.evaluateMustBeIn(restriction, context);
|
|
246
|
+
case 'cannotBeIn':
|
|
247
|
+
return this.evaluateCannotBeIn(restriction, context);
|
|
248
|
+
case 'quota':
|
|
249
|
+
return this.evaluateQuota(restriction, context);
|
|
250
|
+
case 'limit':
|
|
251
|
+
return this.evaluateLimit(restriction, context);
|
|
252
|
+
case 'dependency':
|
|
253
|
+
return this.evaluateDependency(restriction, context);
|
|
254
|
+
case 'conflict':
|
|
255
|
+
return this.evaluateConflict(restriction, context);
|
|
256
|
+
case 'placement':
|
|
257
|
+
return this.evaluatePlacement(restriction, context);
|
|
258
|
+
case 'validation':
|
|
259
|
+
return this.evaluateValidation(restriction, context);
|
|
260
|
+
case 'region':
|
|
261
|
+
return this.evaluateRegion(restriction, context);
|
|
262
|
+
case 'network':
|
|
263
|
+
return this.evaluateNetwork(restriction, context);
|
|
264
|
+
case 'sizing':
|
|
265
|
+
return this.evaluateSizing(restriction, context);
|
|
266
|
+
case 'naming':
|
|
267
|
+
return this.evaluateNaming(restriction, context);
|
|
268
|
+
default:
|
|
269
|
+
throw new Error(`Unknown restriction type: ${restriction.type}`);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
// Type-specific evaluation methods
|
|
274
|
+
private evaluateCanContain(restriction: RestrictionEntry, context: RestrictionEvaluationContext): boolean {
|
|
275
|
+
if (!restriction.target || !context.targetResource) return true;
|
|
276
|
+
|
|
277
|
+
// Check if target resource type is allowed
|
|
278
|
+
if (context.targetResource.type !== restriction.target) {
|
|
279
|
+
return true; // Not applicable to this target type
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
// Count existing children of this type
|
|
283
|
+
const childCount = context.allResources.filter(
|
|
284
|
+
resource => resource.parentId === context.sourceResource.id &&
|
|
285
|
+
resource.type === restriction.target
|
|
286
|
+
).length;
|
|
287
|
+
|
|
288
|
+
// Check max limit
|
|
289
|
+
if (restriction.max !== undefined && childCount >= restriction.max) {
|
|
290
|
+
return false;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
return true;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
private evaluateCannotContain(restriction: RestrictionEntry, context: RestrictionEvaluationContext): boolean {
|
|
297
|
+
if (!restriction.target || !context.targetResource) return true;
|
|
298
|
+
|
|
299
|
+
// Check if target resource type is forbidden
|
|
300
|
+
if (context.targetResource.type === restriction.target) {
|
|
301
|
+
// Check if this would be a direct child
|
|
302
|
+
const wouldBeChild = context.allResources.some(
|
|
303
|
+
resource => resource.parentId === context.sourceResource.id &&
|
|
304
|
+
resource.type === restriction.target
|
|
305
|
+
);
|
|
306
|
+
return !wouldBeChild;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
return true;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
private evaluateMustBeIn(restriction: RestrictionEntry, context: RestrictionEvaluationContext): boolean {
|
|
313
|
+
if (!restriction.target) return true;
|
|
314
|
+
|
|
315
|
+
// Find parent of source resource
|
|
316
|
+
const parent = context.allResources.find(
|
|
317
|
+
resource => resource.id === context.sourceResource.id
|
|
318
|
+
);
|
|
319
|
+
|
|
320
|
+
// Check if source is in required parent type
|
|
321
|
+
if (parent && parent.type === restriction.target) {
|
|
322
|
+
return true;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
return false;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
private evaluateCannotBeIn(restriction: RestrictionEntry, context: RestrictionEvaluationContext): boolean {
|
|
329
|
+
if (!restriction.target) return true;
|
|
330
|
+
|
|
331
|
+
// Find parent of source resource
|
|
332
|
+
const parent = context.allResources.find(
|
|
333
|
+
resource => resource.id === context.sourceResource.id
|
|
334
|
+
);
|
|
335
|
+
|
|
336
|
+
// Check if source is in forbidden parent type
|
|
337
|
+
if (parent && parent.type === restriction.target) {
|
|
338
|
+
return false;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
return true;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
private evaluateQuota(restriction: RestrictionEntry, context: RestrictionEvaluationContext): boolean {
|
|
345
|
+
if (!restriction.target || restriction.max === undefined) return true;
|
|
346
|
+
|
|
347
|
+
// Count resources of target type
|
|
348
|
+
const count = context.allResources.filter(
|
|
349
|
+
resource => resource.type === restriction.target
|
|
350
|
+
).length;
|
|
351
|
+
|
|
352
|
+
return count <= restriction.max;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
private evaluateLimit(restriction: RestrictionEntry, context: RestrictionEvaluationContext): boolean {
|
|
356
|
+
const value = restriction.value;
|
|
357
|
+
if (value === undefined) return true;
|
|
358
|
+
|
|
359
|
+
// Generic limit evaluation based on target
|
|
360
|
+
switch (restriction.target) {
|
|
361
|
+
case 'totalNodes':
|
|
362
|
+
return context.diagramContext.totalNodes <= (value as number);
|
|
363
|
+
case 'totalEdges':
|
|
364
|
+
return context.diagramContext.totalEdges <= (value as number);
|
|
365
|
+
case 'cloudProviders':
|
|
366
|
+
return context.diagramContext.cloudProviders.length <= (value as number);
|
|
367
|
+
default:
|
|
368
|
+
return true;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
private evaluateDependency(restriction: RestrictionEntry, context: RestrictionEvaluationContext): boolean {
|
|
373
|
+
if (!restriction.target) return true;
|
|
374
|
+
|
|
375
|
+
// Check if required dependency exists
|
|
376
|
+
const hasDependency = context.allResources.some(
|
|
377
|
+
resource => resource.type === restriction.target
|
|
378
|
+
);
|
|
379
|
+
|
|
380
|
+
return hasDependency;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
private evaluateConflict(restriction: RestrictionEntry, context: RestrictionEvaluationContext): boolean {
|
|
384
|
+
if (!restriction.target) return true;
|
|
385
|
+
|
|
386
|
+
// Check if conflicting resource exists
|
|
387
|
+
const hasConflict = context.allResources.some(
|
|
388
|
+
resource => resource.type === restriction.target &&
|
|
389
|
+
resource.id !== context.sourceResource.id
|
|
390
|
+
);
|
|
391
|
+
|
|
392
|
+
return !hasConflict;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
private evaluatePlacement(restriction: RestrictionEntry, context: RestrictionEvaluationContext): boolean {
|
|
396
|
+
// Custom placement logic based on target and value
|
|
397
|
+
return true; // Placeholder - implement specific placement rules
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
private evaluateValidation(restriction: RestrictionEntry, context: RestrictionEvaluationContext): boolean {
|
|
401
|
+
// Custom validation logic
|
|
402
|
+
if (restriction.condition?.expression) {
|
|
403
|
+
return this.evaluateExpression(restriction.condition.expression, context);
|
|
404
|
+
}
|
|
405
|
+
return true;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
private evaluateRegion(restriction: RestrictionEntry, context: RestrictionEvaluationContext): boolean {
|
|
409
|
+
if (!restriction.target) return true;
|
|
410
|
+
|
|
411
|
+
const sourceRegion = context.sourceResource.region;
|
|
412
|
+
return sourceRegion === restriction.target;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
private evaluateNetwork(restriction: RestrictionEntry, context: RestrictionEvaluationContext): boolean {
|
|
416
|
+
// Network-specific validation logic
|
|
417
|
+
return true; // Placeholder
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
private evaluateSizing(restriction: RestrictionEntry, context: RestrictionEvaluationContext): boolean {
|
|
421
|
+
// Size-specific validation logic
|
|
422
|
+
return true; // Placeholder
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
private evaluateNaming(restriction: RestrictionEntry, context: RestrictionEvaluationContext): boolean {
|
|
426
|
+
if (!restriction.target || typeof restriction.value !== 'string') return true;
|
|
427
|
+
|
|
428
|
+
// Validate naming pattern
|
|
429
|
+
const namePattern = new RegExp(restriction.value);
|
|
430
|
+
const resourceName = context.sourceResource.properties.name || context.sourceResource.id;
|
|
431
|
+
|
|
432
|
+
return namePattern.test(resourceName);
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
// Helper methods
|
|
436
|
+
private evaluateConditionExpression(condition: string, context: RestrictionEvaluationContext): boolean {
|
|
437
|
+
// Simple condition evaluation - could be enhanced with a proper expression parser
|
|
438
|
+
try {
|
|
439
|
+
// Replace context variables in the condition
|
|
440
|
+
const processedCondition = this.substituteContextVariables(condition, context);
|
|
441
|
+
return new Function('return ' + processedCondition)();
|
|
442
|
+
} catch {
|
|
443
|
+
return false;
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
private evaluateExpression(expression: string, context: RestrictionEvaluationContext): boolean {
|
|
448
|
+
try {
|
|
449
|
+
const processedExpression = this.substituteContextVariables(expression, context);
|
|
450
|
+
return new Function('return ' + processedExpression)();
|
|
451
|
+
} catch {
|
|
452
|
+
return false;
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
private substituteContextVariables(expression: string, context: RestrictionEvaluationContext): string {
|
|
457
|
+
return expression
|
|
458
|
+
.replace(/\$sourceType/g, `"${context.sourceResource.type}"`)
|
|
459
|
+
.replace(/\$targetType/g, `"${context.targetResource?.type || ''}"`)
|
|
460
|
+
.replace(/\$sourceRegion/g, `"${context.sourceResource.region || ''}"`)
|
|
461
|
+
.replace(/\$totalNodes/g, context.diagramContext.totalNodes.toString())
|
|
462
|
+
.replace(/\$totalEdges/g, context.diagramContext.totalEdges.toString())
|
|
463
|
+
.replace(/\$cloudProviders/g, context.diagramContext.cloudProviders.length.toString());
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
private formatMessage(template: string, context: RestrictionEvaluationContext): string {
|
|
467
|
+
return this.substituteContextVariables(template, context);
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
private generateSuggestion(restriction: RestrictionEntry, context: RestrictionEvaluationContext): string | undefined {
|
|
471
|
+
// Generate helpful suggestions based on restriction type and context
|
|
472
|
+
switch (restriction.type) {
|
|
473
|
+
case 'canContain':
|
|
474
|
+
if (restriction.max !== undefined) {
|
|
475
|
+
return `Consider removing some ${restriction.target} resources or increase the limit.`;
|
|
476
|
+
}
|
|
477
|
+
break;
|
|
478
|
+
case 'mustBeIn':
|
|
479
|
+
return `Place this resource inside a ${restriction.target} container.`;
|
|
480
|
+
case 'cannotBeIn':
|
|
481
|
+
return `Move this resource outside of the ${restriction.target} container.`;
|
|
482
|
+
case 'quota':
|
|
483
|
+
return `You have reached the quota limit for ${restriction.target} resources.`;
|
|
484
|
+
}
|
|
485
|
+
return undefined;
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
// Initialize default custom functions
|
|
489
|
+
private initializeCustomFunctions(): void {
|
|
490
|
+
this.customFunctions.set('containsAll', (required: string[], actual: string[]) => {
|
|
491
|
+
return required.every(item => actual.includes(item));
|
|
492
|
+
});
|
|
493
|
+
|
|
494
|
+
this.customFunctions.set('containsAny', (options: string[], actual: string[]) => {
|
|
495
|
+
return options.some(item => actual.includes(item));
|
|
496
|
+
});
|
|
497
|
+
|
|
498
|
+
this.customFunctions.set('inRange', (value: number, min: number, max: number) => {
|
|
499
|
+
return value >= min && value <= max;
|
|
500
|
+
});
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
// Evaluate all restrictions for a context
|
|
504
|
+
evaluateAllRestrictions(
|
|
505
|
+
restrictions: ResolvedRestriction[],
|
|
506
|
+
context: RestrictionEvaluationContext
|
|
507
|
+
): RestrictionEvaluationResult[] {
|
|
508
|
+
return restrictions.map(restriction => this.evaluateRestriction(restriction, context));
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
// Get summary of restriction evaluation results
|
|
512
|
+
getEvaluationSummary(results: RestrictionEvaluationResult[]): {
|
|
513
|
+
totalRestrictions: number;
|
|
514
|
+
passed: number;
|
|
515
|
+
failed: number;
|
|
516
|
+
warnings: number;
|
|
517
|
+
errors: number;
|
|
518
|
+
categories: Record<string, number>;
|
|
519
|
+
} {
|
|
520
|
+
const summary = {
|
|
521
|
+
totalRestrictions: results.length,
|
|
522
|
+
passed: 0,
|
|
523
|
+
failed: 0,
|
|
524
|
+
warnings: 0,
|
|
525
|
+
errors: 0,
|
|
526
|
+
categories: {} as Record<string, number>
|
|
527
|
+
};
|
|
528
|
+
|
|
529
|
+
for (const result of results) {
|
|
530
|
+
if (result.isValid) {
|
|
531
|
+
summary.passed++;
|
|
532
|
+
} else {
|
|
533
|
+
summary.failed++;
|
|
534
|
+
if (result.severity === 'warning') {
|
|
535
|
+
summary.warnings++;
|
|
536
|
+
} else if (result.severity === 'error') {
|
|
537
|
+
summary.errors++;
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
// Count by category
|
|
542
|
+
const category = result.metadata.category;
|
|
543
|
+
summary.categories[category] = (summary.categories[category] || 0) + 1;
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
return summary;
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
// Export singleton instance
|
|
551
551
|
export const restrictionEngine = new RestrictionEngine();
|