@izara_project/izara-core-generate-service-code 1.0.64 → 1.0.66
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/README.md +73 -11
- package/index.js +0 -5
- package/package.json +7 -6
- package/src/compile/compileProject.js +26 -0
- package/src/compile/loadSchemas.js +28 -0
- package/src/emit/crud/dynamicCrudFlowSchemaTemplate.js +11 -0
- package/src/emit/crud/emitCrudApplicationArtifacts.js +157 -0
- package/src/emit/crud/emitDynamicCrudFlowSchemas.js +84 -0
- package/src/emit/crud/generateCrudApplicationArtifacts.js +16 -0
- package/src/emit/crud/generateDynamicCrudFlowSchemas.js +21 -0
- package/src/emit/crud/loadLocalSchemaArrays.js +8 -0
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowObjects/templates/crud → emit/crud/templates}/CreateEndpoint_Main.ejs +1 -1
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowObjects/templates/crud → emit/crud/templates}/DeleteEndpoint_Main.ejs +1 -1
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowObjects/templates/step → emit/crud/templates}/FlowEndpointBeforeLogical_Main.ejs +2 -2
- package/src/emit/crud/templates/FlowEndpointComplete_Main.ejs +75 -0
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/endpoint → emit/crud/templates}/FlowEndpoint_HdrWbs.ejs +1 -1
- package/src/{codeGenerators/app/src/generatedCode/ProcessLogical/templates/ProcessLogical_HdrSqs.ejs → emit/crud/templates/FlowHandler_HdrSqs.ejs} +52 -56
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/endpoint → emit/crud/templates}/FlowMain_Wbs.ejs +1 -3
- package/src/emit/crud/templates/GetRangeEndpoint_Main.ejs +127 -0
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowObjects/templates/crud → emit/crud/templates}/UpdateEndpoint_Main.ejs +1 -1
- package/src/emit/custom/customFlows.js +70 -0
- package/src/emit/custom/emitCustomFlowApplicationArtifacts.js +308 -0
- package/src/emit/custom/generateCustomFlowApplicationArtifacts.js +22 -0
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/endpoint → emit/custom/templates}/FlowEndpoint_Main.ejs +1 -1
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step → emit/custom/templates}/FlowStep_Main.ejs +1 -1
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/ConfirmReserved_Main.ejs +5 -5
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/CreateObject_HdrWbs.ejs +1 -1
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/CreateObject_Main.ejs +3 -3
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/CreatePreSignUrl_Main.ejs +4 -5
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/FlowHandler_HdrS3.ejs +2 -8
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/ProcessS3File_Main.ejs +1 -1
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/ReservedLimit_Main.ejs +5 -6
- package/src/emit/custom/templates/triggerCache/CheckTriggerCache_HdrSqs.ejs +32 -0
- package/src/emit/custom/templates/triggerCache/CheckTriggerCache_Main.ejs +63 -0
- package/src/emit/custom/templates/triggerCache/TriggerCacheComplete_Main.ejs +35 -0
- package/src/emit/custom/templates/triggerCache/TriggerCache_Main.ejs +16 -0
- package/src/emit/function/functionYamlArtifact.js +111 -0
- package/src/emit/rbac/emitDynamicRbacFlowSchemas.js +117 -0
- package/src/emit/rbac/emitRbacApplicationArtifacts.js +256 -0
- package/src/emit/rbac/generateCreateTargetRoleHandler.js +19 -0
- package/src/emit/rbac/generateDynamicRbacFlowSchemas.js +21 -0
- package/src/emit/rbac/rbacFlowTag.js +7 -0
- package/src/emit/rbac/templates/CreateTargetRole_HdrSqs.ejs +24 -0
- package/src/emit/rbac/templates/CreateTargetRole_Main.ejs +25 -0
- package/src/emit/rbac/templates/DynamicRbacFlowSchema.ejs +5 -0
- package/src/emit/rbac/templates/ListRbac_HdrApi.ejs +17 -0
- package/src/emit/rbac/templates/ListRbac_HdrSqs.ejs +13 -0
- package/src/emit/rbac/templates/ListRbac_Main.ejs +29 -0
- package/src/emit/rbac/templates/RbacMutation_Main.ejs +22 -0
- package/src/emit/rbac/templates/UserRbacFlow_HdrInv.ejs +10 -0
- package/src/emit/rbac/templates/UserRbacFlow_Main.ejs +44 -0
- package/src/emit/rbac/templates/UserRoleMutation_Main.ejs +33 -0
- package/src/emit/relationship/dynamicRelationshipFlowSchemaTemplate.js +11 -0
- package/src/emit/relationship/emitDynamicRelationshipFlowSchemas.js +66 -0
- package/src/emit/relationship/emitRelationshipApplicationArtifacts.js +147 -0
- package/src/emit/relationship/generateDynamicRelationshipFlowSchemas.js +23 -0
- package/src/emit/relationship/generateRelationshipApplicationArtifacts.js +22 -0
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessChangeRelationshipComplete_Main.ejs → emit/relationship/templates/ChangeRelationshipComplete_Main.ejs} +1 -1
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessChangeRelationship_Main.ejs → emit/relationship/templates/ChangeRelationship_Main.ejs} +10 -2
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessCreateRelationshipComplete_Main.ejs → emit/relationship/templates/CreateRelationshipComplete_Main.ejs} +1 -1
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessCreateRelationship_Main.ejs → emit/relationship/templates/CreateRelationship_Main.ejs} +1 -1
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessDeleteRelationshipComplete_Main.ejs → emit/relationship/templates/DeleteRelationshipComplete_Main.ejs} +1 -1
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessDeleteRelationship_Main.ejs → emit/relationship/templates/DeleteRelationship_Main.ejs} +1 -1
- package/src/emit/relationship/templates/FlowHandler_HdrApi.ejs +51 -0
- package/src/{codeGenerators/app/src/generatedCode/Flow/_shared/handlers → emit/relationship/templates}/FlowHandler_HdrDsq.ejs +1 -1
- package/src/emit/relationship/templates/FlowHandler_HdrInv.ejs +45 -0
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessGetRelationshipComplete_Main.ejs → emit/relationship/templates/GetRelationshipComplete_Main.ejs} +1 -1
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessGetRelationship_Main.ejs → emit/relationship/templates/GetRelationship_Main.ejs} +1 -1
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessMoveRelationship_Main.ejs → emit/relationship/templates/MoveRelationship_Main.ejs} +9 -1
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessUpdateRelationshipComplete_Main.ejs → emit/relationship/templates/UpdateRelationshipComplete_Main.ejs} +1 -1
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessUpdateRelationship_Main.ejs → emit/relationship/templates/UpdateRelationship_Main.ejs} +1 -1
- package/src/emit/resource/emitResourceArtifacts.js +300 -0
- package/src/emit/resource/generateResourceArtifacts.js +20 -0
- package/src/{codeGenerators/resource/sls_yaml/templates/crud → emit/resource/templates}/ResourceBeforeLogicalYaml.ejs +1 -1
- package/src/{codeGenerators/resource/sls_yaml/templates/crud → emit/resource/templates}/ResourceSqsYaml.ejs +6 -6
- package/src/{codeGenerators/app/sls_yaml → emit/resource}/templates/SharedResource_Yaml.ejs +8 -8
- package/src/emit/system/emitSystemWebSocketArtifacts.js +182 -0
- package/src/generate.js +60 -126
- package/src/output/commitArtifacts.js +213 -0
- package/src/output/mergeHooks.js +55 -0
- package/src/output/validateArtifacts.js +62 -0
- package/src/plan/buildGenerationPlan.js +50 -0
- package/test/core.test.js +159 -0
- package/test/createTargetRoleHandler.test.js +68 -0
- package/test/crudApplicationArtifacts.test.js +107 -0
- package/test/customFlowApplicationArtifacts.test.js +294 -0
- package/test/dynamicCrudFlowSchemas.test.js +136 -0
- package/test/dynamicRbacFlowSchemas.test.js +101 -0
- package/test/dynamicRelationshipFlowSchemas.test.js +99 -0
- package/test/functionYamlArtifact.test.js +34 -0
- package/test/intTestApi.test.js +29 -0
- package/test/publicApi.test.js +209 -0
- package/test/relationshipApplicationArtifacts.test.js +68 -0
- package/test/resourceArtifacts.test.js +121 -0
- package/jsconfig.json +0 -9
- package/src/__tests__/getIntTestConfig.test.js +0 -51
- package/src/__tests__/intTestGeneratorShared.test.cjs +0 -169
- package/src/__tests__/pathIntTest.test.js +0 -103
- package/src/codeGenerators/app/initial_setup/InitialSetupGenerator.js +0 -199
- package/src/codeGenerators/app/initial_setup/templates/InitialSetup_LambdaRole.ejs +0 -50
- package/src/codeGenerators/app/initial_setup/templates/InitialSetup_SnsService.ejs +0 -15
- package/src/codeGenerators/app/initial_setup/templates/InitialSetup_TableName.ejs +0 -9
- package/src/codeGenerators/app/sls_yaml/FindDataYamlGenerator.js +0 -23
- package/src/codeGenerators/app/sls_yaml/FunctionYamlGenerator.js +0 -322
- package/src/codeGenerators/app/sls_yaml/ProcessLogicalYamlGenerator.js +0 -21
- package/src/codeGenerators/app/sls_yaml/RoleNameConfigGenerator.js +0 -48
- package/src/codeGenerators/app/sls_yaml/SharedResourceYamlGenerator.js +0 -504
- package/src/codeGenerators/app/sls_yaml/__tests__/SharedResourceYamlGenerator.test.js +0 -235
- package/src/codeGenerators/app/sls_yaml/_policy/PolicyEmitter.js +0 -46
- package/src/codeGenerators/app/sls_yaml/_policy/PolicyRegistry.js +0 -94
- package/src/codeGenerators/app/sls_yaml/_policy/__tests__/PolicyEmitter.test.js +0 -55
- package/src/codeGenerators/app/sls_yaml/_policy/__tests__/PolicyRegistry.test.js +0 -48
- package/src/codeGenerators/app/sls_yaml/_policy/templates/ManagedPolicy_Yaml.ejs +0 -22
- package/src/codeGenerators/app/sls_yaml/renderYamlTemplate.js +0 -13
- package/src/codeGenerators/app/sls_yaml/templates/FindData_Yaml.ejs +0 -10
- package/src/codeGenerators/app/sls_yaml/templates/FunctionYaml_Api.ejs +0 -21
- package/src/codeGenerators/app/sls_yaml/templates/FunctionYaml_EventBridge.ejs +0 -14
- package/src/codeGenerators/app/sls_yaml/templates/FunctionYaml_Inv.ejs +0 -6
- package/src/codeGenerators/app/sls_yaml/templates/FunctionYaml_Sqs.ejs +0 -11
- package/src/codeGenerators/app/sls_yaml/templates/FunctionYaml_Wbs.ejs +0 -11
- package/src/codeGenerators/app/sls_yaml/templates/ProcessLogical_Yaml.ejs +0 -32
- package/src/codeGenerators/app/sls_yaml/templates/RoleNameConfig_Yaml.ejs +0 -5
- package/src/codeGenerators/app/src/generatedCode/FindData/FindDataGenerator.js +0 -238
- package/src/codeGenerators/app/src/generatedCode/FindData/templates/FindData_HdrSqs.ejs +0 -87
- package/src/codeGenerators/app/src/generatedCode/FindData/templates/FindData_Main.ejs +0 -108
- package/src/codeGenerators/app/src/generatedCode/FindData/templates/GetByStorage/getByDynamo.ejs +0 -32
- package/src/codeGenerators/app/src/generatedCode/FindData/templates/GetByStorage/getByGraph.ejs +0 -87
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowObjects/.gitkeep +0 -0
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowObjects/EndpointsGenerator.js +0 -120
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowObjects/templates/step/FlowEndpointComplete_Main.ejs +0 -313
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/RbacFlowGenerator.js +0 -116
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/CreateRolePermissions.ejs +0 -135
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/CreateTargetRole.ejs +0 -131
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/CreateUserRole.ejs +0 -150
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/DeleteRolePermissions.ejs +0 -132
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/DeleteTargetRole.ejs +0 -132
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/DeleteUserFromRole.ejs +0 -150
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/FlowRbac_Main.ejs +0 -252
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/ListRolePermissions.ejs +0 -120
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/ListTargetRole.ejs +0 -122
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/ListUserInRoles.ejs +0 -117
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowRelationships/RelationshipFlowGenerator.js +0 -148
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/.gitkeep +0 -0
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/StatusFieldGenerator.js +0 -109
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/WebSocketGenerator.js +0 -122
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/endpoint/FlowEntryPoint_Main.ejs +0 -38
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/statusField/CompleteStatusFieldSns_Yaml.ejs +0 -52
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/statusField/CompleteStatusField_HdrSqs.ejs +0 -84
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/statusField/CompleteStatusField_Main.ejs +0 -78
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/FlowStep_ByConfig_Awaiting_Main.ejs +0 -123
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/FlowStep_ByConfig_Paginated_Main.ejs +0 -59
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/FlowStep_PlugIn_Main.ejs +0 -72
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/FlowStep_RecievePlugIn_Main.ejs +0 -76
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/templateAwaitingStep.ejs +0 -41
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/templateSendPlugin.ejs +0 -18
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/ProcessWebSocketFlow_Yaml.ejs +0 -26
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/ProcessWebSocketSub_Yaml.ejs +0 -7
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/ProcessWebSocket_HdrSqs.ejs +0 -66
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/ProcessWebSocket_Main.ejs +0 -115
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/ProcessWebSocket_Yaml.ejs +0 -36
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/WebSocketConnect_Main.ejs +0 -52
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/WebSocketConnect_Yaml.ejs +0 -13
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/WebSocketDynamoDb_Yaml.ejs +0 -28
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/BaseDsqHandler.js +0 -55
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/BaseSqsHandler.js +0 -66
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/__tests__/BaseDsqHandler.test.js +0 -93
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/dsq.js +0 -5
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/eventBridge.js +0 -25
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/extTopic.js +0 -6
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/lambdaSyncApi.js +0 -43
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/lambdaSyncInv.js +0 -43
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/ownTopic.js +0 -54
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/registry.js +0 -17
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3.js +0 -56
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3Components/ConfirmAfterUploadS3Generator.js +0 -46
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3Components/CreateObjectGenerator.js +0 -50
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3Components/CreatePreSignUrlGenerator.js +0 -48
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3Components/ProcessAfterUploadS3Generator.js +0 -49
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3Components/ReservedLimitGenerator.js +0 -47
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/eventTypes.js +0 -23
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowClassifier.js +0 -50
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowEntryPointBase.js +0 -106
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowMainFunctionBase.js +0 -172
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowNaming.js +0 -37
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowSelection.js +0 -19
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowStepBase.js +0 -235
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowStepNormalizer.js +0 -75
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowValidator.js +0 -236
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/propertyNormalizer.js +0 -15
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/registry.js +0 -7
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/roleNameDetection.js +0 -49
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/triggerCacheBase.js +0 -177
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/CheckTriggerCache_HdrSqs.ejs +0 -89
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/CheckTriggerCache_Main.ejs +0 -83
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/ProcessTriggerCache_HdrSqs.ejs +0 -103
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/ProcessTriggerCache_Main.ejs +0 -58
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/TriggerCacheComplete_HdrDsq.ejs +0 -104
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/TriggerCacheComplete_HdrSqs.ejs +0 -88
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/TriggerCacheComplete_Main.ejs +0 -80
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/TriggerCacheQueue_Yaml.ejs +0 -36
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/yaml/SharedFunctionSqs_Yaml.ejs +0 -13
- package/src/codeGenerators/app/src/generatedCode/ProcessLogical/ProcessLogicalGenerator.js +0 -29
- package/src/codeGenerators/app/src/generatedCode/ProcessLogical/templates/PaginateProcessLogical_HdrDsq.ejs +0 -177
- package/src/codeGenerators/app/src/generatedCode/ProcessLogical/templates/PaginateProcessLogical_HdrSqs.ejs +0 -155
- package/src/codeGenerators/app/src/generatedCode/ProcessLogical/templates/PaginateProcessLogical_Main.ejs +0 -268
- package/src/codeGenerators/app/src/generatedCode/ProcessLogical/templates/ProcessLogical_Main.ejs +0 -450
- package/src/codeGenerators/app/src/generatedCode/SystemFlowSchemas/RegisterGenerator.js +0 -149
- package/src/codeGenerators/app/src/generatedCode/SystemFlowSchemas/templates/register/RegisterComplete_HdrSqs.ejs +0 -85
- package/src/codeGenerators/app/src/generatedCode/SystemFlowSchemas/templates/register/RegisterComplete_Main.ejs +0 -176
- package/src/codeGenerators/app/src/generatedCode/SystemFlowSchemas/templates/register/Register_HdrWbs.ejs +0 -80
- package/src/codeGenerators/app/src/generatedCode/SystemFlowSchemas/templates/register/Register_Main.ejs +0 -164
- package/src/codeGenerators/app/src/generatedCode/libs/ConstsGenerator.js +0 -28
- package/src/codeGenerators/app/src/generatedCode/libs/GenerateCodeLibsGenerator.js +0 -28
- package/src/codeGenerators/app/src/generatedCode/libs/templates/Consts.ejs +0 -448
- package/src/codeGenerators/app/src/generatedCode/libs/templates/GenerateCodeLibs.ejs +0 -124
- package/src/codeGenerators/resource/sls_yaml/DynamoDBGenerator.js +0 -87
- package/src/codeGenerators/resource/sls_yaml/FlowOutGenerator.js +0 -70
- package/src/codeGenerators/resource/sls_yaml/FlowResourceYamlGenerator.js +0 -182
- package/src/core/renderTemplateFile.js +0 -22
- package/src/core/validate.js +0 -165
- package/src/generateCode.js +0 -358
- package/src/generateSchema.js +0 -123
- package/src/parsers/flowSchemaParser.js +0 -112
- package/src/parsers/objectSchemaParser.js +0 -39
- package/src/parsers/relationshipSchemaParser.js +0 -51
- package/src/schemaGenerators/app/src/schemas/FlowSchemas/FlowSchemaGenerator.js +0 -107
- package/src/schemaGenerators/app/src/schemas/FlowSchemas/RbacFlowSchemaGenerator.js +0 -98
- package/src/schemaGenerators/app/src/schemas/FlowSchemas/RelationshipFlowSchemaGenerator.js +0 -89
- package/src/schemaGenerators/app/src/schemas/FlowSchemas/templates/DynamicFlowSchemaTemplate.ejs +0 -41
- package/src/schemaGenerators/app/src/schemas/FlowSchemas/templates/DynamicRbacFlowSchemaTemplate.ejs +0 -20
- package/src/schemaGenerators/app/src/schemas/FlowSchemas/templates/RelationshipFlowSchemaTemplate.ejs +0 -33
- package/src/schemaGenerators/app/src/schemas/FlowSchemas/templates/UserRbacFlowSchemaTemplate.ejs +0 -22
- package/src/schemaGenerators/app/src/schemas/ObjectSchemas/AttributeTreeSchemaGenerator.js +0 -124
- package/src/schemaGenerators/app/src/schemas/ObjectSchemas/PropertyValueSchemaGenerator.js +0 -119
- package/src/schemaGenerators/app/src/schemas/ObjectSchemas/templates/DynamicAttributeTreeManagerSchemaTemplate.ejs +0 -14
- package/src/schemaGenerators/app/src/schemas/ObjectSchemas/templates/DynamicAttributeTreeStandardSchemaTemplate.ejs +0 -13
- package/src/schemaGenerators/app/src/schemas/ObjectSchemas/templates/DynamicPropertyValueSchemaTemplate.ejs +0 -15
- package/src/schemaGenerators/app/src/schemas/RelationshipSchemas/AttributeTreeRelationshipSchemaGenerator.js +0 -149
- package/src/schemaGenerators/app/src/schemas/RelationshipSchemas/PropertyValueRelationshipSchemaGenerator.js +0 -143
- package/src/schemaGenerators/app/src/schemas/RelationshipSchemas/templates/DynamicAttributeTreeRelationshipSchemaTemplate.ejs +0 -7
- package/src/schemaGenerators/app/src/schemas/RelationshipSchemas/templates/DynamicPropertyValueRelationshipSchemaTemplate.ejs +0 -7
- package/src/schemaGenerators/app/src/schemas/SystemTextSchemas/SystemTextGenerator.js +0 -102
- package/src/schemaGenerators/app/src/schemas/SystemTextSchemas/templates/SystemText_Template.ejs +0 -10
- package/test_schema.js +0 -2
- /package/src/{codeGenerators/app/src/generatedCode/Flow/_shared/handlers → emit/crud/templates}/FlowHandler_HdrApi.ejs +0 -0
- /package/src/{codeGenerators/app/src/generatedCode/Flow/_shared/handlers → emit/crud/templates}/FlowHandler_HdrInv.ejs +0 -0
- /package/src/{codeGenerators/app/src/generatedCode/Flow/FlowObjects/templates/crud → emit/crud/templates}/GetEndpoint_Main.ejs +0 -0
- /package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/ConfirmReserved_HdrSqs.ejs +0 -0
- /package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/CreatePreSignUrl_HdrSqs.ejs +0 -0
- /package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/ReservedLimit_HdrSqs.ejs +0 -0
- /package/src/{codeGenerators/app/src/generatedCode/Flow/_shared/handlers → emit/relationship/templates}/FlowHandler_HdrSqs.ejs +0 -0
- /package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessMoveRelationshipComplete_Main.ejs → emit/relationship/templates/MoveRelationshipComplete_Main.ejs} +0 -0
- /package/src/{codeGenerators/resource/sls_yaml → emit/resource}/templates/DynamoDBTable_Yaml.ejs +0 -0
- /package/src/{codeGenerators/resource/sls_yaml → emit/resource}/templates/FlowOut_Yaml.ejs +0 -0
- /package/src/{codeGenerators/resource/sls_yaml/templates/crud → emit/resource/templates}/ResourceYaml.ejs +0 -0
- /package/src/{codeGenerators/resource/sls_yaml → emit/resource}/templates/SystemDynamoDB_Yaml.ejs +0 -0
|
@@ -1,235 +0,0 @@
|
|
|
1
|
-
import path from 'path';
|
|
2
|
-
import fs from 'fs/promises';
|
|
3
|
-
import { fileURLToPath } from 'url';
|
|
4
|
-
import ejs from 'ejs';
|
|
5
|
-
import { getFlowOutputSubDir, isRbacFlow, isRelationshipFlow, isCrudFlow } from './flowClassifier.js';
|
|
6
|
-
import { getStepEventHandlerConfig, normalizeEvents } from './eventTypes.js';
|
|
7
|
-
import { normalizeFlowSteps } from './flowStepNormalizer.js';
|
|
8
|
-
import { getFlowsForGeneration } from './flowSelection.js';
|
|
9
|
-
import { upperFirst } from './flowNaming.js';
|
|
10
|
-
|
|
11
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
12
|
-
const __dirname = path.dirname(__filename);
|
|
13
|
-
|
|
14
|
-
export async function generateFlowSteps(allSchemas, options) {
|
|
15
|
-
console.log(' [FlowStepGenerator] Generating Custom FlowSteps...');
|
|
16
|
-
const baseOutputDir = path.join(options.outputPath, 'app', 'src', 'generatedCode');
|
|
17
|
-
|
|
18
|
-
// Read templates
|
|
19
|
-
const templates = {
|
|
20
|
-
main: await fs.readFile(path.join(__dirname, '..', '..', 'FlowSchemas', 'templates', 'step', 'FlowStep_Main.ejs'), 'utf-8'),
|
|
21
|
-
complete: await fs.readFile(path.join(__dirname, '..', '..', 'FlowObjects', 'templates', 'step', 'FlowEndpointComplete_Main.ejs'), 'utf-8'),
|
|
22
|
-
sqs: await fs.readFile(path.join(__dirname, '..', 'handlers', 'FlowHandler_HdrSqs.ejs'), 'utf-8'),
|
|
23
|
-
dsq: await fs.readFile(path.join(__dirname, '..', 'handlers', 'FlowHandler_HdrDsq.ejs'), 'utf-8'),
|
|
24
|
-
api: await fs.readFile(path.join(__dirname, '..', 'handlers', 'FlowHandler_HdrApi.ejs'), 'utf-8'),
|
|
25
|
-
inv: await fs.readFile(path.join(__dirname, '..', 'handlers', 'FlowHandler_HdrInv.ejs'), 'utf-8'),
|
|
26
|
-
|
|
27
|
-
// Advanced Custom Flow Logic Templates
|
|
28
|
-
pluginMain: await fs.readFile(path.join(__dirname, '..', '..', 'FlowSchemas', 'templates', 'step', 'plugIns', 'FlowStep_PlugIn_Main.ejs'), 'utf-8').catch(() => ''),
|
|
29
|
-
recievePluginMain: await fs.readFile(path.join(__dirname, '..', '..', 'FlowSchemas', 'templates', 'step', 'plugIns', 'FlowStep_RecievePlugIn_Main.ejs'), 'utf-8').catch(() => ''),
|
|
30
|
-
byConfigAwaitingMain: await fs.readFile(path.join(__dirname, '..', '..', 'FlowSchemas', 'templates', 'step', 'plugIns', 'FlowStep_ByConfig_Awaiting_Main.ejs'), 'utf-8').catch(() => ''),
|
|
31
|
-
byConfigPaginatedMain: await fs.readFile(path.join(__dirname, '..', '..', 'FlowSchemas', 'templates', 'step', 'plugIns', 'FlowStep_ByConfig_Paginated_Main.ejs'), 'utf-8').catch(() => ''),
|
|
32
|
-
templateAwaitingStep: path.join(__dirname, '..', '..', 'FlowSchemas', 'templates', 'step', 'plugIns', 'templateAwaitingStep.ejs'),
|
|
33
|
-
templateSendPlugin: path.join(__dirname, '..', '..', 'FlowSchemas', 'templates', 'step', 'plugIns', 'templateSendPlugin.ejs')
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
let generatedCount = 0;
|
|
37
|
-
|
|
38
|
-
const flows = getFlowsForGeneration(allSchemas);
|
|
39
|
-
for (const flow of flows) {
|
|
40
|
-
const flowTag = flow.flowTag;
|
|
41
|
-
|
|
42
|
-
// Skip custom flows (case-insensitive to prevent duplicate generation)
|
|
43
|
-
if (isRbacFlow(flowTag) || isRelationshipFlow(flowTag)) continue;
|
|
44
|
-
|
|
45
|
-
if (!flow.flowSteps) continue;
|
|
46
|
-
|
|
47
|
-
const subDir = getFlowOutputSubDir(flowTag);
|
|
48
|
-
|
|
49
|
-
// Result-Driven: Group by FlowTag/source
|
|
50
|
-
const upperCaseFlowTag = upperFirst(flowTag);
|
|
51
|
-
const flowOutputDir = path.join(baseOutputDir, subDir, upperCaseFlowTag, 'source');
|
|
52
|
-
|
|
53
|
-
let createdDir = false;
|
|
54
|
-
|
|
55
|
-
const normalizedSteps = normalizeFlowSteps(flow.flowSteps);
|
|
56
|
-
for (let index = 0; index < normalizedSteps.length; index++) {
|
|
57
|
-
const stepConfig = normalizedSteps[index];
|
|
58
|
-
const stepName = stepConfig.stepName;
|
|
59
|
-
|
|
60
|
-
// Skip the first step (which is the entry point, handled by flowMainFunctionBase)
|
|
61
|
-
// Also skip traditional skipped steps by name for backward compatibility
|
|
62
|
-
if (index === 0 || ['in', 'start', 'out', 'beforelogical'].includes(stepName?.toLowerCase())) continue;
|
|
63
|
-
|
|
64
|
-
if (!createdDir) {
|
|
65
|
-
await fs.mkdir(flowOutputDir, { recursive: true });
|
|
66
|
-
createdDir = true;
|
|
67
|
-
}
|
|
68
|
-
const mainFileName = `${upperCaseFlowTag}${stepName}_Main`;
|
|
69
|
-
|
|
70
|
-
// Advanced Config Parsing
|
|
71
|
-
const hasPlugInHooks = stepConfig.plugInHooks && stepConfig.plugInHooks.length > 0;
|
|
72
|
-
const handleLogic = stepConfig.settings?.handleLogic || 'none';
|
|
73
|
-
const childFlow = stepConfig.settings?.flowType || '';
|
|
74
|
-
|
|
75
|
-
// 1. Generate Main Logic File
|
|
76
|
-
let templateToUse = templates.main;
|
|
77
|
-
let renderData = {
|
|
78
|
-
flowTag: flowTag,
|
|
79
|
-
upperCaseFlowTag: upperCaseFlowTag,
|
|
80
|
-
upperFlowTag: upperCaseFlowTag,
|
|
81
|
-
flowStepName: stepName,
|
|
82
|
-
upperFlowStepName: upperFirst(stepName),
|
|
83
|
-
upperHandleLogic: upperFirst(handleLogic),
|
|
84
|
-
functionName: `${flowTag}${stepName}`,
|
|
85
|
-
};
|
|
86
|
-
|
|
87
|
-
const isCompleteStep = stepName === 'Complete' && isCrudFlow(flowTag);
|
|
88
|
-
// Base Step Generation
|
|
89
|
-
if (isCompleteStep) {
|
|
90
|
-
templateToUse = templates.complete;
|
|
91
|
-
} else if (hasPlugInHooks) {
|
|
92
|
-
templateToUse = templates.pluginMain;
|
|
93
|
-
|
|
94
|
-
const firstHook = stepConfig.plugInHooks[0];
|
|
95
|
-
let targetPlugIn = null;
|
|
96
|
-
const objSchema = allSchemas.objects ? allSchemas.objects.find(o => o.objectType === firstHook.objType?.objectType) : null;
|
|
97
|
-
if (objSchema && objSchema.plugIns) {
|
|
98
|
-
for (const plugInConfig of Object.values(objSchema.plugIns)) {
|
|
99
|
-
if (plugInConfig.plugInHooks) {
|
|
100
|
-
targetPlugIn = plugInConfig.plugInHooks.find(h => h.plugInHookTagType?.plugInHookTag === firstHook.plugInHookTag);
|
|
101
|
-
if (targetPlugIn) break;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
let targetUrl = targetPlugIn ? targetPlugIn.plugInHookTagType?.targetUrl : '';
|
|
107
|
-
let invokeType = targetPlugIn ? targetPlugIn.invocationType : 'sync';
|
|
108
|
-
if (invokeType === 'sync' && targetUrl) {
|
|
109
|
-
targetUrl += '/recievePlugInRequestSync';
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
Object.assign(renderData, {
|
|
113
|
-
havePlugIn: !!targetPlugIn,
|
|
114
|
-
invokeType: invokeType,
|
|
115
|
-
targetUrl: targetUrl,
|
|
116
|
-
handleLogic: handleLogic,
|
|
117
|
-
childFlow: childFlow,
|
|
118
|
-
mainObjType: firstHook.objType?.objectType || firstHook.objType,
|
|
119
|
-
templateAwaitingStep: templates.templateAwaitingStep,
|
|
120
|
-
templateSendPlugin: templates.templateSendPlugin
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
const mainContent = ejs.render(templateToUse, renderData);
|
|
125
|
-
await fs.writeFile(path.join(flowOutputDir, `${mainFileName}.js`), mainContent, 'utf-8');
|
|
126
|
-
generatedCount++;
|
|
127
|
-
|
|
128
|
-
// HandleLogic Extra Step Generation
|
|
129
|
-
if (handleLogic && handleLogic !== 'none') {
|
|
130
|
-
let logicTemplate = null;
|
|
131
|
-
let logicSuffix = '';
|
|
132
|
-
if (handleLogic === 'awaitingMultipleSteps') {
|
|
133
|
-
logicTemplate = templates.byConfigAwaitingMain;
|
|
134
|
-
logicSuffix = 'AwaitingMultipleSteps';
|
|
135
|
-
} else if (handleLogic === 'paginated') {
|
|
136
|
-
logicTemplate = templates.byConfigPaginatedMain;
|
|
137
|
-
logicSuffix = 'Paginated';
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
if (logicTemplate) {
|
|
141
|
-
const logicRenderData = { ...renderData, handleLogic, childFlow, mainObjType: '' };
|
|
142
|
-
const logicMainContent = ejs.render(logicTemplate, logicRenderData);
|
|
143
|
-
const logicMainFileName = `${upperCaseFlowTag}${upperFirst(stepName)}${logicSuffix}_Main`;
|
|
144
|
-
await fs.writeFile(path.join(flowOutputDir, `${logicMainFileName}.js`), logicMainContent, 'utf-8');
|
|
145
|
-
generatedCount++;
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
// 1.5 Generate RecievePlugIn Hooks (if any)
|
|
150
|
-
if (hasPlugInHooks && allSchemas.objects) {
|
|
151
|
-
// To avoid duplicate generation, we only generate these if they don't exist yet for the flow
|
|
152
|
-
const generatedRecieves = new Set();
|
|
153
|
-
for (const obj of allSchemas.objects) {
|
|
154
|
-
if (obj.recievePlugInHookTag) {
|
|
155
|
-
for (const recieveConfig of Object.values(obj.recievePlugInHookTag)) {
|
|
156
|
-
const recieveType = recieveConfig.flowType ? 'async' : 'sync';
|
|
157
|
-
const rFuncName = `recievePlugInHook${upperFirst(recieveType)}`;
|
|
158
|
-
if (generatedRecieves.has(rFuncName)) continue;
|
|
159
|
-
generatedRecieves.add(rFuncName);
|
|
160
|
-
|
|
161
|
-
const rMainContent = ejs.render(templates.recievePluginMain, {
|
|
162
|
-
functionName: rFuncName,
|
|
163
|
-
recieveType: recieveType,
|
|
164
|
-
flowTag: flowTag,
|
|
165
|
-
serviceTag: options.serviceTag || 'ServiceTag'
|
|
166
|
-
});
|
|
167
|
-
await fs.writeFile(path.join(flowOutputDir, `${rFuncName}_Main.js`), rMainContent, 'utf-8');
|
|
168
|
-
generatedCount++;
|
|
169
|
-
|
|
170
|
-
// Generate corresponding handler
|
|
171
|
-
const rHdrSuffix = recieveType === 'async' ? 'HdrWbs' : 'HdrApi'; // wbs for async, api for sync
|
|
172
|
-
const rHdrTemplate = recieveType === 'async' ? templates.sqs : templates.api; // Fallback to SQS/API structure
|
|
173
|
-
const rHdrContent = ejs.render(rHdrTemplate, {
|
|
174
|
-
flowTag: flowTag,
|
|
175
|
-
flowStepName: stepName,
|
|
176
|
-
mainFileName: `${rFuncName}_Main`,
|
|
177
|
-
functionName: rFuncName,
|
|
178
|
-
queueName: `${upperCaseFlowTag}${upperFirst(stepName)}Hdr${upperFirst(recieveType === 'async' ? 'Sqs' : 'Api')}`
|
|
179
|
-
});
|
|
180
|
-
await fs.writeFile(path.join(flowOutputDir, `${rFuncName}_${rHdrSuffix}.js`), rHdrContent, 'utf-8');
|
|
181
|
-
generatedCount++;
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
// 2. Generate Handlers based on stepConfig.event
|
|
188
|
-
const events = normalizeEvents(stepConfig.event, ['extTopic']); // Default to extTopic if missing
|
|
189
|
-
for (const ev of events) {
|
|
190
|
-
if (ev === 'sns') continue;
|
|
191
|
-
const handlerConfig = getStepEventHandlerConfig(ev);
|
|
192
|
-
const suffix = handlerConfig.suffix;
|
|
193
|
-
const targetTemplateStr = templates[handlerConfig.template] || templates.sqs;
|
|
194
|
-
|
|
195
|
-
const handlerFileName = `${upperCaseFlowTag}${stepName}_${suffix}`;
|
|
196
|
-
const handlerContent = ejs.render(targetTemplateStr, {
|
|
197
|
-
flowTag: flowTag,
|
|
198
|
-
flowStepName: stepName,
|
|
199
|
-
mainFileName: mainFileName,
|
|
200
|
-
functionName: `${flowTag}${stepName}`,
|
|
201
|
-
queueName: `${flowTag}${stepName}${suffix}`
|
|
202
|
-
});
|
|
203
|
-
await fs.writeFile(path.join(flowOutputDir, `${handlerFileName}.js`), handlerContent, 'utf-8');
|
|
204
|
-
generatedCount++;
|
|
205
|
-
|
|
206
|
-
// If handleLogic exists, also generate the extra handler for it
|
|
207
|
-
if (handleLogic && handleLogic !== 'none') {
|
|
208
|
-
let logicSuffix = '';
|
|
209
|
-
let logicTargetTemplateStr = templates.sqs;
|
|
210
|
-
if (handleLogic === 'awaitingMultipleSteps') {
|
|
211
|
-
logicSuffix = 'AwaitingMultipleStepsHdrSqs';
|
|
212
|
-
} else if (handleLogic === 'paginated') {
|
|
213
|
-
logicSuffix = 'PaginatedHdrDsq';
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
if (logicSuffix) {
|
|
217
|
-
const logicHandlerFileName = `${upperCaseFlowTag}${upperFirst(stepName)}${logicSuffix}`;
|
|
218
|
-
const logicMainFileName = `${upperCaseFlowTag}${upperFirst(stepName)}${logicSuffix.replace(/Hdr.*$/, '')}_Main`;
|
|
219
|
-
const logicHandlerContent = ejs.render(logicTargetTemplateStr, {
|
|
220
|
-
flowTag: flowTag,
|
|
221
|
-
flowStepName: stepName,
|
|
222
|
-
mainFileName: logicMainFileName,
|
|
223
|
-
functionName: `${stepName.toLowerCase()}Main`,
|
|
224
|
-
queueName: `${upperCaseFlowTag}${upperFirst(stepName)}${upperFirst(handleLogic)}`
|
|
225
|
-
});
|
|
226
|
-
await fs.writeFile(path.join(flowOutputDir, `${logicHandlerFileName}.js`), logicHandlerContent, 'utf-8');
|
|
227
|
-
generatedCount++;
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
console.log(` [FlowGenerator] Generated ${generatedCount} files for Custom FlowSteps.`);
|
|
235
|
-
}
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
export function normalizeFlowSteps(flowSteps) {
|
|
2
|
-
if (!flowSteps) return [];
|
|
3
|
-
|
|
4
|
-
if (Array.isArray(flowSteps)) {
|
|
5
|
-
return flowSteps
|
|
6
|
-
.filter(Boolean)
|
|
7
|
-
.map(step => ({ ...step, stepName: step.stepName || inferStepName(step) }))
|
|
8
|
-
.filter(step => step.stepName);
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
return Object.entries(flowSteps).map(([stepName, stepConfig]) => ({
|
|
12
|
-
...(stepConfig || {}),
|
|
13
|
-
stepName
|
|
14
|
-
}));
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export function hasFlowStep(flowSteps, stepName) {
|
|
18
|
-
return normalizeFlowSteps(flowSteps).some(step => step.stepName === stepName);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
function inferStepName(step) {
|
|
22
|
-
const reservedKeys = new Set([
|
|
23
|
-
'event', 'settings', 'plugInHooks', 'properties', 'messageAttributes',
|
|
24
|
-
'returnValues', 'startStep', 'stepName'
|
|
25
|
-
]);
|
|
26
|
-
const key = Object.keys(step).find(item => !reservedKeys.has(item));
|
|
27
|
-
return typeof step[key] === 'string' ? step[key] : key;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export function normalizeUnifiedFlows(rawFlows) {
|
|
31
|
-
return rawFlows.map(flow => {
|
|
32
|
-
if (!flow.flowSteps) return flow;
|
|
33
|
-
|
|
34
|
-
// Handle both array and object empty cases
|
|
35
|
-
if (Array.isArray(flow.flowSteps) && flow.flowSteps.length === 0) return flow;
|
|
36
|
-
if (!Array.isArray(flow.flowSteps) && Object.keys(flow.flowSteps).length === 0) return flow;
|
|
37
|
-
|
|
38
|
-
const normalizedSteps = normalizeFlowSteps(flow.flowSteps);
|
|
39
|
-
|
|
40
|
-
// Ensure flowSteps is always an Array for the rest of the generation process
|
|
41
|
-
flow.flowSteps = normalizedSteps;
|
|
42
|
-
|
|
43
|
-
// ponytail: root-level event is standard, flowStep[0] has no event.
|
|
44
|
-
if (flow.event) {
|
|
45
|
-
const firstStep = flow.flowSteps[0];
|
|
46
|
-
const needsStartStep = !firstStep || firstStep.event;
|
|
47
|
-
|
|
48
|
-
if (needsStartStep) {
|
|
49
|
-
flow.flowSteps.unshift({
|
|
50
|
-
stepName: 'Start',
|
|
51
|
-
properties: flow.properties || [],
|
|
52
|
-
messageAttributes: flow.messageAttributes || []
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
// Validate flowStep events
|
|
57
|
-
flow.flowSteps.forEach((step, index) => {
|
|
58
|
-
if (index === 0) {
|
|
59
|
-
if (step.event) {
|
|
60
|
-
throw new Error(`[Schema Error] Flow '${flow.flowTag || 'Unknown'}' -> stepName '${step.stepName}' (Index 0) must not have an 'event'. Set it at the flow root instead.`);
|
|
61
|
-
}
|
|
62
|
-
} else {
|
|
63
|
-
if (step.event) {
|
|
64
|
-
const validStepEvents = ['extTopic', 'lambdaSyncInv', 'dsq'];
|
|
65
|
-
const invalidEvents = step.event.filter(e => !validStepEvents.includes(e));
|
|
66
|
-
if (invalidEvents.length > 0) {
|
|
67
|
-
throw new Error(`[Schema Error] Flow '${flow.flowTag || 'Unknown'}' -> stepName '${step.stepName}' has invalid event: ${invalidEvents.join(', ')}. Allowed: ${validStepEvents.join(', ')}`);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
return flow;
|
|
74
|
-
});
|
|
75
|
-
}
|
|
@@ -1,236 +0,0 @@
|
|
|
1
|
-
import { TYPE_MAP } from './propertyNormalizer.js';
|
|
2
|
-
|
|
3
|
-
const ALLOWED_EVENTS = ['ownTopic', 'extTopic', 'lambdaSyncInv', 'lambdaSyncApi', 'eventBridge', 's3', 'dsq'];
|
|
4
|
-
const MAIN_ASYNC_EVENTS = ['ownTopic', 'extTopic', 's3'];
|
|
5
|
-
const RESERVED_SYSTEM_FLOW_TAGS = new Set([
|
|
6
|
-
'Create',
|
|
7
|
-
'Update',
|
|
8
|
-
'Delete',
|
|
9
|
-
'Get',
|
|
10
|
-
'CreateTargetRole',
|
|
11
|
-
'ListTargetRole',
|
|
12
|
-
'DeleteTargetRole',
|
|
13
|
-
'CreateRolePermissions',
|
|
14
|
-
'ListRolePermissions',
|
|
15
|
-
'DeleteRolePermissions',
|
|
16
|
-
'CreateUserRole',
|
|
17
|
-
'ListUserInRoles',
|
|
18
|
-
'DeleteUserFromRole',
|
|
19
|
-
'CreateRelationship',
|
|
20
|
-
'UpdateRelationship',
|
|
21
|
-
'DeleteRelationship',
|
|
22
|
-
'GetRelationship',
|
|
23
|
-
'ChangeRelationship',
|
|
24
|
-
'MoveRelationship'
|
|
25
|
-
]);
|
|
26
|
-
|
|
27
|
-
function asArray(value) {
|
|
28
|
-
if (!value) return [];
|
|
29
|
-
return Array.isArray(value) ? value : [value];
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
function validateNamedRefs(flowTag, stepName, refs, defs, label, errors) {
|
|
33
|
-
if (refs === undefined) return;
|
|
34
|
-
if (!Array.isArray(refs)) {
|
|
35
|
-
errors.push(`Flow '${flowTag}' step '${stepName}' ${label} must be an array.`);
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
for (const ref of refs) {
|
|
40
|
-
if (typeof ref === 'string') {
|
|
41
|
-
if (!defs || !defs[ref]) {
|
|
42
|
-
errors.push(`Flow '${flowTag}' step '${stepName}' references missing ${label} key '${ref}'.`);
|
|
43
|
-
}
|
|
44
|
-
continue;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
if (!ref || typeof ref !== 'object') {
|
|
48
|
-
errors.push(`Flow '${flowTag}' step '${stepName}' ${label} entries must be string keys or schema objects.`);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
function validateStepPropertyTypes(flowTag, propDefs, label, errors) {
|
|
54
|
-
if (!propDefs || typeof propDefs !== 'object') return;
|
|
55
|
-
const ALLOWED_TYPES = Object.keys(TYPE_MAP);
|
|
56
|
-
for (const [key, def] of Object.entries(propDefs)) {
|
|
57
|
-
if (!def || typeof def !== 'object') continue;
|
|
58
|
-
if (!def.type) {
|
|
59
|
-
errors.push(`Flow '${flowTag}' ${label} '${key}' is missing required field 'type'.`);
|
|
60
|
-
continue;
|
|
61
|
-
}
|
|
62
|
-
if (!ALLOWED_TYPES.includes(def.type)) {
|
|
63
|
-
errors.push(
|
|
64
|
-
`Flow '${flowTag}' ${label} '${key}' has unsupported type '${def.type}'. Allowed types are: ${ALLOWED_TYPES.join(', ')}.`
|
|
65
|
-
);
|
|
66
|
-
continue;
|
|
67
|
-
}
|
|
68
|
-
// enum: must supply enumValues array
|
|
69
|
-
if (def.type === 'enum') {
|
|
70
|
-
if (!Array.isArray(def.enumValues) || def.enumValues.length === 0) {
|
|
71
|
-
errors.push(
|
|
72
|
-
`Flow '${flowTag}' ${label} '${key}' has type 'enum' but is missing a non-empty 'enumValues' array.`
|
|
73
|
-
);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
// default: must match resolved primitive type
|
|
77
|
-
// 'mixed' type accepts any value, so skip the type check
|
|
78
|
-
if (def.default !== undefined && def.type !== 'mixed') {
|
|
79
|
-
const resolvedPrimitive = TYPE_MAP[def.type];
|
|
80
|
-
const actualType = Array.isArray(def.default) ? 'array' : typeof def.default;
|
|
81
|
-
const expectedType = resolvedPrimitive === 'array' ? 'array' : resolvedPrimitive;
|
|
82
|
-
if (expectedType && actualType !== expectedType) {
|
|
83
|
-
errors.push(
|
|
84
|
-
`Flow '${flowTag}' ${label} '${key}' has a 'default' value of type '${actualType}' but expected '${expectedType}' (from schema type '${def.type}').`
|
|
85
|
-
);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* Warn about stepProperties / stepMessageAttributes keys that are declared
|
|
93
|
-
* but never referenced in any step's properties or messageAttributes arrays.
|
|
94
|
-
*/
|
|
95
|
-
function validateUnusedStepProperties(flowTag, flow, errors) {
|
|
96
|
-
const stepProps = flow.stepProperties;
|
|
97
|
-
const stepMsgAttrs = flow.stepMessageAttributes;
|
|
98
|
-
if (!stepProps && !stepMsgAttrs) return;
|
|
99
|
-
|
|
100
|
-
const usedProps = new Set();
|
|
101
|
-
const usedAttrs = new Set();
|
|
102
|
-
|
|
103
|
-
for (const step of Array.isArray(flow.flowSteps) ? flow.flowSteps : []) {
|
|
104
|
-
for (const ref of Array.isArray(step.properties) ? step.properties : []) {
|
|
105
|
-
if (typeof ref === 'string') usedProps.add(ref);
|
|
106
|
-
}
|
|
107
|
-
for (const ref of Array.isArray(step.messageAttributes) ? step.messageAttributes : []) {
|
|
108
|
-
if (typeof ref === 'string') usedAttrs.add(ref);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
if (stepProps && typeof stepProps === 'object') {
|
|
113
|
-
for (const key of Object.keys(stepProps)) {
|
|
114
|
-
if (!usedProps.has(key)) {
|
|
115
|
-
errors.push(
|
|
116
|
-
`Flow '${flowTag}' stepProperties key '${key}' is declared but never referenced in any step's 'properties'.`
|
|
117
|
-
);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
if (stepMsgAttrs && typeof stepMsgAttrs === 'object') {
|
|
123
|
-
for (const key of Object.keys(stepMsgAttrs)) {
|
|
124
|
-
if (!usedAttrs.has(key)) {
|
|
125
|
-
errors.push(
|
|
126
|
-
`Flow '${flowTag}' stepMessageAttributes key '${key}' is declared but never referenced in any step's 'messageAttributes'.`
|
|
127
|
-
);
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/**
|
|
134
|
-
* Detect keys that appear in both stepProperties and stepMessageAttributes
|
|
135
|
-
* to prevent ambiguous naming.
|
|
136
|
-
*/
|
|
137
|
-
function validateDuplicateStepPropertyKeys(flowTag, flow, errors) {
|
|
138
|
-
const stepProps = flow.stepProperties;
|
|
139
|
-
const stepMsgAttrs = flow.stepMessageAttributes;
|
|
140
|
-
if (!stepProps || !stepMsgAttrs) return;
|
|
141
|
-
|
|
142
|
-
const propKeys = new Set(Object.keys(stepProps));
|
|
143
|
-
for (const key of Object.keys(stepMsgAttrs)) {
|
|
144
|
-
if (propKeys.has(key)) {
|
|
145
|
-
errors.push(
|
|
146
|
-
`Flow '${flowTag}' key '${key}' is declared in both 'stepProperties' and 'stepMessageAttributes'. Keys must be unique across both groups.`
|
|
147
|
-
);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
export function validateFlowsForGeneration(flows) {
|
|
153
|
-
const errors = [];
|
|
154
|
-
const seenCustomFlowTags = new Set();
|
|
155
|
-
|
|
156
|
-
for (const flow of flows) {
|
|
157
|
-
const flowTag = flow?.flowTag;
|
|
158
|
-
if (!flowTag) {
|
|
159
|
-
errors.push('Flow is missing flowTag.');
|
|
160
|
-
continue;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
const isSystemFlow = flow.initiateBy === 'system';
|
|
164
|
-
if (!isSystemFlow) {
|
|
165
|
-
if (seenCustomFlowTags.has(flowTag)) {
|
|
166
|
-
errors.push(`Flow '${flowTag}' is defined more than once.`);
|
|
167
|
-
}
|
|
168
|
-
seenCustomFlowTags.add(flowTag);
|
|
169
|
-
|
|
170
|
-
if (RESERVED_SYSTEM_FLOW_TAGS.has(flowTag)) {
|
|
171
|
-
errors.push(`Flow '${flowTag}' is reserved by a system flow. Please use a different flowTag.`);
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
const events = asArray(flow.event);
|
|
176
|
-
const invalidMainEvents = events.filter(event => !ALLOWED_EVENTS.includes(event));
|
|
177
|
-
if (invalidMainEvents.length > 0) {
|
|
178
|
-
errors.push(`Flow '${flowTag}' uses unsupported main events: ${invalidMainEvents.join(', ')}. Allowed are: ${ALLOWED_EVENTS.join(', ')}.`);
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
const mainAsyncEvents = events.filter(event => MAIN_ASYNC_EVENTS.includes(event));
|
|
182
|
-
if (mainAsyncEvents.length > 1) {
|
|
183
|
-
errors.push(`Flow '${flowTag}' multiple main async triggers: ${mainAsyncEvents.join(', ')}. Only one is allowed.`);
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
const flowSteps = Array.isArray(flow.flowSteps) ? flow.flowSteps : [];
|
|
187
|
-
const seenStepNames = new Set();
|
|
188
|
-
let anyStepHasPlugInHooks = false;
|
|
189
|
-
|
|
190
|
-
for (const step of flowSteps) {
|
|
191
|
-
const stepName = step?.stepName;
|
|
192
|
-
if (!stepName) {
|
|
193
|
-
errors.push(`Flow '${flowTag}' has a step without stepName.`);
|
|
194
|
-
continue;
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
if (seenStepNames.has(stepName)) {
|
|
198
|
-
errors.push(`Flow '${flowTag}' has duplicate stepName '${stepName}'.`);
|
|
199
|
-
}
|
|
200
|
-
seenStepNames.add(stepName);
|
|
201
|
-
|
|
202
|
-
if (step.plugInHooks && step.plugInHooks.length > 0) {
|
|
203
|
-
anyStepHasPlugInHooks = true;
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
const stepEvents = asArray(step.event);
|
|
207
|
-
const invalidStepEvents = stepEvents.filter(event => !ALLOWED_EVENTS.includes(event));
|
|
208
|
-
if (invalidStepEvents.length > 0) {
|
|
209
|
-
errors.push(`Flow '${flowTag}' step '${stepName}' uses unsupported step events: ${invalidStepEvents.join(', ')}. Allowed are: ${ALLOWED_EVENTS.join(', ')}.`);
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
validateNamedRefs(flowTag, stepName, step.properties, flow.stepProperties, 'properties', errors);
|
|
213
|
-
validateNamedRefs(flowTag, stepName, step.messageAttributes, flow.stepMessageAttributes, 'messageAttributes', errors);
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
validateStepPropertyTypes(flowTag, flow.stepProperties, 'stepProperties', errors);
|
|
217
|
-
validateStepPropertyTypes(flowTag, flow.stepMessageAttributes, 'stepMessageAttributes', errors);
|
|
218
|
-
validateDuplicateStepPropertyKeys(flowTag, flow, errors);
|
|
219
|
-
validateUnusedStepProperties(flowTag, flow, errors);
|
|
220
|
-
|
|
221
|
-
// ponytail: relaxed anyStepHasPlugInHooks requirement
|
|
222
|
-
// since unified entry points (step 0) can now handle plugins directly without start.
|
|
223
|
-
|
|
224
|
-
if (anyStepHasPlugInHooks) {
|
|
225
|
-
const forbiddenEvents = ['lambdaSyncInv', 'lambdaSyncApi', 's3', 'eventBridge'];
|
|
226
|
-
const usedForbiddenEvents = events.filter(event => forbiddenEvents.includes(event));
|
|
227
|
-
if (usedForbiddenEvents.length > 0) {
|
|
228
|
-
errors.push(`Flow '${flowTag}' uses plugInHooks with unsupported main events: ${usedForbiddenEvents.join(', ')}. plugInHooks are allowed only for async/event-driven flows.`);
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
if (errors.length > 0) {
|
|
234
|
-
throw new Error('Flow Validation Failed:\n' + errors.map(error => `- ${error}`).join('\n'));
|
|
235
|
-
}
|
|
236
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { consts } from '@izara_project/izara-shared-service-schemas';
|
|
2
|
-
|
|
3
|
-
export const TYPE_MAP = consts.FIELDNAME_TYPE_MAPPING;
|
|
4
|
-
|
|
5
|
-
export function normalizePropertyType(p, lookupSource) {
|
|
6
|
-
let prop = typeof p === 'string'
|
|
7
|
-
? ((lookupSource && lookupSource[p]) ? lookupSource[p] : { propertyName: p, type: 'string' })
|
|
8
|
-
: p;
|
|
9
|
-
|
|
10
|
-
if (prop && prop.type) {
|
|
11
|
-
prop = { ...prop, type: TYPE_MAP[prop.type] || prop.type };
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
return prop;
|
|
15
|
-
}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { getFlowsForGeneration } from './flowSelection.js';
|
|
2
|
-
import { isCrudFlow, isRbacFlow, isRelationshipFlow } from './flowClassifier.js';
|
|
3
|
-
|
|
4
|
-
export const FLOW_OBJECTS_ROLE = 'FlowObjectsRole';
|
|
5
|
-
export const FLOW_RBAC_ROLE = 'FlowRbacRole';
|
|
6
|
-
export const FLOW_RELATIONSHIP_ROLE = 'FlowRelationshipRole';
|
|
7
|
-
export const WEB_SOCKET_MAIN_ROLE = 'WebSocketMainRole';
|
|
8
|
-
export const PROC_FIND_DATA_ROLE = 'ProcFindDataRole';
|
|
9
|
-
|
|
10
|
-
function upperCase(str) {
|
|
11
|
-
if (!str) return str;
|
|
12
|
-
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
function isCustomRbacFlow(flowTag) {
|
|
16
|
-
return String(flowTag || '').toLowerCase().endsWith('rbacflow');
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export function detectRoleNames(allSchemas) {
|
|
20
|
-
const flows = getFlowsForGeneration(allSchemas);
|
|
21
|
-
const roleNames = new Set([PROC_FIND_DATA_ROLE]);
|
|
22
|
-
|
|
23
|
-
for (const flow of flows) {
|
|
24
|
-
if (!flow.flowTag) continue;
|
|
25
|
-
|
|
26
|
-
if (isCrudFlow(flow.flowTag)) {
|
|
27
|
-
roleNames.add(FLOW_OBJECTS_ROLE);
|
|
28
|
-
continue;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
if (isRbacFlow(flow.flowTag) || isCustomRbacFlow(flow.flowTag)) {
|
|
32
|
-
roleNames.add(FLOW_RBAC_ROLE);
|
|
33
|
-
continue;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
if (isRelationshipFlow(flow.flowTag)) {
|
|
37
|
-
roleNames.add(FLOW_RELATIONSHIP_ROLE);
|
|
38
|
-
continue;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
if ((flow.event || []).includes('ownTopic')) {
|
|
42
|
-
roleNames.add(WEB_SOCKET_MAIN_ROLE);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
roleNames.add(`${upperCase(flow.flowTag)}Role`);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
return { flows, roleNames };
|
|
49
|
-
}
|