@izara_project/izara-core-generate-service-code 1.0.65 → 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 -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_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
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { mkdir, mkdtemp, readFile, readdir, symlink, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { dirname, join } from 'node:path';
|
|
5
|
+
import test from 'node:test';
|
|
6
|
+
|
|
7
|
+
import { buildGenerationPlan } from '../src/plan/buildGenerationPlan.js';
|
|
8
|
+
import { commitArtifacts } from '../src/output/commitArtifacts.js';
|
|
9
|
+
import { compileProject } from '../src/compile/compileProject.js';
|
|
10
|
+
|
|
11
|
+
test('compiles a request and commits only declared relative artifacts', async () => {
|
|
12
|
+
const outputPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-'));
|
|
13
|
+
const project = compileProject({ rootPath: outputPath });
|
|
14
|
+
const plan = buildGenerationPlan(project, [
|
|
15
|
+
{ path: 'app/generated/example.js', content: 'export default 1;\n' }
|
|
16
|
+
]);
|
|
17
|
+
|
|
18
|
+
assert.deepEqual(await commitArtifacts(plan), [{ path: 'app/generated/example.js' }]);
|
|
19
|
+
assert.equal(
|
|
20
|
+
await readFile(join(outputPath, 'app/generated/example.js'), 'utf8'),
|
|
21
|
+
'export default 1;\n'
|
|
22
|
+
);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
test('rejects invalid generation inputs before writing files', async () => {
|
|
26
|
+
assert.throws(() => compileProject({}), /rootPath/);
|
|
27
|
+
|
|
28
|
+
const outputPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-invalid-'));
|
|
29
|
+
const project = compileProject({ rootPath: outputPath });
|
|
30
|
+
await assert.rejects(
|
|
31
|
+
Promise.resolve().then(() => buildGenerationPlan(project, [{ path: '../outside.js', content: '' }])),
|
|
32
|
+
/escapes output root/
|
|
33
|
+
);
|
|
34
|
+
await assert.rejects(
|
|
35
|
+
Promise.resolve().then(() => buildGenerationPlan(project, [
|
|
36
|
+
{ path: 'same.js', content: '' },
|
|
37
|
+
{ path: 'same.js', content: '' }
|
|
38
|
+
])),
|
|
39
|
+
/Duplicate artifact path/
|
|
40
|
+
);
|
|
41
|
+
await assert.rejects(readFile(join(outputPath, 'same.js')));
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
test('rejects a symlinked output directory', async () => {
|
|
45
|
+
const outputPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-output-'));
|
|
46
|
+
const outsidePath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-outside-'));
|
|
47
|
+
await symlink(outsidePath, join(outputPath, 'linked'));
|
|
48
|
+
|
|
49
|
+
const plan = buildGenerationPlan(compileProject({ rootPath: outputPath }), [
|
|
50
|
+
{ path: 'linked/escaped.js', content: 'export default 1;\n' }
|
|
51
|
+
]);
|
|
52
|
+
|
|
53
|
+
await assert.rejects(commitArtifacts(plan), /non-directory/);
|
|
54
|
+
await assert.rejects(readFile(join(outsidePath, 'escaped.js')));
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
test('does not delete a legacy file before a managed scope has established ownership', async () => {
|
|
58
|
+
const outputPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-managed-scope-'));
|
|
59
|
+
const project = compileProject({ rootPath: outputPath });
|
|
60
|
+
await writeFile(join(outputPath, 'legacy.js'), 'legacy\n');
|
|
61
|
+
|
|
62
|
+
await commitArtifacts(buildGenerationPlan(project, [], {
|
|
63
|
+
managedPaths: ['legacy.js'],
|
|
64
|
+
managedScope: 'example-scope'
|
|
65
|
+
}));
|
|
66
|
+
assert.equal(await readFile(join(outputPath, 'legacy.js'), 'utf8'), 'legacy\n');
|
|
67
|
+
|
|
68
|
+
await commitArtifacts(buildGenerationPlan(project, [{ path: 'legacy.js', content: 'v2\n' }], {
|
|
69
|
+
managedPaths: ['legacy.js'],
|
|
70
|
+
managedScope: 'example-scope'
|
|
71
|
+
}));
|
|
72
|
+
await commitArtifacts(buildGenerationPlan(project, [], {
|
|
73
|
+
managedPaths: ['legacy.js'],
|
|
74
|
+
managedScope: 'example-scope'
|
|
75
|
+
}));
|
|
76
|
+
await assert.rejects(readFile(join(outputPath, 'legacy.js')));
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
test('commits and cleans multiple managed scopes in one transaction', async () => {
|
|
80
|
+
const outputPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-multi-scope-'));
|
|
81
|
+
const project = compileProject({ rootPath: outputPath });
|
|
82
|
+
const managedScopes = { schemas: ['schemas.js'], application: ['application.js'] };
|
|
83
|
+
await commitArtifacts(buildGenerationPlan(project, [
|
|
84
|
+
{ path: 'schemas.js', content: 'schema\n' },
|
|
85
|
+
{ path: 'application.js', content: 'application\n' }
|
|
86
|
+
], { managedScopes }));
|
|
87
|
+
|
|
88
|
+
await commitArtifacts(buildGenerationPlan(project, [
|
|
89
|
+
{ path: 'application.js', content: 'application next\n' }
|
|
90
|
+
], { managedScopes }));
|
|
91
|
+
|
|
92
|
+
await assert.rejects(readFile(join(outputPath, 'schemas.js')));
|
|
93
|
+
assert.equal(await readFile(join(outputPath, 'application.js'), 'utf8'), 'application next\n');
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
test('merges preserved hook blocks into staged source without changing the hook', async () => {
|
|
97
|
+
const outputPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-hooks-'));
|
|
98
|
+
const hookPath = join(outputPath, 'app/generated/hook/example.js');
|
|
99
|
+
await mkdir(dirname(hookPath), { recursive: true });
|
|
100
|
+
await writeFile(hookPath, '//(<hookCode>)\ncustom();\n//(</hookCode>)\n');
|
|
101
|
+
|
|
102
|
+
await commitArtifacts(buildGenerationPlan(compileProject({ rootPath: outputPath }), [{
|
|
103
|
+
path: 'app/generated/source/example.js',
|
|
104
|
+
content: '//(<hookCode>)\ndefault();\n//(</hookCode>)\n'
|
|
105
|
+
}]));
|
|
106
|
+
|
|
107
|
+
assert.equal(
|
|
108
|
+
await readFile(join(outputPath, 'app/generated/source/example.js'), 'utf8'),
|
|
109
|
+
'//(<hookCode>)\ncustom();\n//(</hookCode>)\n'
|
|
110
|
+
);
|
|
111
|
+
assert.equal(await readFile(hookPath, 'utf8'), '//(<hookCode>)\ncustom();\n//(</hookCode>)\n');
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
test('rejects an invalid rendered artifact before staging output', async () => {
|
|
115
|
+
const outputPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-invalid-render-'));
|
|
116
|
+
const sourcePath = join(outputPath, 'app/generated/source/example.js');
|
|
117
|
+
await mkdir(dirname(sourcePath), { recursive: true });
|
|
118
|
+
await writeFile(sourcePath, 'existing source\n');
|
|
119
|
+
|
|
120
|
+
await assert.rejects(
|
|
121
|
+
commitArtifacts({
|
|
122
|
+
project: compileProject({ rootPath: outputPath }),
|
|
123
|
+
artifacts: [{ path: 'app/generated/source/example.js', content: null }]
|
|
124
|
+
}),
|
|
125
|
+
/content must be a string/
|
|
126
|
+
);
|
|
127
|
+
assert.equal(await readFile(sourcePath, 'utf8'), 'existing source\n');
|
|
128
|
+
assert.deepEqual(
|
|
129
|
+
(await readdir(outputPath)).filter(name => name.startsWith('.generate-service-code-v2-stage-')),
|
|
130
|
+
[]
|
|
131
|
+
);
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
test('rejects a failed output transaction without partial files, hooks, or staging residue', async () => {
|
|
135
|
+
const outputPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-transaction-'));
|
|
136
|
+
const project = compileProject({ rootPath: outputPath });
|
|
137
|
+
const sourcePath = join(outputPath, 'app/generated/source/first.js');
|
|
138
|
+
const hookPath = join(outputPath, 'app/generated/hook/first.js');
|
|
139
|
+
await mkdir(dirname(sourcePath), { recursive: true });
|
|
140
|
+
await mkdir(dirname(hookPath), { recursive: true });
|
|
141
|
+
await writeFile(sourcePath, 'old source\n');
|
|
142
|
+
await writeFile(hookPath, 'custom hook\n');
|
|
143
|
+
await mkdir(join(outputPath, 'app/generated/source/second.js'));
|
|
144
|
+
|
|
145
|
+
await assert.rejects(
|
|
146
|
+
commitArtifacts(buildGenerationPlan(project, [
|
|
147
|
+
{ path: 'app/generated/source/first.js', content: 'new source\n' },
|
|
148
|
+
{ path: 'app/generated/source/second.js', content: 'never committed\n' }
|
|
149
|
+
])),
|
|
150
|
+
/not a file/
|
|
151
|
+
);
|
|
152
|
+
assert.equal(await readFile(sourcePath, 'utf8'), 'old source\n');
|
|
153
|
+
assert.equal(await readFile(hookPath, 'utf8'), 'custom hook\n');
|
|
154
|
+
assert.deepEqual(
|
|
155
|
+
(await readdir(outputPath)).filter(name => name.startsWith('.generate-service-code-v2-stage-')),
|
|
156
|
+
[]
|
|
157
|
+
);
|
|
158
|
+
assert.equal((await readdir(outputPath)).includes('.bak'), false);
|
|
159
|
+
});
|
|
@@ -0,0 +1,68 @@
|
|
|
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
|
+
|
|
7
|
+
import { generateCreateTargetRoleHandler } from '../src/emit/rbac/generateCreateTargetRoleHandler.js';
|
|
8
|
+
|
|
9
|
+
const roots = new Set();
|
|
10
|
+
const OWN_TOPIC_FLOWS = [
|
|
11
|
+
'CreateTargetRole',
|
|
12
|
+
'CreateRolePermissions',
|
|
13
|
+
'DeleteRolePermissions',
|
|
14
|
+
'DeleteTargetRole',
|
|
15
|
+
'CreateUserRole',
|
|
16
|
+
'DeleteUserFromRole'
|
|
17
|
+
];
|
|
18
|
+
after(() => Promise.all([...roots].map(root => rm(root, { recursive: true, force: true }))));
|
|
19
|
+
|
|
20
|
+
test('generates RBAC own-topic WebSocket entries alongside their SQS handlers', async () => {
|
|
21
|
+
const rootPath = await createProject(true);
|
|
22
|
+
const result = await generateCreateTargetRoleHandler(rootPath);
|
|
23
|
+
|
|
24
|
+
assert.equal(result.files.length, 36);
|
|
25
|
+
assert.match(await readFile(join(rootPath, result.files[0].path), 'utf8'), /ProcessCreateTargetRole/);
|
|
26
|
+
assert.match(await readFile(join(rootPath, result.files[1].path), 'utf8'), /ProcessCreateTargetRoleHdrSqs/);
|
|
27
|
+
assert.match(
|
|
28
|
+
await readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/flow-rbac.yml'), 'utf8'),
|
|
29
|
+
/FlowRbacRole/
|
|
30
|
+
);
|
|
31
|
+
assert.match(
|
|
32
|
+
await readFile(join(rootPath, 'app/src/generatedCode/FlowRbac/ListTargetRole/source/ProcessListTargetRole_HdrApi.js'), 'utf8'),
|
|
33
|
+
/ProcessListTargetRole/
|
|
34
|
+
);
|
|
35
|
+
const yaml = await readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/flow-rbac.yml'), 'utf8');
|
|
36
|
+
for (const flowTag of OWN_TOPIC_FLOWS) {
|
|
37
|
+
assert.match(
|
|
38
|
+
await readFile(join(rootPath, `app/src/generatedCode/FlowRbac/${flowTag}/source/${flowTag}_HdrWbs.js`), 'utf8'),
|
|
39
|
+
new RegExp(`import ${flowTag}`)
|
|
40
|
+
);
|
|
41
|
+
assert.match(yaml, new RegExp(`${flowTag}HdrWbs:\\n[\\s\\S]*websocket:`));
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
test('removes CreateTargetRole handler when RBAC is removed', async () => {
|
|
46
|
+
const rootPath = await createProject(true);
|
|
47
|
+
const objectPath = join(rootPath, 'app/src/schemas/ObjectSchemas/User.js');
|
|
48
|
+
await generateCreateTargetRoleHandler(rootPath);
|
|
49
|
+
await writeFile(objectPath, "export default { objectType: 'user', addOnDataStructure: [] };\n");
|
|
50
|
+
|
|
51
|
+
assert.deepEqual((await generateCreateTargetRoleHandler(rootPath)).files, []);
|
|
52
|
+
await assert.rejects(readFile(join(rootPath, 'app/src/generatedCode/FlowRbac/CreateTargetRole/source/ProcessCreateTargetRole_Main.js')));
|
|
53
|
+
await assert.rejects(readFile(join(rootPath, 'app/src/generatedCode/FlowRbac/CreateTargetRole/source/CreateTargetRole_HdrWbs.js')));
|
|
54
|
+
await assert.rejects(readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/flow-rbac.yml')));
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
async function createProject(hasRbac) {
|
|
58
|
+
const rootPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-rbac-handler-'));
|
|
59
|
+
roots.add(rootPath);
|
|
60
|
+
const directory = join(rootPath, 'app/src/schemas/ObjectSchemas');
|
|
61
|
+
const addOns = hasRbac ? "[{ type: 'rbac' }]" : '[]';
|
|
62
|
+
await mkdir(directory, { recursive: true });
|
|
63
|
+
await writeFile(
|
|
64
|
+
join(directory, 'User.js'),
|
|
65
|
+
`export default { objectType: 'user', addOnDataStructure: ${addOns} };\n`
|
|
66
|
+
);
|
|
67
|
+
return rootPath;
|
|
68
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { execFileSync } from 'node:child_process';
|
|
3
|
+
import { mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
|
|
4
|
+
import { tmpdir } from 'node:os';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import test, { after } from 'node:test';
|
|
7
|
+
|
|
8
|
+
import { generateCrudApplicationArtifacts } from '../src/emit/crud/generateCrudApplicationArtifacts.js';
|
|
9
|
+
|
|
10
|
+
const roots = new Set();
|
|
11
|
+
after(() => Promise.all([...roots].map(root => rm(root, { recursive: true, force: true }))));
|
|
12
|
+
|
|
13
|
+
test('emits CRUD handlers and function YAML from schema data without reading generated output', async () => {
|
|
14
|
+
const rootPath = await createProject(true);
|
|
15
|
+
const result = await generateCrudApplicationArtifacts(rootPath, { serviceTag: 'orders' });
|
|
16
|
+
|
|
17
|
+
assert.equal(result.files.length, 24);
|
|
18
|
+
assert.ok(result.files.every(file => !file.path.includes('/Process')));
|
|
19
|
+
assert.match(
|
|
20
|
+
await readFile(join(rootPath, 'app/src/generatedCode/FlowObjects/Get/source/Get_Main.js'), 'utf8'),
|
|
21
|
+
/dataFromGraphV2/
|
|
22
|
+
);
|
|
23
|
+
assert.match(
|
|
24
|
+
await readFile(join(rootPath, 'app/src/generatedCode/FlowObjects/Create/source/Create_Main.js'), 'utf8'),
|
|
25
|
+
/beforeLogical_order/
|
|
26
|
+
);
|
|
27
|
+
const yaml = await readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/flow-objects.yml'), 'utf8');
|
|
28
|
+
assert.match(yaml, /CreateHdrWbs:/);
|
|
29
|
+
assert.ok(yaml.indexOf('CreateHdrWbs:') < yaml.indexOf('CreateHdrSqs:'));
|
|
30
|
+
assert.doesNotMatch(yaml, /handler: .*\/Process/);
|
|
31
|
+
assert.match(yaml, /path: \/orders\/order\/get/);
|
|
32
|
+
assert.match(yaml, /GetHdrInv:/);
|
|
33
|
+
assert.match(yaml, /CreateCompleteHdrSqs:/);
|
|
34
|
+
assert.match(yaml, /#<#CreateCompleteHdrSqsFunctionSetting#>/);
|
|
35
|
+
assert.match(yaml, /filterPatterns:[\s\S]*CreateCompleteHdrSqs/);
|
|
36
|
+
assert.match(
|
|
37
|
+
await readFile(join(rootPath, 'app/src/generatedCode/FlowObjects/Create/source/CreateComplete_Main.js'), 'utf8'),
|
|
38
|
+
/checkAllAwaitingStepsFinishedWithReturnParams/
|
|
39
|
+
);
|
|
40
|
+
assert.doesNotMatch(
|
|
41
|
+
await readFile(join(rootPath, 'app/src/generatedCode/FlowObjects/Create/source/Create_WbsMain.js'), 'utf8'),
|
|
42
|
+
/from '@izara_project\/izara-core-generate-service-code'/
|
|
43
|
+
);
|
|
44
|
+
await assert.rejects(readFile(join(rootPath, 'app/src/generatedCode/FlowObjects/Create/source/ProcessCreate_Main.js')));
|
|
45
|
+
for (const action of ['Create', 'Update', 'Delete']) {
|
|
46
|
+
execFileSync(process.execPath, ['--check', join(rootPath, `app/src/generatedCode/FlowObjects/${action}/source/${action}Complete_Main.js`)], { stdio: 'inherit' });
|
|
47
|
+
execFileSync(process.execPath, ['--check', join(rootPath, `app/src/generatedCode/FlowObjects/${action}/source/${action}Complete_HdrSqs.js`)], { stdio: 'inherit' });
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
test('preserves function-setting hooks across CRUD regeneration', async () => {
|
|
52
|
+
const rootPath = await createProject(true);
|
|
53
|
+
const hookPath = join(rootPath, 'app/sls_yaml/generatedCode/hook/flow-objects.yml');
|
|
54
|
+
await mkdir(join(rootPath, 'app/sls_yaml/generatedCode/hook'), { recursive: true });
|
|
55
|
+
await writeFile(
|
|
56
|
+
hookPath,
|
|
57
|
+
' #<#CreateCompleteHdrSqsFunctionSetting#>\n memorySize: 512\n #<#/CreateCompleteHdrSqsFunctionSetting#>\n'
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
await generateCrudApplicationArtifacts(rootPath, { serviceTag: 'orders' });
|
|
61
|
+
await generateCrudApplicationArtifacts(rootPath, { serviceTag: 'orders' });
|
|
62
|
+
|
|
63
|
+
const yamlPath = join(rootPath, 'app/sls_yaml/generatedCode/source/flow-objects.yml');
|
|
64
|
+
const yaml = await readFile(yamlPath, 'utf8');
|
|
65
|
+
assert.match(yaml, /#<#CreateCompleteHdrSqsFunctionSetting#>\n memorySize: 512\n #<#\/CreateCompleteHdrSqsFunctionSetting#>/);
|
|
66
|
+
|
|
67
|
+
const conflictPath = join(rootPath, 'app/src/generatedCode/FlowObjects/Create/source/Create_Main.js');
|
|
68
|
+
await rm(conflictPath);
|
|
69
|
+
await mkdir(conflictPath);
|
|
70
|
+
|
|
71
|
+
await assert.rejects(generateCrudApplicationArtifacts(rootPath, { serviceTag: 'orders' }), /not a file/);
|
|
72
|
+
assert.equal(await readFile(yamlPath, 'utf8'), yaml);
|
|
73
|
+
assert.equal(
|
|
74
|
+
await readFile(hookPath, 'utf8'),
|
|
75
|
+
' #<#CreateCompleteHdrSqsFunctionSetting#>\n memorySize: 512\n #<#/CreateCompleteHdrSqsFunctionSetting#>\n'
|
|
76
|
+
);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
test('removes managed CRUD artifacts when no applicable object remains', async () => {
|
|
80
|
+
const rootPath = await createProject(true);
|
|
81
|
+
await generateCrudApplicationArtifacts(rootPath, { serviceTag: 'orders' });
|
|
82
|
+
await writeFile(join(rootPath, 'app/src/schemas/ObjectSchemas/Order.js'), "export default { objectType: 'order' };\n");
|
|
83
|
+
|
|
84
|
+
assert.deepEqual((await generateCrudApplicationArtifacts(rootPath)).files, []);
|
|
85
|
+
await assert.rejects(readFile(join(rootPath, 'app/src/generatedCode/FlowObjects/Create/source/Create_Main.js')));
|
|
86
|
+
await assert.rejects(readFile(join(rootPath, 'app/src/generatedCode/FlowObjects/Create/source/CreateComplete_Main.js')));
|
|
87
|
+
await assert.rejects(readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/flow-objects.yml')));
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
async function createProject(withCrudObject) {
|
|
91
|
+
const rootPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-crud-application-'));
|
|
92
|
+
roots.add(rootPath);
|
|
93
|
+
const schemaRoot = join(rootPath, 'app/src/schemas');
|
|
94
|
+
await mkdir(join(schemaRoot, 'ObjectSchemas'), { recursive: true });
|
|
95
|
+
await mkdir(join(schemaRoot, 'FlowSchemas'), { recursive: true });
|
|
96
|
+
await writeFile(
|
|
97
|
+
join(schemaRoot, 'ObjectSchemas/Order.js'),
|
|
98
|
+
withCrudObject
|
|
99
|
+
? "export default { objectType: 'order', generatedBy: 'userGenerated' };\n"
|
|
100
|
+
: "export default { objectType: 'order' };\n"
|
|
101
|
+
);
|
|
102
|
+
await writeFile(
|
|
103
|
+
join(schemaRoot, 'FlowSchemas/OrderBeforeLogical.js'),
|
|
104
|
+
"export default { flowTag: 'orderHook', event: ['ownTopic'], generatedCodeConfig: { generatedCodeTag: 'create', codeHookTag: 'beforeLogical', invocationType: 'ownTopic', objType: { objectType: 'order' } } };\n"
|
|
105
|
+
);
|
|
106
|
+
return rootPath;
|
|
107
|
+
}
|
|
@@ -0,0 +1,294 @@
|
|
|
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, 40);
|
|
29
|
+
assert.match(await readFile(join(rootPath, 'app/src/generatedCode/FlowSchemas/Ext/source/ProcessExt_HdrSqs.js'), 'utf8'), /dummyId/);
|
|
30
|
+
assert.match(await readFile(join(rootPath, 'app/src/generatedCode/FlowSchemas/Api/source/ProcessApi_HdrApi.js'), 'utf8'), /ProcessApi/);
|
|
31
|
+
const yaml = await readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/flow-schema.yml'), 'utf8');
|
|
32
|
+
assert.match(yaml, /ProcessEventHdrInv:/);
|
|
33
|
+
assert.match(yaml, /rate\(1 minute\)/);
|
|
34
|
+
assert.match(yaml, /ProcessExtHdrSqs:/);
|
|
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_Main/);
|
|
54
|
+
assert.match(await readFile(join(rootPath, 'app/src/generatedCode/FlowSchemas/Mixed/source/ProcessMixed_HdrSqs.js'), 'utf8'), /ProcessMixed/);
|
|
55
|
+
assert.match(yaml, /OwnHdrWbs:/);
|
|
56
|
+
assert.match(yaml, /OwnHdrSqs:/);
|
|
57
|
+
assert.ok(yaml.indexOf('OwnHdrWbs:') < yaml.indexOf('OwnHdrSqs:'));
|
|
58
|
+
assert.match(yaml, /MixedHdrSqs:/);
|
|
59
|
+
assert.match(yaml, /ProcessMixedHdrSqs:/);
|
|
60
|
+
assert.match(yaml, /UploadProcessAfterUploadHdrS3:/);
|
|
61
|
+
assert.match(
|
|
62
|
+
await readFile(join(rootPath, 'app/src/generatedCode/FlowSchemas/Upload/source/UploadProcessAfterUpload_Main.js'), 'utf8'),
|
|
63
|
+
/S3Client/
|
|
64
|
+
);
|
|
65
|
+
assert.match(
|
|
66
|
+
await readFile(join(rootPath, 'app/src/generatedCode/FlowSchemas/Upload/source/UploadCreatePreSignUrl_Main.js'), 'utf8'),
|
|
67
|
+
/createPresignedPost/
|
|
68
|
+
);
|
|
69
|
+
assert.match(
|
|
70
|
+
await readFile(join(rootPath, 'app/src/generatedCode/FlowSchemas/Upload/source/UploadConfirmAfterUpload_Main.js'), 'utf8'),
|
|
71
|
+
/confirmUsageMessage/
|
|
72
|
+
);
|
|
73
|
+
for (const path of [
|
|
74
|
+
'UploadCreateObject_Main.js',
|
|
75
|
+
'UploadReservedLimit_Main.js',
|
|
76
|
+
'UploadCreatePreSignUrl_Main.js',
|
|
77
|
+
'UploadConfirmAfterUpload_Main.js'
|
|
78
|
+
]) {
|
|
79
|
+
assert.doesNotMatch(
|
|
80
|
+
await readFile(join(rootPath, `app/src/generatedCode/FlowSchemas/Upload/source/${path}`), 'utf8'),
|
|
81
|
+
/@izara_project\/izara-core-generate-service-code/
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
assert.match(
|
|
85
|
+
await readFile(join(rootPath, 'app/src/generatedCode/FlowSchemas/Upload/source/UploadProcessAfterUpload_HdrS3.js'), 'utf8'),
|
|
86
|
+
/s3Record\.bucket,\n\s*s3Record\.object/
|
|
87
|
+
);
|
|
88
|
+
for (const path of [
|
|
89
|
+
'UploadCreateObject_Main.js',
|
|
90
|
+
'UploadCreateObject_HdrWbs.js',
|
|
91
|
+
'UploadReservedLimit_Main.js',
|
|
92
|
+
'UploadReservedLimit_HdrSqs.js',
|
|
93
|
+
'UploadCreatePreSignUrl_Main.js',
|
|
94
|
+
'UploadCreatePreSignUrl_HdrSqs.js',
|
|
95
|
+
'UploadProcessAfterUpload_Main.js',
|
|
96
|
+
'UploadProcessAfterUpload_HdrS3.js',
|
|
97
|
+
'UploadConfirmAfterUpload_Main.js',
|
|
98
|
+
'UploadConfirmAfterUpload_HdrSqs.js'
|
|
99
|
+
]) {
|
|
100
|
+
await parseAsEsm(join(rootPath, `app/src/generatedCode/FlowSchemas/Upload/source/${path}`));
|
|
101
|
+
}
|
|
102
|
+
for (const path of ['UploadReservedLimit_Main.js', 'UploadCreatePreSignUrl_Main.js', 'UploadConfirmAfterUpload_Main.js']) {
|
|
103
|
+
const filePath = join(rootPath, `app/src/generatedCode/FlowSchemas/Upload/source/${path}`);
|
|
104
|
+
const source = await readFile(filePath, 'utf8');
|
|
105
|
+
const helperPath = source.match(/from '((?:\.\.\/)+libs\/source\/GenerateCodeLibs\.js)'/)?.[1];
|
|
106
|
+
assert.ok(helperPath, `${path} imports GenerateCodeLibs`);
|
|
107
|
+
await access(resolve(dirname(filePath), helperPath));
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
test('removes only V2-owned custom-flow application artifacts when supported events are removed', async () => {
|
|
112
|
+
const rootPath = await createProject();
|
|
113
|
+
await generateCustomFlowApplicationArtifacts(rootPath);
|
|
114
|
+
await writeFile(join(rootPath, 'app/src/schemas/FlowSchemas/Flows.js'), "export default [{ flowTag: 'later', event: ['dsq'] }];\n");
|
|
115
|
+
|
|
116
|
+
assert.deepEqual((await generateCustomFlowApplicationArtifacts(rootPath)).files, []);
|
|
117
|
+
await assert.rejects(readFile(join(rootPath, 'app/src/generatedCode/FlowSchemas/Ext/source/ProcessExt_HdrSqs.js')));
|
|
118
|
+
await assert.rejects(readFile(join(rootPath, 'app/src/generatedCode/FlowSchemas/Own/source/Own_HdrWbs.js')));
|
|
119
|
+
await assert.rejects(readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/flow-schema.yml')));
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
test('emits and removes ext-topic handlers declared by custom flow steps', async () => {
|
|
123
|
+
const rootPath = await createStepProject();
|
|
124
|
+
const result = await generateCustomFlowApplicationArtifacts(rootPath);
|
|
125
|
+
await generateResourceArtifacts(rootPath);
|
|
126
|
+
|
|
127
|
+
assert.ok(result.files.some(file => file.path === 'app/src/generatedCode/FlowSchemas/Stepped/source/SteppedComplete_HdrSqs.js'));
|
|
128
|
+
assert.ok(result.files.some(file => file.path === 'app/src/generatedCode/FlowSchemas/Generated/source/GeneratedComplete_HdrSqs.js'));
|
|
129
|
+
assert.match(
|
|
130
|
+
await readFile(join(rootPath, 'app/src/generatedCode/FlowSchemas/Stepped/source/SteppedComplete_Main.js'), 'utf8'),
|
|
131
|
+
/identifierUuid/
|
|
132
|
+
);
|
|
133
|
+
assert.match(
|
|
134
|
+
await readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/flow-schema.yml'), 'utf8'),
|
|
135
|
+
/SteppedCompleteHdrSqs:\n handler: src\/generatedCode\/FlowSchemas\/Stepped\/source\/SteppedComplete_HdrSqs.main/
|
|
136
|
+
);
|
|
137
|
+
assert.match(
|
|
138
|
+
await readFile(join(rootPath, 'resource/sls_yaml/generatedCode/source/generated-sns-in-sqs.yml'), 'utf8'),
|
|
139
|
+
/^ SteppedCompleteHdrSqs:/m
|
|
140
|
+
);
|
|
141
|
+
assert.match(
|
|
142
|
+
await readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/generate-shared-resource.yml'), 'utf8'),
|
|
143
|
+
/GeneratedRole:/
|
|
144
|
+
);
|
|
145
|
+
|
|
146
|
+
await writeFile(join(rootPath, 'app/src/schemas/FlowSchemas/Stepped.js'), "export default { flowTag: 'stepped', event: ['ownTopic'] };\n");
|
|
147
|
+
await writeFile(join(rootPath, 'app/src/schemas/FlowSchemas/Generated.js'), "export default { flowTag: 'generated', event: ['ownTopic'], generatedCodeConfig: { generatedCodeTag: 'create' } };\n");
|
|
148
|
+
await generateCustomFlowApplicationArtifacts(rootPath);
|
|
149
|
+
await generateResourceArtifacts(rootPath);
|
|
150
|
+
|
|
151
|
+
await assert.rejects(readFile(join(rootPath, 'app/src/generatedCode/FlowSchemas/Stepped/source/SteppedComplete_HdrSqs.js')));
|
|
152
|
+
await assert.rejects(readFile(join(rootPath, 'app/src/generatedCode/FlowSchemas/Generated/source/GeneratedComplete_HdrSqs.js')));
|
|
153
|
+
assert.doesNotMatch(
|
|
154
|
+
await readFile(join(rootPath, 'resource/sls_yaml/generatedCode/source/generated-sns-in-sqs.yml'), 'utf8'),
|
|
155
|
+
/^ SteppedCompleteHdrSqs:/m
|
|
156
|
+
);
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
test('emits and removes the legacy trigger-cache artifact suite', async () => {
|
|
160
|
+
const rootPath = await createTriggerCacheProject();
|
|
161
|
+
await generateCustomFlowApplicationArtifacts(rootPath);
|
|
162
|
+
await generateResourceArtifacts(rootPath);
|
|
163
|
+
|
|
164
|
+
const source = 'app/src/generatedCode/FlowSchemas/Cart/source';
|
|
165
|
+
for (const fileName of [
|
|
166
|
+
'ProcessTriggerCacheCart_Main.js',
|
|
167
|
+
'ProcessTriggerCacheCart_HdrDsq.js',
|
|
168
|
+
'CheckTriggerCacheCartComplete_Main.js',
|
|
169
|
+
'CheckTriggerCacheCartComplete_HdrSqs.js',
|
|
170
|
+
'TriggerCacheCartComplete_Main.js',
|
|
171
|
+
'TriggerCacheCartComplete_HdrSqs.js',
|
|
172
|
+
'TriggerCacheCartComplete_HdrDsq.js'
|
|
173
|
+
]) {
|
|
174
|
+
const path = join(rootPath, source, fileName);
|
|
175
|
+
await access(path);
|
|
176
|
+
await parseAsEsm(path);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
const flowYaml = await readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/flow-schema.yml'), 'utf8');
|
|
180
|
+
for (const functionName of [
|
|
181
|
+
'ProcessTriggerCacheCartHdrDsq',
|
|
182
|
+
'CheckTriggerCacheCartCompleteHdrSqs',
|
|
183
|
+
'TriggerCacheCartCompleteHdrSqs',
|
|
184
|
+
'TriggerCacheCartCompleteHdrDsq'
|
|
185
|
+
]) {
|
|
186
|
+
assert.match(flowYaml, new RegExp(`^${functionName}:`, 'm'));
|
|
187
|
+
}
|
|
188
|
+
assert.match(
|
|
189
|
+
await readFile(join(rootPath, `${source}/CheckTriggerCacheCartComplete_HdrSqs.js`), 'utf8'),
|
|
190
|
+
/record\.body\.Message\.identifiers/
|
|
191
|
+
);
|
|
192
|
+
|
|
193
|
+
const resources = await readFile(join(rootPath, 'resource/sls_yaml/generatedCode/source/generated-sns-in-sqs.yml'), 'utf8');
|
|
194
|
+
assert.match(resources, /^ OrderCartMain:/m);
|
|
195
|
+
for (const queueName of [
|
|
196
|
+
'OrderCart_Main',
|
|
197
|
+
'CheckTriggerCacheCartCompleteHdrSqs',
|
|
198
|
+
'TriggerCacheCartCompleteHdrSqs',
|
|
199
|
+
'TriggerCacheCartCompleteHdrDsq'
|
|
200
|
+
]) assert.match(resources, new RegExp('QueueName: \\$\\{self:custom\\.iz_resourcePrefix\\}' + queueName));
|
|
201
|
+
const iam = await readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/generate-shared-resource.yml'), 'utf8');
|
|
202
|
+
for (const queueName of ['OrderCart_Main', 'CheckTriggerCacheCartCompleteHdrSqs', 'TriggerCacheCartCompleteHdrSqs', 'TriggerCacheCartCompleteHdrDsq']) {
|
|
203
|
+
assert.match(iam, new RegExp(`CartRole:[\\s\\S]*${queueName}`));
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
await writeFile(join(rootPath, 'app/src/schemas/FlowSchemas/Cart.js'), "export default { flowTag: 'cart', event: ['ownTopic'], statusType: 'none' };\n");
|
|
207
|
+
await generateCustomFlowApplicationArtifacts(rootPath);
|
|
208
|
+
await generateResourceArtifacts(rootPath);
|
|
209
|
+
|
|
210
|
+
await assert.rejects(readFile(join(rootPath, `${source}/ProcessTriggerCacheCart_Main.js`)));
|
|
211
|
+
assert.doesNotMatch(await readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/flow-schema.yml'), 'utf8'), /ProcessTriggerCacheCartHdrDsq/);
|
|
212
|
+
assert.doesNotMatch(await readFile(join(rootPath, 'resource/sls_yaml/generatedCode/source/generated-sns-in-sqs.yml'), 'utf8'), /OrderCart_Main/);
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
test('rejects an EventBridge schedule without a deployable name and rate', () => {
|
|
216
|
+
assert.throws(
|
|
217
|
+
() => renderEventBridgeFunctionYaml({
|
|
218
|
+
functionName: 'ProcessEventHdrInv',
|
|
219
|
+
handlerPath: 'src/generatedCode/FlowSchemas/Event/source/ProcessEvent_HdrInv.main',
|
|
220
|
+
roleName: 'EventRole',
|
|
221
|
+
flowTag: 'Event',
|
|
222
|
+
schedules: [{ name: 'missing-rate' }]
|
|
223
|
+
}),
|
|
224
|
+
/Each EventBridge schedule/
|
|
225
|
+
);
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
async function createProject() {
|
|
229
|
+
const rootPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-custom-flow-'));
|
|
230
|
+
roots.add(rootPath);
|
|
231
|
+
const schemaRoot = join(rootPath, 'app/src/schemas/FlowSchemas');
|
|
232
|
+
const objectSchemaRoot = join(rootPath, 'app/src/schemas/ObjectSchemas');
|
|
233
|
+
const helperRoot = join(rootPath, 'app/src/generatedCode/libs/source');
|
|
234
|
+
await Promise.all([mkdir(schemaRoot, { recursive: true }), mkdir(objectSchemaRoot, { recursive: true }), mkdir(helperRoot, { recursive: true })]);
|
|
235
|
+
await writeFile(join(helperRoot, 'GenerateCodeLibs.js'), 'export const getNestObject = () => {};\nexport const processStaticLimit = () => {};\nexport const postToConnection = () => {};\n');
|
|
236
|
+
await writeFile(
|
|
237
|
+
join(objectSchemaRoot, 'Order.js'),
|
|
238
|
+
"export default [{ objectType: 'order', serviceTag: 'Other', storageResources: { main: { storageType: 'dynamoDB', tableName: 'OtherOrderTable' } } }, { objectType: 'order', serviceTag: 'Current', storageResources: { main: { storageType: 'dynamoDB', tableName: 'CurrentOrderTable' } } }];\n"
|
|
239
|
+
);
|
|
240
|
+
await writeFile(join(schemaRoot, 'Flows.js'), `
|
|
241
|
+
const base = { flowSteps: [{ stepName: 'start', properties: ['dummyId'] }], stepProperties: { dummyId: { type: 'string' } } };
|
|
242
|
+
export default [
|
|
243
|
+
{ ...base, flowTag: 'event', event: ['eventBridge'], schedules: [{ name: 'every-minute', rate: ['rate(1 minute)'] }] },
|
|
244
|
+
{ ...base, flowTag: 'ext', event: ['extTopic'] },
|
|
245
|
+
{ ...base, flowTag: 'inv', event: ['lambdaSyncInv'] },
|
|
246
|
+
{ ...base, flowTag: 'api', event: ['lambdaSyncApi'] },
|
|
247
|
+
{ ...base, flowTag: 'own', event: ['ownTopic'] },
|
|
248
|
+
{ ...base, flowTag: 'cache', event: ['ownTopic'], statusType: 'storedCache', objType: { objectType: 'order', serviceTag: 'Current' } },
|
|
249
|
+
{ ...base, flowTag: 'mixed', event: ['ownTopic', 'extTopic'] },
|
|
250
|
+
{ ...base, flowTag: 'generated', event: ['ownTopic'], generatedCodeConfig: { generatedCodeTag: 'create' } },
|
|
251
|
+
{ ...base, flowTag: 'upload', event: ['s3'] }
|
|
252
|
+
];
|
|
253
|
+
`);
|
|
254
|
+
return rootPath;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
async function parseAsEsm(path) {
|
|
258
|
+
await execFileAsync(process.execPath, [
|
|
259
|
+
'--experimental-vm-modules',
|
|
260
|
+
'--input-type=module',
|
|
261
|
+
'--eval',
|
|
262
|
+
parseEsmSource,
|
|
263
|
+
'--',
|
|
264
|
+
path
|
|
265
|
+
]);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
async function createStepProject() {
|
|
269
|
+
const rootPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-custom-step-'));
|
|
270
|
+
roots.add(rootPath);
|
|
271
|
+
const schemaRoot = join(rootPath, 'app/src/schemas/FlowSchemas');
|
|
272
|
+
await mkdir(schemaRoot, { recursive: true });
|
|
273
|
+
await writeFile(
|
|
274
|
+
join(schemaRoot, 'Stepped.js'),
|
|
275
|
+
"export default { flowTag: 'stepped', event: ['ownTopic'], flowSteps: [{ stepName: 'start' }, { stepName: 'Complete', event: ['extTopic'] }] };\n"
|
|
276
|
+
);
|
|
277
|
+
await writeFile(
|
|
278
|
+
join(schemaRoot, 'Generated.js'),
|
|
279
|
+
"export default { flowTag: 'generated', event: ['ownTopic'], generatedCodeConfig: { generatedCodeTag: 'create' }, flowSteps: [{ stepName: 'start' }, { stepName: 'Complete', event: ['extTopic'] }] };\n"
|
|
280
|
+
);
|
|
281
|
+
return rootPath;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
async function createTriggerCacheProject() {
|
|
285
|
+
const rootPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-trigger-cache-'));
|
|
286
|
+
roots.add(rootPath);
|
|
287
|
+
const schemaRoot = join(rootPath, 'app/src/schemas/FlowSchemas');
|
|
288
|
+
await mkdir(schemaRoot, { recursive: true });
|
|
289
|
+
await writeFile(
|
|
290
|
+
join(schemaRoot, 'Cart.js'),
|
|
291
|
+
"export default { flowTag: 'cart', event: ['ownTopic'], statusType: 'triggerCache', objType: { serviceTag: 'Order' } };\n"
|
|
292
|
+
);
|
|
293
|
+
return rootPath;
|
|
294
|
+
}
|