@izara_project/izara-core-generate-service-code 1.0.65 → 1.0.67
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/docs/TriggeredCache Flow.drawio +193 -0
- package/docs/test.mmd +47 -0
- package/docs/test.png +0 -0
- package/index.js +0 -5
- package/package.json +7 -6
- package/src/compile/compileProject.js +26 -0
- package/src/compile/loadSchemas.js +50 -0
- package/src/emit/crud/dynamicCrudFlowSchemaTemplate.js +11 -0
- package/src/emit/crud/emitCrudApplicationArtifacts.js +161 -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 +6 -6
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowObjects/templates/crud → emit/crud/templates}/DeleteEndpoint_Main.ejs +6 -6
- 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 +96 -0
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/endpoint → emit/crud/templates}/FlowEndpoint_HdrWbs.ejs +1 -1
- package/src/emit/crud/templates/FlowHandler_HdrApi.ejs +69 -0
- 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/{codeGenerators/app/src/generatedCode/Flow/FlowObjects/templates/crud → emit/crud/templates}/GetEndpoint_Main.ejs +2 -2
- 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 +11 -9
- package/src/emit/custom/customFlows.js +121 -0
- package/src/emit/custom/emitCustomFlowApplicationArtifacts.js +325 -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 +5 -5
- 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 +125 -0
- package/src/emit/rbac/emitDynamicRbacFlowSchemas.js +117 -0
- package/src/emit/rbac/emitRbacApplicationArtifacts.js +270 -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 +148 -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} +12 -4
- 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/{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 +595 -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 +183 -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 +297 -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 -332
- 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 -503
- package/src/codeGenerators/app/sls_yaml/__tests__/SharedResourceYamlGenerator.test.js +0 -235
- package/src/codeGenerators/app/sls_yaml/_policy/PolicyRegistry.js +0 -56
- package/src/codeGenerators/app/sls_yaml/_policy/__tests__/PolicyRegistry.test.js +0 -33
- 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 -63
- 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 -94
- 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 -33
- 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 -51
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/lambdaSyncInv.js +0 -51
- 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 -267
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/propertyNormalizer.js +0 -18
- 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 -357
- 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 -109
- package/src/schemaGenerators/app/src/schemas/RelationshipSchemas/PropertyValueRelationshipSchemaGenerator.js +0 -103
- package/src/schemaGenerators/app/src/schemas/RelationshipSchemas/__tests__/relationshipSchemaHelpers.test.js +0 -38
- package/src/schemaGenerators/app/src/schemas/RelationshipSchemas/relationshipSchemaHelpers.js +0 -40
- 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/src/{codeGenerators/app/src/generatedCode/Flow/_shared/handlers → emit/crud/templates}/FlowHandler_HdrInv.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_HdrApi.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
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { execFile } from 'node:child_process';
|
|
3
|
+
import { access, mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
|
|
4
|
+
import { tmpdir } from 'node:os';
|
|
5
|
+
import { dirname, join, resolve } from 'node:path';
|
|
6
|
+
import { promisify } from 'node:util';
|
|
7
|
+
import test, { after } from 'node:test';
|
|
8
|
+
|
|
9
|
+
import { generateCustomFlowApplicationArtifacts } from '../src/emit/custom/generateCustomFlowApplicationArtifacts.js';
|
|
10
|
+
import { generateResourceArtifacts } from '../src/emit/resource/generateResourceArtifacts.js';
|
|
11
|
+
import { renderEventBridgeFunctionYaml } from '../src/emit/function/functionYamlArtifact.js';
|
|
12
|
+
|
|
13
|
+
const roots = new Set();
|
|
14
|
+
const execFileAsync = promisify(execFile);
|
|
15
|
+
const parseEsmSource = `
|
|
16
|
+
import { readFile } from 'node:fs/promises';
|
|
17
|
+
import { SourceTextModule } from 'node:vm';
|
|
18
|
+
const path = process.argv[1];
|
|
19
|
+
new SourceTextModule(await readFile(path, 'utf8'), { identifier: path });
|
|
20
|
+
`;
|
|
21
|
+
after(() => Promise.all([...roots].map(root => rm(root, { recursive: true, force: true }))));
|
|
22
|
+
|
|
23
|
+
test('emits handlers, function YAML, and IAM roles for supported custom flow events', async () => {
|
|
24
|
+
const rootPath = await createProject();
|
|
25
|
+
const result = await generateCustomFlowApplicationArtifacts(rootPath);
|
|
26
|
+
await generateResourceArtifacts(rootPath);
|
|
27
|
+
|
|
28
|
+
assert.equal(result.files.length, 38);
|
|
29
|
+
assert.match(await readFile(join(rootPath, 'app/src/generatedCode/FlowSchemas/Ext/source/Ext_HdrSqs.js'), 'utf8'), /dummyId/);
|
|
30
|
+
assert.match(await readFile(join(rootPath, 'app/src/generatedCode/FlowSchemas/Api/source/Api_HdrApi.js'), 'utf8'), /Api/);
|
|
31
|
+
const yaml = await readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/flow-schema.yml'), 'utf8');
|
|
32
|
+
assert.match(yaml, /EventHdrInv:/);
|
|
33
|
+
assert.match(yaml, /rate\(1 minute\)/);
|
|
34
|
+
assert.match(yaml, /ExtHdrSqs:/);
|
|
35
|
+
const iam = await readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/generate-shared-resource.yml'), 'utf8');
|
|
36
|
+
assert.match(iam, /EventRole:/);
|
|
37
|
+
assert.match(iam, /ExtRole:/);
|
|
38
|
+
assert.match(iam, /InvRole:/);
|
|
39
|
+
assert.match(iam, /ApiRole:/);
|
|
40
|
+
assert.match(iam, /OwnRole:/);
|
|
41
|
+
assert.match(iam, /UploadRole:/);
|
|
42
|
+
assert.match(await readFile(join(rootPath, 'app/src/generatedCode/FlowSchemas/Generated/source/Generated_HdrWbs.js'), 'utf8'), /Generated_WbsMain/);
|
|
43
|
+
assert.match(await readFile(join(rootPath, 'app/src/generatedCode/FlowSchemas/Own/source/Own_HdrSqs.js'), 'utf8'), /Own_Main/);
|
|
44
|
+
assert.match(
|
|
45
|
+
await readFile(join(rootPath, 'app/src/generatedCode/FlowSchemas/Own/source/Own_Main.js'), 'utf8'),
|
|
46
|
+
/asyncFlowSharedLib/
|
|
47
|
+
);
|
|
48
|
+
assert.match(
|
|
49
|
+
await readFile(join(rootPath, 'app/src/generatedCode/FlowSchemas/Cache/source/Cache_Main.js'), 'utf8'),
|
|
50
|
+
/"CurrentOrderTable"/
|
|
51
|
+
);
|
|
52
|
+
await assert.rejects(readFile(join(rootPath, 'app/src/generatedCode/FlowSchemas/Own/source/ProcessOwn_Main.js')));
|
|
53
|
+
assert.match(await readFile(join(rootPath, 'app/src/generatedCode/FlowSchemas/Mixed/source/Mixed_HdrSqs.js'), 'utf8'), /Mixed/);
|
|
54
|
+
assert.match(yaml, /OwnHdrWbs:/);
|
|
55
|
+
assert.match(yaml, /OwnHdrSqs:/);
|
|
56
|
+
assert.ok(yaml.indexOf('OwnHdrWbs:') < yaml.indexOf('OwnHdrSqs:'));
|
|
57
|
+
assert.match(yaml, /MixedHdrSqs:/);
|
|
58
|
+
assert.match(yaml, /UploadProcessAfterUploadHdrS3:/);
|
|
59
|
+
assert.match(
|
|
60
|
+
await readFile(join(rootPath, 'app/src/generatedCode/FlowSchemas/Upload/source/UploadProcessAfterUpload_Main.js'), 'utf8'),
|
|
61
|
+
/S3Client/
|
|
62
|
+
);
|
|
63
|
+
assert.match(
|
|
64
|
+
await readFile(join(rootPath, 'app/src/generatedCode/FlowSchemas/Upload/source/UploadCreatePreSignUrl_Main.js'), 'utf8'),
|
|
65
|
+
/createPresignedPost/
|
|
66
|
+
);
|
|
67
|
+
assert.match(
|
|
68
|
+
await readFile(join(rootPath, 'app/src/generatedCode/FlowSchemas/Upload/source/UploadConfirmAfterUpload_Main.js'), 'utf8'),
|
|
69
|
+
/confirmUsageMessage/
|
|
70
|
+
);
|
|
71
|
+
for (const path of [
|
|
72
|
+
'UploadCreateObject_Main.js',
|
|
73
|
+
'UploadReservedLimit_Main.js',
|
|
74
|
+
'UploadCreatePreSignUrl_Main.js',
|
|
75
|
+
'UploadConfirmAfterUpload_Main.js'
|
|
76
|
+
]) {
|
|
77
|
+
assert.doesNotMatch(
|
|
78
|
+
await readFile(join(rootPath, `app/src/generatedCode/FlowSchemas/Upload/source/${path}`), 'utf8'),
|
|
79
|
+
/@izara_project\/izara-core-generate-service-code/
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
assert.match(
|
|
83
|
+
await readFile(join(rootPath, 'app/src/generatedCode/FlowSchemas/Upload/source/UploadProcessAfterUpload_HdrS3.js'), 'utf8'),
|
|
84
|
+
/s3Record\.bucket,\n\s*s3Record\.object/
|
|
85
|
+
);
|
|
86
|
+
for (const path of [
|
|
87
|
+
'UploadCreateObject_Main.js',
|
|
88
|
+
'UploadCreateObject_HdrWbs.js',
|
|
89
|
+
'UploadReservedLimit_Main.js',
|
|
90
|
+
'UploadReservedLimit_HdrSqs.js',
|
|
91
|
+
'UploadCreatePreSignUrl_Main.js',
|
|
92
|
+
'UploadCreatePreSignUrl_HdrSqs.js',
|
|
93
|
+
'UploadProcessAfterUpload_Main.js',
|
|
94
|
+
'UploadProcessAfterUpload_HdrS3.js',
|
|
95
|
+
'UploadConfirmAfterUpload_Main.js',
|
|
96
|
+
'UploadConfirmAfterUpload_HdrSqs.js'
|
|
97
|
+
]) {
|
|
98
|
+
await parseAsEsm(join(rootPath, `app/src/generatedCode/FlowSchemas/Upload/source/${path}`));
|
|
99
|
+
}
|
|
100
|
+
for (const path of ['UploadReservedLimit_Main.js', 'UploadCreatePreSignUrl_Main.js', 'UploadConfirmAfterUpload_Main.js']) {
|
|
101
|
+
const filePath = join(rootPath, `app/src/generatedCode/FlowSchemas/Upload/source/${path}`);
|
|
102
|
+
const source = await readFile(filePath, 'utf8');
|
|
103
|
+
const helperPath = source.match(/from '((?:\.\.\/)+libs\/source\/GenerateCodeLibs\.js)'/)?.[1];
|
|
104
|
+
assert.ok(helperPath, `${path} imports GenerateCodeLibs`);
|
|
105
|
+
await access(resolve(dirname(filePath), helperPath));
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
test('removes only V2-owned custom-flow application artifacts when supported events are removed', async () => {
|
|
110
|
+
const rootPath = await createProject();
|
|
111
|
+
await generateCustomFlowApplicationArtifacts(rootPath);
|
|
112
|
+
await writeFile(join(rootPath, 'app/src/schemas/FlowSchemas/Flows.js'), "export default [{ flowTag: 'later', event: ['unsupported'] }];\n");
|
|
113
|
+
|
|
114
|
+
assert.deepEqual((await generateCustomFlowApplicationArtifacts(rootPath)).files, []);
|
|
115
|
+
await assert.rejects(readFile(join(rootPath, 'app/src/generatedCode/FlowSchemas/Ext/source/Ext_HdrSqs.js')));
|
|
116
|
+
await assert.rejects(readFile(join(rootPath, 'app/src/generatedCode/FlowSchemas/Own/source/Own_HdrWbs.js')));
|
|
117
|
+
await assert.rejects(readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/flow-schema.yml')));
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
test('emits and removes ext-topic handlers declared by custom flow steps', async () => {
|
|
121
|
+
const rootPath = await createStepProject();
|
|
122
|
+
const result = await generateCustomFlowApplicationArtifacts(rootPath);
|
|
123
|
+
await generateResourceArtifacts(rootPath);
|
|
124
|
+
|
|
125
|
+
assert.ok(result.files.some(file => file.path === 'app/src/generatedCode/FlowSchemas/Stepped/source/SteppedComplete_HdrSqs.js'));
|
|
126
|
+
assert.ok(result.files.some(file => file.path === 'app/src/generatedCode/FlowSchemas/Generated/source/GeneratedComplete_HdrSqs.js'));
|
|
127
|
+
assert.ok(result.files.some(file => file.path === 'app/src/generatedCode/FlowSchemas/DsqStep/source/DsqStepRetryDsq_HdrDsq.js'));
|
|
128
|
+
assert.match(
|
|
129
|
+
await readFile(join(rootPath, 'app/src/generatedCode/FlowSchemas/Stepped/source/SteppedComplete_Main.js'), 'utf8'),
|
|
130
|
+
/identifierUuid/
|
|
131
|
+
);
|
|
132
|
+
assert.match(
|
|
133
|
+
await readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/flow-schema.yml'), 'utf8'),
|
|
134
|
+
/SteppedCompleteHdrSqs:\n handler: src\/generatedCode\/FlowSchemas\/Stepped\/source\/SteppedComplete_HdrSqs.main/
|
|
135
|
+
);
|
|
136
|
+
assert.match(
|
|
137
|
+
await readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/flow-schema.yml'), 'utf8'),
|
|
138
|
+
/DsqStepRetryDsqHdrDsq:\n handler: src\/generatedCode\/FlowSchemas\/DsqStep\/source\/DsqStepRetryDsq_HdrDsq.main/
|
|
139
|
+
);
|
|
140
|
+
assert.match(
|
|
141
|
+
await readFile(join(rootPath, 'resource/sls_yaml/generatedCode/source/generated-sns-in-sqs.yml'), 'utf8'),
|
|
142
|
+
/^ SteppedCompleteHdrSqs:/m
|
|
143
|
+
);
|
|
144
|
+
assert.match(
|
|
145
|
+
await readFile(join(rootPath, 'resource/sls_yaml/generatedCode/source/generated-sns-in-sqs.yml'), 'utf8'),
|
|
146
|
+
/^ DsqStepRetryDsqHdrDsq:/m
|
|
147
|
+
);
|
|
148
|
+
assert.match(
|
|
149
|
+
await readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/generate-shared-resource.yml'), 'utf8'),
|
|
150
|
+
/GeneratedRole:/
|
|
151
|
+
);
|
|
152
|
+
|
|
153
|
+
await writeFile(join(rootPath, 'app/src/schemas/FlowSchemas/Stepped.js'), "export default { flowTag: 'stepped', event: ['ownTopic'] };\n");
|
|
154
|
+
await writeFile(join(rootPath, 'app/src/schemas/FlowSchemas/Generated.js'), "export default { flowTag: 'generated', event: ['ownTopic'], generatedCodeConfig: { generatedCodeTag: 'create' } };\n");
|
|
155
|
+
await generateCustomFlowApplicationArtifacts(rootPath);
|
|
156
|
+
await generateResourceArtifacts(rootPath);
|
|
157
|
+
|
|
158
|
+
await assert.rejects(readFile(join(rootPath, 'app/src/generatedCode/FlowSchemas/Stepped/source/SteppedComplete_HdrSqs.js')));
|
|
159
|
+
await assert.rejects(readFile(join(rootPath, 'app/src/generatedCode/FlowSchemas/Generated/source/GeneratedComplete_HdrSqs.js')));
|
|
160
|
+
assert.doesNotMatch(
|
|
161
|
+
await readFile(join(rootPath, 'resource/sls_yaml/generatedCode/source/generated-sns-in-sqs.yml'), 'utf8'),
|
|
162
|
+
/^ SteppedCompleteHdrSqs:/m
|
|
163
|
+
);
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
test('emits and removes the legacy trigger-cache artifact suite', async () => {
|
|
167
|
+
const rootPath = await createTriggerCacheProject();
|
|
168
|
+
await generateCustomFlowApplicationArtifacts(rootPath);
|
|
169
|
+
await generateResourceArtifacts(rootPath);
|
|
170
|
+
|
|
171
|
+
const source = 'app/src/generatedCode/FlowSchemas/Cart/source';
|
|
172
|
+
for (const fileName of [
|
|
173
|
+
'CartCheckTriggerCacheCartComplete_Main.js',
|
|
174
|
+
'CartCheckTriggerCacheCartComplete_HdrSqs.js',
|
|
175
|
+
'CartTriggerCacheCartComplete_Main.js',
|
|
176
|
+
'CartTriggerCacheCartComplete_HdrSqs.js'
|
|
177
|
+
]) {
|
|
178
|
+
const path = join(rootPath, source, fileName);
|
|
179
|
+
await access(path);
|
|
180
|
+
await parseAsEsm(path);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
const flowYaml = await readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/flow-schema.yml'), 'utf8');
|
|
184
|
+
for (const functionName of [
|
|
185
|
+
'CartCheckTriggerCacheCartCompleteHdrSqs',
|
|
186
|
+
'CartTriggerCacheCartCompleteHdrSqs'
|
|
187
|
+
]) {
|
|
188
|
+
assert.match(flowYaml, new RegExp(`^${functionName}:`, 'm'));
|
|
189
|
+
}
|
|
190
|
+
assert.match(
|
|
191
|
+
await readFile(join(rootPath, `${source}/CartCheckTriggerCacheCartComplete_HdrSqs.js`), 'utf8'),
|
|
192
|
+
/record\.body\.Message\.identifiers/
|
|
193
|
+
);
|
|
194
|
+
|
|
195
|
+
const resources = await readFile(join(rootPath, 'resource/sls_yaml/generatedCode/source/generated-sns-in-sqs.yml'), 'utf8');
|
|
196
|
+
assert.match(resources, /^ CartHdrSqs:/m);
|
|
197
|
+
for (const queueName of [
|
|
198
|
+
'CartHdrSqs',
|
|
199
|
+
'CartCheckTriggerCacheCartCompleteHdrSqs',
|
|
200
|
+
'CartTriggerCacheCartCompleteHdrSqs',
|
|
201
|
+
'CartTriggerCacheCartCompleteHdrDsq'
|
|
202
|
+
]) assert.match(resources, new RegExp('QueueName: \\$\\{self:custom\\.iz_resourcePrefix\\}' + queueName));
|
|
203
|
+
const iam = await readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/generate-shared-resource.yml'), 'utf8');
|
|
204
|
+
|
|
205
|
+
await writeFile(join(rootPath, 'app/src/schemas/FlowSchemas/Cart.js'), "export default { flowTag: 'cart', event: ['ownTopic'], statusType: 'none' };\n");
|
|
206
|
+
await generateCustomFlowApplicationArtifacts(rootPath);
|
|
207
|
+
await generateResourceArtifacts(rootPath);
|
|
208
|
+
|
|
209
|
+
await assert.rejects(readFile(join(rootPath, `${source}/CartCheckTriggerCacheCartComplete_Main.js`)));
|
|
210
|
+
assert.doesNotMatch(await readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/flow-schema.yml'), 'utf8'), /CartCheckTriggerCacheCartCompleteHdrSqs/);
|
|
211
|
+
assert.doesNotMatch(await readFile(join(rootPath, 'resource/sls_yaml/generatedCode/source/generated-sns-in-sqs.yml'), 'utf8'), /CartTriggerCacheCartCompleteHdrDsq/);
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
test('rejects an EventBridge schedule without a deployable name and rate', () => {
|
|
215
|
+
assert.throws(
|
|
216
|
+
() => renderEventBridgeFunctionYaml({
|
|
217
|
+
functionName: 'ProcessEventHdrInv',
|
|
218
|
+
handlerPath: 'src/generatedCode/FlowSchemas/Event/source/ProcessEvent_HdrInv.main',
|
|
219
|
+
roleName: 'EventRole',
|
|
220
|
+
flowTag: 'Event',
|
|
221
|
+
schedules: [{ name: 'missing-rate' }]
|
|
222
|
+
}),
|
|
223
|
+
/Each EventBridge schedule/
|
|
224
|
+
);
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
async function createProject() {
|
|
228
|
+
const rootPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-custom-flow-'));
|
|
229
|
+
roots.add(rootPath);
|
|
230
|
+
const schemaRoot = join(rootPath, 'app/src/schemas/FlowSchemas');
|
|
231
|
+
const objectSchemaRoot = join(rootPath, 'app/src/schemas/ObjectSchemas');
|
|
232
|
+
const helperRoot = join(rootPath, 'app/src/generatedCode/libs/source');
|
|
233
|
+
await Promise.all([mkdir(schemaRoot, { recursive: true }), mkdir(objectSchemaRoot, { recursive: true }), mkdir(helperRoot, { recursive: true })]);
|
|
234
|
+
await writeFile(join(helperRoot, 'GenerateCodeLibs.js'), 'export const getNestObject = () => {};\nexport const processStaticLimit = () => {};\nexport const postToConnection = () => {};\n');
|
|
235
|
+
await writeFile(
|
|
236
|
+
join(objectSchemaRoot, 'Order.js'),
|
|
237
|
+
"export default [{ objectType: 'order', serviceTag: 'Other', storageResources: { main: { storageType: 'dynamoDB', tableName: 'OtherOrderTable' } } }, { objectType: 'order', serviceTag: 'Current', storageResources: { main: { storageType: 'dynamoDB', tableName: 'CurrentOrderTable' } } }];\n"
|
|
238
|
+
);
|
|
239
|
+
await writeFile(join(schemaRoot, 'Flows.js'), `
|
|
240
|
+
const base = { flowSteps: [{ stepName: 'start', properties: ['dummyId'] }], stepProperties: { dummyId: { type: 'string' } } };
|
|
241
|
+
export default [
|
|
242
|
+
{ ...base, flowTag: 'event', event: ['eventBridge'], schedules: [{ name: 'every-minute', rate: ['rate(1 minute)'] }] },
|
|
243
|
+
{ ...base, flowTag: 'ext', event: ['extTopic'] },
|
|
244
|
+
{ ...base, flowTag: 'inv', event: ['lambdaSyncInv'] },
|
|
245
|
+
{ ...base, flowTag: 'api', event: ['lambdaSyncApi'] },
|
|
246
|
+
{ ...base, flowTag: 'own', event: ['ownTopic'] },
|
|
247
|
+
{ ...base, flowTag: 'cache', event: ['ownTopic'], statusType: 'storedCache', objType: { objectType: 'order', serviceTag: 'Current' } },
|
|
248
|
+
{ ...base, flowTag: 'mixed', event: ['ownTopic', 'extTopic'] },
|
|
249
|
+
{ ...base, flowTag: 'generated', event: ['ownTopic'], generatedCodeConfig: { generatedCodeTag: 'create' } },
|
|
250
|
+
{ ...base, flowTag: 'upload', event: ['s3'] }
|
|
251
|
+
];
|
|
252
|
+
`);
|
|
253
|
+
return rootPath;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
async function parseAsEsm(path) {
|
|
257
|
+
await execFileAsync(process.execPath, [
|
|
258
|
+
'--experimental-vm-modules',
|
|
259
|
+
'--input-type=module',
|
|
260
|
+
'--eval',
|
|
261
|
+
parseEsmSource,
|
|
262
|
+
'--',
|
|
263
|
+
path
|
|
264
|
+
]);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
async function createStepProject() {
|
|
268
|
+
const rootPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-custom-step-'));
|
|
269
|
+
roots.add(rootPath);
|
|
270
|
+
const schemaRoot = join(rootPath, 'app/src/schemas/FlowSchemas');
|
|
271
|
+
await mkdir(schemaRoot, { recursive: true });
|
|
272
|
+
await writeFile(
|
|
273
|
+
join(schemaRoot, 'Stepped.js'),
|
|
274
|
+
"export default { flowTag: 'stepped', event: ['ownTopic'], flowSteps: [{ stepName: 'start' }, { stepName: 'Complete', event: ['extTopic'] }] };\n"
|
|
275
|
+
);
|
|
276
|
+
await writeFile(
|
|
277
|
+
join(schemaRoot, 'Generated.js'),
|
|
278
|
+
"export default { flowTag: 'generated', event: ['ownTopic'], generatedCodeConfig: { generatedCodeTag: 'create' }, flowSteps: [{ stepName: 'start' }, { stepName: 'Complete', event: ['extTopic'] }] };\n"
|
|
279
|
+
);
|
|
280
|
+
await writeFile(
|
|
281
|
+
join(schemaRoot, 'DsqStep.js'),
|
|
282
|
+
"export default { flowTag: 'dsqStep', event: ['extTopic'], flowSteps: [{ stepName: 'start' }, { stepName: 'RetryDsq', event: ['dsq'] }] };\n"
|
|
283
|
+
);
|
|
284
|
+
return rootPath;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
async function createTriggerCacheProject() {
|
|
288
|
+
const rootPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-trigger-cache-'));
|
|
289
|
+
roots.add(rootPath);
|
|
290
|
+
const schemaRoot = join(rootPath, 'app/src/schemas/FlowSchemas');
|
|
291
|
+
await mkdir(schemaRoot, { recursive: true });
|
|
292
|
+
await writeFile(
|
|
293
|
+
join(schemaRoot, 'Cart.js'),
|
|
294
|
+
"export default { flowTag: 'cart', event: ['ownTopic'], statusType: 'triggerCache', objType: { serviceTag: 'Order' }, flowSteps: [{ stepName: 'start' }, { stepName: 'CheckTriggerCacheCartComplete', checkTriggerType: 'flowType', event: ['extTopic'] }, { stepName: 'TriggerCacheCartComplete', checkTriggerType: 'complete', event: ['extTopic', 'dsq'] }] };\n"
|
|
295
|
+
);
|
|
296
|
+
return rootPath;
|
|
297
|
+
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { mkdir, mkdtemp, readFile, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import test from 'node:test';
|
|
6
|
+
import { pathToFileURL } from 'node:url';
|
|
7
|
+
|
|
8
|
+
import { generateDynamicCrudFlowSchemas } from '../src/emit/crud/generateDynamicCrudFlowSchemas.js';
|
|
9
|
+
|
|
10
|
+
test('generates dynamic CRUD schemas from local schema modules', async () => {
|
|
11
|
+
const rootPath = await createProject({
|
|
12
|
+
generatedBy: 'userGenerated',
|
|
13
|
+
flow: createHookFlow(['ownTopic'])
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
const result = await generateDynamicCrudFlowSchemas(rootPath);
|
|
17
|
+
assert.deepEqual(result.files.map(file => file.path), [
|
|
18
|
+
'app/src/schemas/FlowSchemas/generateCode/Create.js',
|
|
19
|
+
'app/src/schemas/FlowSchemas/generateCode/Update.js',
|
|
20
|
+
'app/src/schemas/FlowSchemas/generateCode/Delete.js',
|
|
21
|
+
'app/src/schemas/FlowSchemas/generateCode/Get.js'
|
|
22
|
+
]);
|
|
23
|
+
|
|
24
|
+
const create = await readGeneratedFlow(rootPath, 'Create');
|
|
25
|
+
const get = await readGeneratedFlow(rootPath, 'Get');
|
|
26
|
+
assert.deepEqual(create.event, ['ownTopic']);
|
|
27
|
+
assert.deepEqual(create.flowSteps.map(step => step.stepName), ['start', 'BeforeLogical', 'Complete']);
|
|
28
|
+
assert.deepEqual(create.flowSteps[0].returnValues.messageAttributes, ['userId', 'correlationId']);
|
|
29
|
+
assert.equal(get.outputTopic, false);
|
|
30
|
+
assert.deepEqual(get.event, ['lambdaSyncInv', 'lambdaSyncApi']);
|
|
31
|
+
assert.equal(get.flowSteps[0].returnValues, undefined);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
test('accepts singleton object exports used by existing schema files', async () => {
|
|
35
|
+
const rootPath = await createProject({
|
|
36
|
+
generatedBy: 'userGenerated',
|
|
37
|
+
flow: createHookFlow(['ownTopic']),
|
|
38
|
+
singletonExports: true
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
const result = await generateDynamicCrudFlowSchemas(rootPath);
|
|
42
|
+
|
|
43
|
+
assert.equal(result.files.length, 4);
|
|
44
|
+
assert.deepEqual((await readGeneratedFlow(rootPath, 'Create')).flowSteps.map(step => step.stepName), [
|
|
45
|
+
'start',
|
|
46
|
+
'BeforeLogical',
|
|
47
|
+
'Complete'
|
|
48
|
+
]);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
test('does not generate CRUD schemas without an applicable object', async () => {
|
|
52
|
+
const rootPath = await createProject({ generatedBy: 'userGenerated' });
|
|
53
|
+
await generateDynamicCrudFlowSchemas(rootPath);
|
|
54
|
+
await writeFile(
|
|
55
|
+
join(rootPath, 'app/src/schemas/ObjectSchemas/Order.js'),
|
|
56
|
+
"export default [{ objectType: 'order', generatedBy: 'external' }];\n"
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
const result = await generateDynamicCrudFlowSchemas(rootPath);
|
|
60
|
+
|
|
61
|
+
assert.deepEqual(result.files, []);
|
|
62
|
+
await assert.rejects(readGeneratedFile(rootPath, 'Create'));
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
test('does not allow options to override the rootPath argument', async () => {
|
|
66
|
+
const rootPath = await createProject({ generatedBy: 'userGenerated' });
|
|
67
|
+
const ignoredRootPath = await createProject({ generatedBy: 'external' });
|
|
68
|
+
|
|
69
|
+
const result = await generateDynamicCrudFlowSchemas(rootPath, { rootPath: ignoredRootPath });
|
|
70
|
+
|
|
71
|
+
assert.equal(result.project.rootPath, rootPath);
|
|
72
|
+
assert.equal(result.files.length, 4);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
test('rejects source modules that do not default-export schema objects or arrays', async () => {
|
|
76
|
+
const rootPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-invalid-schema-'));
|
|
77
|
+
const objectDirectory = join(rootPath, 'app/src/schemas/ObjectSchemas');
|
|
78
|
+
await mkdir(objectDirectory, { recursive: true });
|
|
79
|
+
await writeFile(join(objectDirectory, 'Invalid.js'), "export default 'not-a-schema';\n");
|
|
80
|
+
|
|
81
|
+
await assert.rejects(
|
|
82
|
+
generateDynamicCrudFlowSchemas(rootPath),
|
|
83
|
+
/must default-export an object or array/
|
|
84
|
+
);
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
test('reloads changed local flow schemas instead of reusing module cache', async () => {
|
|
88
|
+
const rootPath = await createProject({
|
|
89
|
+
generatedBy: 'systemGenerated',
|
|
90
|
+
flow: createHookFlow(['ownTopic'])
|
|
91
|
+
});
|
|
92
|
+
const flowPath = join(rootPath, 'app/src/schemas/FlowSchemas/CreateHook.js');
|
|
93
|
+
|
|
94
|
+
await generateDynamicCrudFlowSchemas(rootPath);
|
|
95
|
+
assert.match(await readGeneratedFile(rootPath, 'Create'), /BeforeLogical/);
|
|
96
|
+
|
|
97
|
+
await writeFile(flowPath, `export default [${JSON.stringify(createHookFlow([]))}];\n`);
|
|
98
|
+
await generateDynamicCrudFlowSchemas(rootPath);
|
|
99
|
+
assert.doesNotMatch(await readGeneratedFile(rootPath, 'Create'), /BeforeLogical/);
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
async function createProject({ generatedBy, flow, singletonExports = false }) {
|
|
103
|
+
const rootPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-crud-'));
|
|
104
|
+
const objectPath = join(rootPath, 'app/src/schemas/ObjectSchemas/Order.js');
|
|
105
|
+
const flowPath = join(rootPath, 'app/src/schemas/FlowSchemas/CreateHook.js');
|
|
106
|
+
await mkdir(join(rootPath, 'app/src/schemas/ObjectSchemas'), { recursive: true });
|
|
107
|
+
await mkdir(join(rootPath, 'app/src/schemas/FlowSchemas'), { recursive: true });
|
|
108
|
+
const object = `{ objectType: 'order', generatedBy: '${generatedBy}' }`;
|
|
109
|
+
await writeFile(objectPath, `export default ${singletonExports ? object : `[${object}]`};\n`);
|
|
110
|
+
if (flow) {
|
|
111
|
+
const flowSource = JSON.stringify(flow);
|
|
112
|
+
await writeFile(flowPath, `export default ${singletonExports ? flowSource : `[${flowSource}]`};\n`);
|
|
113
|
+
}
|
|
114
|
+
return rootPath;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function createHookFlow(event) {
|
|
118
|
+
return {
|
|
119
|
+
flowTag: 'CreateHook',
|
|
120
|
+
event,
|
|
121
|
+
generatedCodeConfig: {
|
|
122
|
+
generatedCodeTag: 'create',
|
|
123
|
+
codeHookTag: 'beforeLogical',
|
|
124
|
+
invocationType: 'ownTopic'
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
async function readGeneratedFlow(rootPath, action) {
|
|
130
|
+
const filePath = join(rootPath, 'app/src/schemas/FlowSchemas/generateCode', `${action}.js`);
|
|
131
|
+
return import(`${pathToFileURL(filePath).href}?test=${process.hrtime.bigint()}`).then(module => module.default);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
function readGeneratedFile(rootPath, action) {
|
|
135
|
+
return readFile(join(rootPath, 'app/src/schemas/FlowSchemas/generateCode', `${action}.js`), 'utf8');
|
|
136
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import test, { after } from 'node:test';
|
|
6
|
+
import { pathToFileURL } from 'node:url';
|
|
7
|
+
|
|
8
|
+
import { generateDynamicRbacFlowSchemas } from '../src/emit/rbac/generateDynamicRbacFlowSchemas.js';
|
|
9
|
+
|
|
10
|
+
const projectRoots = new Set();
|
|
11
|
+
const STATIC_ACTIONS = [
|
|
12
|
+
'CreateTargetRole',
|
|
13
|
+
'ListTargetRole',
|
|
14
|
+
'DeleteTargetRole',
|
|
15
|
+
'CreateRolePermissions',
|
|
16
|
+
'ListRolePermissions',
|
|
17
|
+
'DeleteRolePermissions',
|
|
18
|
+
'CreateUserRole',
|
|
19
|
+
'ListUserInRoles',
|
|
20
|
+
'DeleteUserFromRole'
|
|
21
|
+
];
|
|
22
|
+
|
|
23
|
+
after(async () => {
|
|
24
|
+
await Promise.all([...projectRoots].map(rootPath => rm(rootPath, { recursive: true, force: true })));
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
test('generates shared and object-specific RBAC flow schemas', async () => {
|
|
28
|
+
const rootPath = await createProject({ hasRbac: true });
|
|
29
|
+
|
|
30
|
+
const result = await generateDynamicRbacFlowSchemas(rootPath, { serviceTag: 'UserAccount' });
|
|
31
|
+
|
|
32
|
+
assert.deepEqual(result.files.map(file => file.path), [
|
|
33
|
+
...STATIC_ACTIONS.map(action => `app/src/schemas/FlowSchemas/generateCode/${action}.js`),
|
|
34
|
+
'app/src/schemas/FlowSchemas/generateCode/UserRbacFlow.js'
|
|
35
|
+
]);
|
|
36
|
+
const createTargetRole = await readGeneratedFlow(rootPath, 'CreateTargetRole');
|
|
37
|
+
const listTargetRole = await readGeneratedFlow(rootPath, 'ListTargetRole');
|
|
38
|
+
const user = await readGeneratedFlow(rootPath, 'UserRbacFlow');
|
|
39
|
+
assert.deepEqual(createTargetRole.flowSteps[0].returnValues, {
|
|
40
|
+
properties: ['returnResult'],
|
|
41
|
+
messageAttributes: []
|
|
42
|
+
});
|
|
43
|
+
assert.deepEqual(listTargetRole.event, ['lambdaSyncApi']);
|
|
44
|
+
assert.equal(listTargetRole.outputTopic, true);
|
|
45
|
+
assert.deepEqual(user.objType, { serviceTag: 'UserAccount', objectType: 'user' });
|
|
46
|
+
assert.deepEqual(user.flowSteps[0].messageAttributes, ['userId', 'correlationId']);
|
|
47
|
+
assert.equal(user.steps, undefined);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
test('removes RBAC schemas when the last RBAC object is removed', async () => {
|
|
51
|
+
const rootPath = await createProject({ hasRbac: true });
|
|
52
|
+
const objectPath = join(rootPath, 'app/src/schemas/ObjectSchemas/User.js');
|
|
53
|
+
await generateDynamicRbacFlowSchemas(rootPath, { serviceTag: 'UserAccount' });
|
|
54
|
+
await writeFile(objectPath, "export default { objectType: 'user', addOnDataStructure: [] };\n");
|
|
55
|
+
|
|
56
|
+
const result = await generateDynamicRbacFlowSchemas(rootPath);
|
|
57
|
+
|
|
58
|
+
assert.deepEqual(result.files, []);
|
|
59
|
+
await assert.rejects(readFile(join(rootPath, 'app/src/schemas/FlowSchemas/generateCode/CreateTargetRole.js')));
|
|
60
|
+
await assert.rejects(readFile(join(rootPath, 'app/src/schemas/FlowSchemas/generateCode/UserRbacFlow.js')));
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
test('requires a serviceTag only when RBAC schemas are needed', async () => {
|
|
64
|
+
const rbacRoot = await createProject({ hasRbac: true });
|
|
65
|
+
const plainRoot = await createProject();
|
|
66
|
+
|
|
67
|
+
await assert.rejects(
|
|
68
|
+
generateDynamicRbacFlowSchemas(rbacRoot),
|
|
69
|
+
/serviceTag is required/
|
|
70
|
+
);
|
|
71
|
+
assert.deepEqual((await generateDynamicRbacFlowSchemas(plainRoot)).files, []);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
test('removes object-specific RBAC schemas when the ObjectSchema file is deleted', async () => {
|
|
75
|
+
const rootPath = await createProject({ hasRbac: true });
|
|
76
|
+
const objectPath = join(rootPath, 'app/src/schemas/ObjectSchemas/User.js');
|
|
77
|
+
await generateDynamicRbacFlowSchemas(rootPath, { serviceTag: 'UserAccount' });
|
|
78
|
+
await rm(objectPath);
|
|
79
|
+
|
|
80
|
+
await generateDynamicRbacFlowSchemas(rootPath);
|
|
81
|
+
|
|
82
|
+
await assert.rejects(readFile(join(rootPath, 'app/src/schemas/FlowSchemas/generateCode/UserRbacFlow.js')));
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
async function createProject({ hasRbac = false } = {}) {
|
|
86
|
+
const rootPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-rbac-'));
|
|
87
|
+
projectRoots.add(rootPath);
|
|
88
|
+
const objectDirectory = join(rootPath, 'app/src/schemas/ObjectSchemas');
|
|
89
|
+
await mkdir(objectDirectory, { recursive: true });
|
|
90
|
+
await writeFile(
|
|
91
|
+
join(objectDirectory, 'User.js'),
|
|
92
|
+
`export default { objectType: 'user', addOnDataStructure: ${hasRbac ? "[{ type: 'rbac' }]" : '[]'} };\n`
|
|
93
|
+
);
|
|
94
|
+
return rootPath;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
async function readGeneratedFlow(rootPath, flowTag) {
|
|
98
|
+
const filePath = join(rootPath, 'app/src/schemas/FlowSchemas/generateCode', `${flowTag}.js`);
|
|
99
|
+
const module = await import(`${pathToFileURL(filePath).href}?test=${process.hrtime.bigint()}`);
|
|
100
|
+
return module.default;
|
|
101
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import test, { after } from 'node:test';
|
|
6
|
+
import { pathToFileURL } from 'node:url';
|
|
7
|
+
|
|
8
|
+
import { generateDynamicRelationshipFlowSchemas } from '../src/emit/relationship/generateDynamicRelationshipFlowSchemas.js';
|
|
9
|
+
|
|
10
|
+
const RELATIONSHIP_ACTIONS = [
|
|
11
|
+
'CreateRelationship',
|
|
12
|
+
'UpdateRelationship',
|
|
13
|
+
'DeleteRelationship',
|
|
14
|
+
'GetRelationship',
|
|
15
|
+
'ChangeRelationship',
|
|
16
|
+
'MoveRelationship'
|
|
17
|
+
];
|
|
18
|
+
const projectRoots = new Set();
|
|
19
|
+
|
|
20
|
+
after(async () => {
|
|
21
|
+
await Promise.all([...projectRoots].map(rootPath =>
|
|
22
|
+
rm(rootPath, { recursive: true, force: true })
|
|
23
|
+
));
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
test('generates dynamic relationship schemas even without declared relationships for legacy compatibility', async () => {
|
|
27
|
+
const rootPath = await createProject();
|
|
28
|
+
|
|
29
|
+
const result = await generateDynamicRelationshipFlowSchemas(rootPath);
|
|
30
|
+
|
|
31
|
+
assert.deepEqual(
|
|
32
|
+
result.files.map(file => file.path),
|
|
33
|
+
RELATIONSHIP_ACTIONS.map(action => `app/src/schemas/FlowSchemas/generateCode/${action}.js`)
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
const create = await readGeneratedFlow(rootPath, 'CreateRelationship');
|
|
37
|
+
const get = await readGeneratedFlow(rootPath, 'GetRelationship');
|
|
38
|
+
assert.deepEqual(create.event, ['ownTopic']);
|
|
39
|
+
assert.deepEqual(create.flowSteps.map(step => step.stepName), ['start', 'Complete']);
|
|
40
|
+
assert.deepEqual(create.flowSteps[0].returnValues.messageAttributes, ['userId', 'correlationId']);
|
|
41
|
+
assert.deepEqual(get.event, ['lambdaSyncInv', 'lambdaSyncApi', 'dsq', 'ownTopic']);
|
|
42
|
+
assert.equal(get.outputTopic, false);
|
|
43
|
+
assert.equal(get.flowSteps[0].returnValues, undefined);
|
|
44
|
+
assert.equal(get.flowSteps.find(step => step.stepName === 'Complete'), undefined);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
test('accepts singleton and array RelationshipSchema exports', async () => {
|
|
48
|
+
const singletonRoot = await createProject({ singletonExport: true });
|
|
49
|
+
const arrayRoot = await createProject();
|
|
50
|
+
|
|
51
|
+
assert.equal((await generateDynamicRelationshipFlowSchemas(singletonRoot)).files.length, 6);
|
|
52
|
+
assert.equal((await generateDynamicRelationshipFlowSchemas(arrayRoot)).files.length, 6);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
test('reloads a changed RelationshipSchema instead of reusing the module cache', async () => {
|
|
56
|
+
const rootPath = await createProject();
|
|
57
|
+
const relationshipPath = join(rootPath, 'app/src/schemas/RelationshipSchemas/OrderCustomer.js');
|
|
58
|
+
|
|
59
|
+
await generateDynamicRelationshipFlowSchemas(rootPath);
|
|
60
|
+
await writeFile(relationshipPath, "export default 'not-a-schema';\n");
|
|
61
|
+
|
|
62
|
+
await assert.rejects(
|
|
63
|
+
generateDynamicRelationshipFlowSchemas(rootPath),
|
|
64
|
+
/must default-export an object or array/
|
|
65
|
+
);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
test('does not allow options to override the rootPath argument', async () => {
|
|
69
|
+
const rootPath = await createProject();
|
|
70
|
+
const ignoredRootPath = await createProject();
|
|
71
|
+
|
|
72
|
+
const result = await generateDynamicRelationshipFlowSchemas(rootPath, { rootPath: ignoredRootPath });
|
|
73
|
+
|
|
74
|
+
assert.equal(result.project.rootPath, rootPath);
|
|
75
|
+
assert.equal(result.files.length, 6);
|
|
76
|
+
assert.match(
|
|
77
|
+
await readFile(join(rootPath, 'app/src/schemas/FlowSchemas/generateCode/CreateRelationship.js'), 'utf8'),
|
|
78
|
+
/export default/
|
|
79
|
+
);
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
async function createProject({ singletonExport = false } = {}) {
|
|
83
|
+
const rootPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-relationship-'));
|
|
84
|
+
projectRoots.add(rootPath);
|
|
85
|
+
const relationshipDirectory = join(rootPath, 'app/src/schemas/RelationshipSchemas');
|
|
86
|
+
await mkdir(relationshipDirectory, { recursive: true });
|
|
87
|
+
const relationship = { relationshipTag: 'orderCustomer', links: [] };
|
|
88
|
+
await writeFile(
|
|
89
|
+
join(relationshipDirectory, 'OrderCustomer.js'),
|
|
90
|
+
`export default ${JSON.stringify(singletonExport ? relationship : [relationship])};\n`
|
|
91
|
+
);
|
|
92
|
+
return rootPath;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
async function readGeneratedFlow(rootPath, action) {
|
|
96
|
+
const filePath = join(rootPath, 'app/src/schemas/FlowSchemas/generateCode', `${action}.js`);
|
|
97
|
+
const module = await import(`${pathToFileURL(filePath).href}?test=${process.hrtime.bigint()}`);
|
|
98
|
+
return module.default;
|
|
99
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import test from 'node:test';
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
renderApiFunctionYaml,
|
|
6
|
+
renderEventBridgeFunctionYaml,
|
|
7
|
+
renderInvFunctionYaml,
|
|
8
|
+
renderSqsFunctionYaml,
|
|
9
|
+
renderWbsFunctionYaml
|
|
10
|
+
} from '../src/emit/function/functionYamlArtifact.js';
|
|
11
|
+
|
|
12
|
+
test('renders function-setting hooks for every function transport', () => {
|
|
13
|
+
const functions = [
|
|
14
|
+
['CreateHdrSqs', renderSqsFunctionYaml({ functionName: 'CreateHdrSqs', handlerPath: 'src/create.main', roleName: 'Role', queueName: 'CreateHdrSqs' })],
|
|
15
|
+
['GetHdrApi', renderApiFunctionYaml({ functionName: 'GetHdrApi', handlerPath: 'src/get.main', roleName: 'Role', routes: [{ path: '/orders/get', upperName: 'Get' }] })],
|
|
16
|
+
['CreateHdrWbs', renderWbsFunctionYaml({ functionName: 'CreateHdrWbs', handlerPath: 'src/create.main', roleName: 'Role', routeName: 'create' })],
|
|
17
|
+
['GetHdrInv', renderInvFunctionYaml({ functionName: 'GetHdrInv', handlerPath: 'src/get.main', roleName: 'Role' })],
|
|
18
|
+
['ScheduledHdrInv', renderEventBridgeFunctionYaml({ functionName: 'ScheduledHdrInv', handlerPath: 'src/scheduled.main', roleName: 'Role', flowTag: 'scheduled', schedules: [{ name: 'daily', rate: ['rate(1 day)'] }] })]
|
|
19
|
+
];
|
|
20
|
+
|
|
21
|
+
for (const [functionName, yaml] of functions) {
|
|
22
|
+
assert.match(yaml, new RegExp(`#<#${functionName}FunctionSetting#>`));
|
|
23
|
+
assert.match(yaml, new RegExp(`#<#/${functionName}FunctionSetting#>`));
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
test('filters only completion SQS functions by their calling flow', () => {
|
|
28
|
+
const completion = renderSqsFunctionYaml({ functionName: 'CreateCompleteHdrSqs', handlerPath: 'src/create.main', roleName: 'Role', queueName: 'CreateCompleteHdrSqs' });
|
|
29
|
+
const ordinary = renderSqsFunctionYaml({ functionName: 'CreateHdrSqs', handlerPath: 'src/create.main', roleName: 'Role', queueName: 'CreateHdrSqs' });
|
|
30
|
+
|
|
31
|
+
assert.match(completion, /filterPatterns:[\s\S]*\$\{self:custom\.iz_resourcePrefix\}CreateCompleteHdrSqs/);
|
|
32
|
+
assert.match(completion, /exists: false/);
|
|
33
|
+
assert.doesNotMatch(ordinary, /filterPatterns:/);
|
|
34
|
+
});
|