@izara_project/izara-core-generate-service-code 1.0.64 → 1.0.66
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +73 -11
- package/index.js +0 -5
- package/package.json +7 -6
- package/src/compile/compileProject.js +26 -0
- package/src/compile/loadSchemas.js +28 -0
- package/src/emit/crud/dynamicCrudFlowSchemaTemplate.js +11 -0
- package/src/emit/crud/emitCrudApplicationArtifacts.js +157 -0
- package/src/emit/crud/emitDynamicCrudFlowSchemas.js +84 -0
- package/src/emit/crud/generateCrudApplicationArtifacts.js +16 -0
- package/src/emit/crud/generateDynamicCrudFlowSchemas.js +21 -0
- package/src/emit/crud/loadLocalSchemaArrays.js +8 -0
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowObjects/templates/crud → emit/crud/templates}/CreateEndpoint_Main.ejs +1 -1
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowObjects/templates/crud → emit/crud/templates}/DeleteEndpoint_Main.ejs +1 -1
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowObjects/templates/step → emit/crud/templates}/FlowEndpointBeforeLogical_Main.ejs +2 -2
- package/src/emit/crud/templates/FlowEndpointComplete_Main.ejs +75 -0
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/endpoint → emit/crud/templates}/FlowEndpoint_HdrWbs.ejs +1 -1
- package/src/{codeGenerators/app/src/generatedCode/ProcessLogical/templates/ProcessLogical_HdrSqs.ejs → emit/crud/templates/FlowHandler_HdrSqs.ejs} +52 -56
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/endpoint → emit/crud/templates}/FlowMain_Wbs.ejs +1 -3
- package/src/emit/crud/templates/GetRangeEndpoint_Main.ejs +127 -0
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowObjects/templates/crud → emit/crud/templates}/UpdateEndpoint_Main.ejs +1 -1
- package/src/emit/custom/customFlows.js +70 -0
- package/src/emit/custom/emitCustomFlowApplicationArtifacts.js +308 -0
- package/src/emit/custom/generateCustomFlowApplicationArtifacts.js +22 -0
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/endpoint → emit/custom/templates}/FlowEndpoint_Main.ejs +1 -1
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step → emit/custom/templates}/FlowStep_Main.ejs +1 -1
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/ConfirmReserved_Main.ejs +5 -5
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/CreateObject_HdrWbs.ejs +1 -1
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/CreateObject_Main.ejs +3 -3
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/CreatePreSignUrl_Main.ejs +4 -5
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/FlowHandler_HdrS3.ejs +2 -8
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/ProcessS3File_Main.ejs +1 -1
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/ReservedLimit_Main.ejs +5 -6
- package/src/emit/custom/templates/triggerCache/CheckTriggerCache_HdrSqs.ejs +32 -0
- package/src/emit/custom/templates/triggerCache/CheckTriggerCache_Main.ejs +63 -0
- package/src/emit/custom/templates/triggerCache/TriggerCacheComplete_Main.ejs +35 -0
- package/src/emit/custom/templates/triggerCache/TriggerCache_Main.ejs +16 -0
- package/src/emit/function/functionYamlArtifact.js +111 -0
- package/src/emit/rbac/emitDynamicRbacFlowSchemas.js +117 -0
- package/src/emit/rbac/emitRbacApplicationArtifacts.js +256 -0
- package/src/emit/rbac/generateCreateTargetRoleHandler.js +19 -0
- package/src/emit/rbac/generateDynamicRbacFlowSchemas.js +21 -0
- package/src/emit/rbac/rbacFlowTag.js +7 -0
- package/src/emit/rbac/templates/CreateTargetRole_HdrSqs.ejs +24 -0
- package/src/emit/rbac/templates/CreateTargetRole_Main.ejs +25 -0
- package/src/emit/rbac/templates/DynamicRbacFlowSchema.ejs +5 -0
- package/src/emit/rbac/templates/ListRbac_HdrApi.ejs +17 -0
- package/src/emit/rbac/templates/ListRbac_HdrSqs.ejs +13 -0
- package/src/emit/rbac/templates/ListRbac_Main.ejs +29 -0
- package/src/emit/rbac/templates/RbacMutation_Main.ejs +22 -0
- package/src/emit/rbac/templates/UserRbacFlow_HdrInv.ejs +10 -0
- package/src/emit/rbac/templates/UserRbacFlow_Main.ejs +44 -0
- package/src/emit/rbac/templates/UserRoleMutation_Main.ejs +33 -0
- package/src/emit/relationship/dynamicRelationshipFlowSchemaTemplate.js +11 -0
- package/src/emit/relationship/emitDynamicRelationshipFlowSchemas.js +66 -0
- package/src/emit/relationship/emitRelationshipApplicationArtifacts.js +147 -0
- package/src/emit/relationship/generateDynamicRelationshipFlowSchemas.js +23 -0
- package/src/emit/relationship/generateRelationshipApplicationArtifacts.js +22 -0
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessChangeRelationshipComplete_Main.ejs → emit/relationship/templates/ChangeRelationshipComplete_Main.ejs} +1 -1
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessChangeRelationship_Main.ejs → emit/relationship/templates/ChangeRelationship_Main.ejs} +10 -2
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessCreateRelationshipComplete_Main.ejs → emit/relationship/templates/CreateRelationshipComplete_Main.ejs} +1 -1
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessCreateRelationship_Main.ejs → emit/relationship/templates/CreateRelationship_Main.ejs} +1 -1
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessDeleteRelationshipComplete_Main.ejs → emit/relationship/templates/DeleteRelationshipComplete_Main.ejs} +1 -1
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessDeleteRelationship_Main.ejs → emit/relationship/templates/DeleteRelationship_Main.ejs} +1 -1
- package/src/emit/relationship/templates/FlowHandler_HdrApi.ejs +51 -0
- package/src/{codeGenerators/app/src/generatedCode/Flow/_shared/handlers → emit/relationship/templates}/FlowHandler_HdrDsq.ejs +1 -1
- package/src/emit/relationship/templates/FlowHandler_HdrInv.ejs +45 -0
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessGetRelationshipComplete_Main.ejs → emit/relationship/templates/GetRelationshipComplete_Main.ejs} +1 -1
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessGetRelationship_Main.ejs → emit/relationship/templates/GetRelationship_Main.ejs} +1 -1
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessMoveRelationship_Main.ejs → emit/relationship/templates/MoveRelationship_Main.ejs} +9 -1
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessUpdateRelationshipComplete_Main.ejs → emit/relationship/templates/UpdateRelationshipComplete_Main.ejs} +1 -1
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessUpdateRelationship_Main.ejs → emit/relationship/templates/UpdateRelationship_Main.ejs} +1 -1
- package/src/emit/resource/emitResourceArtifacts.js +300 -0
- package/src/emit/resource/generateResourceArtifacts.js +20 -0
- package/src/{codeGenerators/resource/sls_yaml/templates/crud → emit/resource/templates}/ResourceBeforeLogicalYaml.ejs +1 -1
- package/src/{codeGenerators/resource/sls_yaml/templates/crud → emit/resource/templates}/ResourceSqsYaml.ejs +6 -6
- package/src/{codeGenerators/app/sls_yaml → emit/resource}/templates/SharedResource_Yaml.ejs +8 -8
- package/src/emit/system/emitSystemWebSocketArtifacts.js +182 -0
- package/src/generate.js +60 -126
- package/src/output/commitArtifacts.js +213 -0
- package/src/output/mergeHooks.js +55 -0
- package/src/output/validateArtifacts.js +62 -0
- package/src/plan/buildGenerationPlan.js +50 -0
- package/test/core.test.js +159 -0
- package/test/createTargetRoleHandler.test.js +68 -0
- package/test/crudApplicationArtifacts.test.js +107 -0
- package/test/customFlowApplicationArtifacts.test.js +294 -0
- package/test/dynamicCrudFlowSchemas.test.js +136 -0
- package/test/dynamicRbacFlowSchemas.test.js +101 -0
- package/test/dynamicRelationshipFlowSchemas.test.js +99 -0
- package/test/functionYamlArtifact.test.js +34 -0
- package/test/intTestApi.test.js +29 -0
- package/test/publicApi.test.js +209 -0
- package/test/relationshipApplicationArtifacts.test.js +68 -0
- package/test/resourceArtifacts.test.js +121 -0
- package/jsconfig.json +0 -9
- package/src/__tests__/getIntTestConfig.test.js +0 -51
- package/src/__tests__/intTestGeneratorShared.test.cjs +0 -169
- package/src/__tests__/pathIntTest.test.js +0 -103
- package/src/codeGenerators/app/initial_setup/InitialSetupGenerator.js +0 -199
- package/src/codeGenerators/app/initial_setup/templates/InitialSetup_LambdaRole.ejs +0 -50
- package/src/codeGenerators/app/initial_setup/templates/InitialSetup_SnsService.ejs +0 -15
- package/src/codeGenerators/app/initial_setup/templates/InitialSetup_TableName.ejs +0 -9
- package/src/codeGenerators/app/sls_yaml/FindDataYamlGenerator.js +0 -23
- package/src/codeGenerators/app/sls_yaml/FunctionYamlGenerator.js +0 -322
- package/src/codeGenerators/app/sls_yaml/ProcessLogicalYamlGenerator.js +0 -21
- package/src/codeGenerators/app/sls_yaml/RoleNameConfigGenerator.js +0 -48
- package/src/codeGenerators/app/sls_yaml/SharedResourceYamlGenerator.js +0 -504
- package/src/codeGenerators/app/sls_yaml/__tests__/SharedResourceYamlGenerator.test.js +0 -235
- package/src/codeGenerators/app/sls_yaml/_policy/PolicyEmitter.js +0 -46
- package/src/codeGenerators/app/sls_yaml/_policy/PolicyRegistry.js +0 -94
- package/src/codeGenerators/app/sls_yaml/_policy/__tests__/PolicyEmitter.test.js +0 -55
- package/src/codeGenerators/app/sls_yaml/_policy/__tests__/PolicyRegistry.test.js +0 -48
- package/src/codeGenerators/app/sls_yaml/_policy/templates/ManagedPolicy_Yaml.ejs +0 -22
- package/src/codeGenerators/app/sls_yaml/renderYamlTemplate.js +0 -13
- package/src/codeGenerators/app/sls_yaml/templates/FindData_Yaml.ejs +0 -10
- package/src/codeGenerators/app/sls_yaml/templates/FunctionYaml_Api.ejs +0 -21
- package/src/codeGenerators/app/sls_yaml/templates/FunctionYaml_EventBridge.ejs +0 -14
- package/src/codeGenerators/app/sls_yaml/templates/FunctionYaml_Inv.ejs +0 -6
- package/src/codeGenerators/app/sls_yaml/templates/FunctionYaml_Sqs.ejs +0 -11
- package/src/codeGenerators/app/sls_yaml/templates/FunctionYaml_Wbs.ejs +0 -11
- package/src/codeGenerators/app/sls_yaml/templates/ProcessLogical_Yaml.ejs +0 -32
- package/src/codeGenerators/app/sls_yaml/templates/RoleNameConfig_Yaml.ejs +0 -5
- package/src/codeGenerators/app/src/generatedCode/FindData/FindDataGenerator.js +0 -238
- package/src/codeGenerators/app/src/generatedCode/FindData/templates/FindData_HdrSqs.ejs +0 -87
- package/src/codeGenerators/app/src/generatedCode/FindData/templates/FindData_Main.ejs +0 -108
- package/src/codeGenerators/app/src/generatedCode/FindData/templates/GetByStorage/getByDynamo.ejs +0 -32
- package/src/codeGenerators/app/src/generatedCode/FindData/templates/GetByStorage/getByGraph.ejs +0 -87
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowObjects/.gitkeep +0 -0
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowObjects/EndpointsGenerator.js +0 -120
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowObjects/templates/step/FlowEndpointComplete_Main.ejs +0 -313
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/RbacFlowGenerator.js +0 -116
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/CreateRolePermissions.ejs +0 -135
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/CreateTargetRole.ejs +0 -131
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/CreateUserRole.ejs +0 -150
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/DeleteRolePermissions.ejs +0 -132
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/DeleteTargetRole.ejs +0 -132
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/DeleteUserFromRole.ejs +0 -150
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/FlowRbac_Main.ejs +0 -252
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/ListRolePermissions.ejs +0 -120
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/ListTargetRole.ejs +0 -122
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/ListUserInRoles.ejs +0 -117
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowRelationships/RelationshipFlowGenerator.js +0 -148
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/.gitkeep +0 -0
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/StatusFieldGenerator.js +0 -109
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/WebSocketGenerator.js +0 -122
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/endpoint/FlowEntryPoint_Main.ejs +0 -38
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/statusField/CompleteStatusFieldSns_Yaml.ejs +0 -52
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/statusField/CompleteStatusField_HdrSqs.ejs +0 -84
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/statusField/CompleteStatusField_Main.ejs +0 -78
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/FlowStep_ByConfig_Awaiting_Main.ejs +0 -123
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/FlowStep_ByConfig_Paginated_Main.ejs +0 -59
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/FlowStep_PlugIn_Main.ejs +0 -72
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/FlowStep_RecievePlugIn_Main.ejs +0 -76
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/templateAwaitingStep.ejs +0 -41
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/templateSendPlugin.ejs +0 -18
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/ProcessWebSocketFlow_Yaml.ejs +0 -26
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/ProcessWebSocketSub_Yaml.ejs +0 -7
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/ProcessWebSocket_HdrSqs.ejs +0 -66
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/ProcessWebSocket_Main.ejs +0 -115
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/ProcessWebSocket_Yaml.ejs +0 -36
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/WebSocketConnect_Main.ejs +0 -52
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/WebSocketConnect_Yaml.ejs +0 -13
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/WebSocketDynamoDb_Yaml.ejs +0 -28
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/BaseDsqHandler.js +0 -55
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/BaseSqsHandler.js +0 -66
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/__tests__/BaseDsqHandler.test.js +0 -93
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/dsq.js +0 -5
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/eventBridge.js +0 -25
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/extTopic.js +0 -6
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/lambdaSyncApi.js +0 -43
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/lambdaSyncInv.js +0 -43
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/ownTopic.js +0 -54
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/registry.js +0 -17
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3.js +0 -56
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3Components/ConfirmAfterUploadS3Generator.js +0 -46
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3Components/CreateObjectGenerator.js +0 -50
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3Components/CreatePreSignUrlGenerator.js +0 -48
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3Components/ProcessAfterUploadS3Generator.js +0 -49
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3Components/ReservedLimitGenerator.js +0 -47
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/eventTypes.js +0 -23
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowClassifier.js +0 -50
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowEntryPointBase.js +0 -106
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowMainFunctionBase.js +0 -172
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowNaming.js +0 -37
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowSelection.js +0 -19
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowStepBase.js +0 -235
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowStepNormalizer.js +0 -75
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowValidator.js +0 -236
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/propertyNormalizer.js +0 -15
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/registry.js +0 -7
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/roleNameDetection.js +0 -49
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/triggerCacheBase.js +0 -177
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/CheckTriggerCache_HdrSqs.ejs +0 -89
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/CheckTriggerCache_Main.ejs +0 -83
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/ProcessTriggerCache_HdrSqs.ejs +0 -103
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/ProcessTriggerCache_Main.ejs +0 -58
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/TriggerCacheComplete_HdrDsq.ejs +0 -104
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/TriggerCacheComplete_HdrSqs.ejs +0 -88
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/TriggerCacheComplete_Main.ejs +0 -80
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/TriggerCacheQueue_Yaml.ejs +0 -36
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/yaml/SharedFunctionSqs_Yaml.ejs +0 -13
- package/src/codeGenerators/app/src/generatedCode/ProcessLogical/ProcessLogicalGenerator.js +0 -29
- package/src/codeGenerators/app/src/generatedCode/ProcessLogical/templates/PaginateProcessLogical_HdrDsq.ejs +0 -177
- package/src/codeGenerators/app/src/generatedCode/ProcessLogical/templates/PaginateProcessLogical_HdrSqs.ejs +0 -155
- package/src/codeGenerators/app/src/generatedCode/ProcessLogical/templates/PaginateProcessLogical_Main.ejs +0 -268
- package/src/codeGenerators/app/src/generatedCode/ProcessLogical/templates/ProcessLogical_Main.ejs +0 -450
- package/src/codeGenerators/app/src/generatedCode/SystemFlowSchemas/RegisterGenerator.js +0 -149
- package/src/codeGenerators/app/src/generatedCode/SystemFlowSchemas/templates/register/RegisterComplete_HdrSqs.ejs +0 -85
- package/src/codeGenerators/app/src/generatedCode/SystemFlowSchemas/templates/register/RegisterComplete_Main.ejs +0 -176
- package/src/codeGenerators/app/src/generatedCode/SystemFlowSchemas/templates/register/Register_HdrWbs.ejs +0 -80
- package/src/codeGenerators/app/src/generatedCode/SystemFlowSchemas/templates/register/Register_Main.ejs +0 -164
- package/src/codeGenerators/app/src/generatedCode/libs/ConstsGenerator.js +0 -28
- package/src/codeGenerators/app/src/generatedCode/libs/GenerateCodeLibsGenerator.js +0 -28
- package/src/codeGenerators/app/src/generatedCode/libs/templates/Consts.ejs +0 -448
- package/src/codeGenerators/app/src/generatedCode/libs/templates/GenerateCodeLibs.ejs +0 -124
- package/src/codeGenerators/resource/sls_yaml/DynamoDBGenerator.js +0 -87
- package/src/codeGenerators/resource/sls_yaml/FlowOutGenerator.js +0 -70
- package/src/codeGenerators/resource/sls_yaml/FlowResourceYamlGenerator.js +0 -182
- package/src/core/renderTemplateFile.js +0 -22
- package/src/core/validate.js +0 -165
- package/src/generateCode.js +0 -358
- package/src/generateSchema.js +0 -123
- package/src/parsers/flowSchemaParser.js +0 -112
- package/src/parsers/objectSchemaParser.js +0 -39
- package/src/parsers/relationshipSchemaParser.js +0 -51
- package/src/schemaGenerators/app/src/schemas/FlowSchemas/FlowSchemaGenerator.js +0 -107
- package/src/schemaGenerators/app/src/schemas/FlowSchemas/RbacFlowSchemaGenerator.js +0 -98
- package/src/schemaGenerators/app/src/schemas/FlowSchemas/RelationshipFlowSchemaGenerator.js +0 -89
- package/src/schemaGenerators/app/src/schemas/FlowSchemas/templates/DynamicFlowSchemaTemplate.ejs +0 -41
- package/src/schemaGenerators/app/src/schemas/FlowSchemas/templates/DynamicRbacFlowSchemaTemplate.ejs +0 -20
- package/src/schemaGenerators/app/src/schemas/FlowSchemas/templates/RelationshipFlowSchemaTemplate.ejs +0 -33
- package/src/schemaGenerators/app/src/schemas/FlowSchemas/templates/UserRbacFlowSchemaTemplate.ejs +0 -22
- package/src/schemaGenerators/app/src/schemas/ObjectSchemas/AttributeTreeSchemaGenerator.js +0 -124
- package/src/schemaGenerators/app/src/schemas/ObjectSchemas/PropertyValueSchemaGenerator.js +0 -119
- package/src/schemaGenerators/app/src/schemas/ObjectSchemas/templates/DynamicAttributeTreeManagerSchemaTemplate.ejs +0 -14
- package/src/schemaGenerators/app/src/schemas/ObjectSchemas/templates/DynamicAttributeTreeStandardSchemaTemplate.ejs +0 -13
- package/src/schemaGenerators/app/src/schemas/ObjectSchemas/templates/DynamicPropertyValueSchemaTemplate.ejs +0 -15
- package/src/schemaGenerators/app/src/schemas/RelationshipSchemas/AttributeTreeRelationshipSchemaGenerator.js +0 -149
- package/src/schemaGenerators/app/src/schemas/RelationshipSchemas/PropertyValueRelationshipSchemaGenerator.js +0 -143
- package/src/schemaGenerators/app/src/schemas/RelationshipSchemas/templates/DynamicAttributeTreeRelationshipSchemaTemplate.ejs +0 -7
- package/src/schemaGenerators/app/src/schemas/RelationshipSchemas/templates/DynamicPropertyValueRelationshipSchemaTemplate.ejs +0 -7
- package/src/schemaGenerators/app/src/schemas/SystemTextSchemas/SystemTextGenerator.js +0 -102
- package/src/schemaGenerators/app/src/schemas/SystemTextSchemas/templates/SystemText_Template.ejs +0 -10
- package/test_schema.js +0 -2
- /package/src/{codeGenerators/app/src/generatedCode/Flow/_shared/handlers → emit/crud/templates}/FlowHandler_HdrApi.ejs +0 -0
- /package/src/{codeGenerators/app/src/generatedCode/Flow/_shared/handlers → emit/crud/templates}/FlowHandler_HdrInv.ejs +0 -0
- /package/src/{codeGenerators/app/src/generatedCode/Flow/FlowObjects/templates/crud → emit/crud/templates}/GetEndpoint_Main.ejs +0 -0
- /package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/ConfirmReserved_HdrSqs.ejs +0 -0
- /package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/CreatePreSignUrl_HdrSqs.ejs +0 -0
- /package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/ReservedLimit_HdrSqs.ejs +0 -0
- /package/src/{codeGenerators/app/src/generatedCode/Flow/_shared/handlers → emit/relationship/templates}/FlowHandler_HdrSqs.ejs +0 -0
- /package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessMoveRelationshipComplete_Main.ejs → emit/relationship/templates/MoveRelationshipComplete_Main.ejs} +0 -0
- /package/src/{codeGenerators/resource/sls_yaml → emit/resource}/templates/DynamoDBTable_Yaml.ejs +0 -0
- /package/src/{codeGenerators/resource/sls_yaml → emit/resource}/templates/FlowOut_Yaml.ejs +0 -0
- /package/src/{codeGenerators/resource/sls_yaml/templates/crud → emit/resource/templates}/ResourceYaml.ejs +0 -0
- /package/src/{codeGenerators/resource/sls_yaml → emit/resource}/templates/SystemDynamoDB_Yaml.ejs +0 -0
|
@@ -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
|
+
});
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { mkdtemp, mkdir, rm, writeFile } from 'node:fs/promises';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import test from 'node:test';
|
|
6
|
+
|
|
7
|
+
import {
|
|
8
|
+
generateIntTest,
|
|
9
|
+
generateResourceIntTest
|
|
10
|
+
} from '../index.js';
|
|
11
|
+
|
|
12
|
+
test('exports IntTest generators and requires a service tag', async () => {
|
|
13
|
+
const rootPath = await mkdtemp(path.join(os.tmpdir(), 'generate-service-code-inttest-'));
|
|
14
|
+
await mkdir(path.join(rootPath, 'config'));
|
|
15
|
+
await writeFile(path.join(rootPath, 'config', 'serverless.config.yml'), 'main_config: {}\n');
|
|
16
|
+
|
|
17
|
+
try {
|
|
18
|
+
await assert.rejects(
|
|
19
|
+
generateIntTest(rootPath),
|
|
20
|
+
/Missing iz_serviceTag/
|
|
21
|
+
);
|
|
22
|
+
await assert.rejects(
|
|
23
|
+
generateResourceIntTest(rootPath),
|
|
24
|
+
/Missing iz_serviceTag/
|
|
25
|
+
);
|
|
26
|
+
} finally {
|
|
27
|
+
await rm(rootPath, { recursive: true, force: true });
|
|
28
|
+
}
|
|
29
|
+
});
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { execFileSync } from 'node:child_process';
|
|
3
|
+
import { mkdir, mkdtemp, readFile, writeFile } from 'node:fs/promises';
|
|
4
|
+
import { tmpdir } from 'node:os';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import test from 'node:test';
|
|
7
|
+
|
|
8
|
+
import * as publicApi from '../index.js';
|
|
9
|
+
|
|
10
|
+
const { generate } = publicApi;
|
|
11
|
+
|
|
12
|
+
test('public package surface exposes generation and IntTest APIs', () => {
|
|
13
|
+
assert.deepEqual(Object.keys(publicApi), [
|
|
14
|
+
'generate',
|
|
15
|
+
'generateIntTest',
|
|
16
|
+
'generateResourceIntTest'
|
|
17
|
+
]);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
test('generate commits schemas, application artifacts, and resources in one public result', async () => {
|
|
21
|
+
const rootPath = await createCrudProject();
|
|
22
|
+
const result = await generate(rootPath);
|
|
23
|
+
|
|
24
|
+
assert.equal(result.files.length, 36);
|
|
25
|
+
assert.equal(result.project.rootPath, rootPath);
|
|
26
|
+
assert.match(
|
|
27
|
+
await readFile(join(rootPath, 'app/src/generatedCode/FlowObjects/Create/source/Create_Main.js'), 'utf8'),
|
|
28
|
+
/CreateMainLogical/
|
|
29
|
+
);
|
|
30
|
+
assert.match(
|
|
31
|
+
await readFile(join(rootPath, 'resource/sls_yaml/generatedCode/source/generated-dynamoDB-table.yml'), 'utf8'),
|
|
32
|
+
/Resources:/
|
|
33
|
+
);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
test('generate logs its lifecycle through the supplied logger', async () => {
|
|
37
|
+
const rootPath = await createCrudProject();
|
|
38
|
+
const messages = [];
|
|
39
|
+
const logger = Object.fromEntries(['info', 'debug', 'error'].map(level => [level, message => messages.push(message)]));
|
|
40
|
+
|
|
41
|
+
await generate(rootPath, { logger });
|
|
42
|
+
|
|
43
|
+
assert.match(messages[0], /STATUS=STARTED/);
|
|
44
|
+
assert.ok(messages.some(message => /STATUS=SCHEMAS_LOADED/.test(message)));
|
|
45
|
+
assert.ok(messages.some(message => /STATUS=ARTIFACTS_EMITTED/.test(message)));
|
|
46
|
+
assert.match(messages.at(-1), /STATUS=FINISHED/);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
test('generate commits RBAC WebSocket entries for own-topic mutation flows', async () => {
|
|
50
|
+
const rootPath = await createRbacProject();
|
|
51
|
+
|
|
52
|
+
const result = await generate(rootPath, { serviceTag: 'UserAccount' });
|
|
53
|
+
|
|
54
|
+
assert.ok(result.files.some(file => file.path === 'app/src/generatedCode/FlowRbac/CreateTargetRole/source/CreateTargetRole_HdrWbs.js'));
|
|
55
|
+
assert.match(
|
|
56
|
+
await readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/flow-rbac.yml'), 'utf8'),
|
|
57
|
+
/CreateTargetRoleHdrWbs:\n[\s\S]*websocket:/
|
|
58
|
+
);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
test('generate commits the system WebSocket completion path for own-topic flows', async () => {
|
|
62
|
+
const rootPath = await createOwnTopicProject();
|
|
63
|
+
const result = await generate(rootPath);
|
|
64
|
+
|
|
65
|
+
assert.ok(result.files.some(file => file.path === 'app/src/generatedCode/SystemFlowSchemas/WebSocketMain/source/WebSocketComplete_HdrSqs.js'));
|
|
66
|
+
assert.ok(result.files.some(file => file.path === 'app/src/generatedCode/FlowSchemas/Track/source/Track_HdrWbs.js'));
|
|
67
|
+
assert.match(
|
|
68
|
+
await readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/flow-schema.yml'), 'utf8'),
|
|
69
|
+
/WebSocketConnect:[\s\S]*route: \$connect[\s\S]*WebSocketCompleteHdrSqs:/
|
|
70
|
+
);
|
|
71
|
+
assert.match(
|
|
72
|
+
await readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/flow-schema.yml'), 'utf8'),
|
|
73
|
+
/filterPatterns:[\s\S]*WebSocketCompleteHdrSqs/
|
|
74
|
+
);
|
|
75
|
+
assert.match(
|
|
76
|
+
await readFile(join(rootPath, 'resource/sls_yaml/generatedCode/source/generated-sns-in-sqs.yml'), 'utf8'),
|
|
77
|
+
/WebSocketCompleteHdrSqs:[\s\S]*SubscriptionToOutTrackWebSocketComplete:/
|
|
78
|
+
);
|
|
79
|
+
assert.match(
|
|
80
|
+
await readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/generate-shared-resource.yml'), 'utf8'),
|
|
81
|
+
/WebSocketMainRole:/
|
|
82
|
+
);
|
|
83
|
+
for (const path of [
|
|
84
|
+
'app/src/generatedCode/SystemFlowSchemas/WebSocketMain/source/WebSocketConnect.js',
|
|
85
|
+
'app/src/generatedCode/SystemFlowSchemas/WebSocketMain/source/WebSocketComplete_Main.js',
|
|
86
|
+
'app/src/generatedCode/SystemFlowSchemas/WebSocketMain/source/WebSocketComplete_HdrSqs.js',
|
|
87
|
+
'app/src/generatedCode/FlowSchemas/Track/source/Track_Main.js',
|
|
88
|
+
'app/src/generatedCode/FlowSchemas/Track/source/Track_HdrSqs.js',
|
|
89
|
+
'app/src/generatedCode/FlowSchemas/Track/source/Track_WbsMain.js',
|
|
90
|
+
'app/src/generatedCode/FlowSchemas/Track/source/Track_HdrWbs.js'
|
|
91
|
+
]) {
|
|
92
|
+
execFileSync(process.execPath, ['--check', join(rootPath, path)], { stdio: 'inherit' });
|
|
93
|
+
}
|
|
94
|
+
const webSocketComplete = await readFile(join(rootPath, 'app/src/generatedCode/SystemFlowSchemas/WebSocketMain/source/WebSocketComplete_Main.js'), 'utf8');
|
|
95
|
+
assert.match(webSocketComplete, /\(\<createIdentifiersFlow\>\)/);
|
|
96
|
+
assert.match(webSocketComplete, /\(\<beforePostMessage\>\)/);
|
|
97
|
+
const webSocketHandler = await readFile(join(rootPath, 'app/src/generatedCode/SystemFlowSchemas/WebSocketMain/source/WebSocketComplete_HdrSqs.js'), 'utf8');
|
|
98
|
+
assert.match(webSocketHandler, /record\.body\.TopicArn/);
|
|
99
|
+
assert.match(webSocketHandler, /addCallingFlowToPassOnProperties/);
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
test('generate commits the legacy trigger-cache suite with its queues', async () => {
|
|
103
|
+
const rootPath = await createTriggerCacheProject();
|
|
104
|
+
const result = await generate(rootPath);
|
|
105
|
+
|
|
106
|
+
for (const path of [
|
|
107
|
+
'app/src/generatedCode/FlowSchemas/Cart/source/ProcessTriggerCacheCart_Main.js',
|
|
108
|
+
'app/src/generatedCode/FlowSchemas/Cart/source/CheckTriggerCacheCartComplete_HdrSqs.js',
|
|
109
|
+
'app/src/generatedCode/FlowSchemas/Cart/source/TriggerCacheCartComplete_HdrDsq.js'
|
|
110
|
+
]) assert.ok(result.files.some(file => file.path === path));
|
|
111
|
+
assert.match(
|
|
112
|
+
await readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/flow-schema.yml'), 'utf8'),
|
|
113
|
+
/ProcessTriggerCacheCartHdrDsq:[\s\S]*TriggerCacheCartCompleteHdrDsq:/
|
|
114
|
+
);
|
|
115
|
+
assert.match(
|
|
116
|
+
await readFile(join(rootPath, 'resource/sls_yaml/generatedCode/source/generated-sns-in-sqs.yml'), 'utf8'),
|
|
117
|
+
/OrderCartMain:[\s\S]*TriggerCacheCartCompleteHdrDsq/
|
|
118
|
+
);
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
test('generate removes the system WebSocket path when the last own-topic flow is removed', async () => {
|
|
122
|
+
const rootPath = await createOwnTopicProject();
|
|
123
|
+
await generate(rootPath);
|
|
124
|
+
await writeFile(join(rootPath, 'app/src/schemas/FlowSchemas/Track.js'), "export default { flowTag: 'track', event: ['dsq'] };\n");
|
|
125
|
+
|
|
126
|
+
await generate(rootPath);
|
|
127
|
+
|
|
128
|
+
await assert.rejects(readFile(join(rootPath, 'app/src/generatedCode/SystemFlowSchemas/WebSocketMain/source/WebSocketComplete_HdrSqs.js')));
|
|
129
|
+
await assert.rejects(readFile(join(rootPath, 'app/src/generatedCode/FlowSchemas/Track/source/Track_HdrWbs.js')));
|
|
130
|
+
await assert.rejects(readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/flow-schema.yml')));
|
|
131
|
+
assert.doesNotMatch(
|
|
132
|
+
await readFile(join(rootPath, 'resource/sls_yaml/generatedCode/source/generated-sns-in-sqs.yml'), 'utf8'),
|
|
133
|
+
/WebSocketCompleteHdrSqs/
|
|
134
|
+
);
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
test('generate rolls back every slice when one output target conflicts', async () => {
|
|
138
|
+
const rootPath = await createCrudProject();
|
|
139
|
+
await mkdir(join(rootPath, 'app/sls_yaml/generatedCode/source/flow-objects.yml'), { recursive: true });
|
|
140
|
+
|
|
141
|
+
await assert.rejects(
|
|
142
|
+
generate(rootPath),
|
|
143
|
+
/not a file/
|
|
144
|
+
);
|
|
145
|
+
await assert.rejects(readFile(join(rootPath, 'app/src/schemas/FlowSchemas/generateCode/Create.js')));
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
test('generate removes stale CRUD schemas and application artifacts', async () => {
|
|
149
|
+
const rootPath = await createCrudProject();
|
|
150
|
+
await generate(rootPath);
|
|
151
|
+
await writeFile(
|
|
152
|
+
join(rootPath, 'app/src/schemas/ObjectSchemas/Order.js'),
|
|
153
|
+
"export default { objectType: 'order', generatedBy: 'external' };\n"
|
|
154
|
+
);
|
|
155
|
+
|
|
156
|
+
const result = await generate(rootPath);
|
|
157
|
+
|
|
158
|
+
assert.equal(result.files.length, 10);
|
|
159
|
+
await assert.rejects(readFile(join(rootPath, 'app/src/schemas/FlowSchemas/generateCode/Create.js')));
|
|
160
|
+
await assert.rejects(readFile(join(rootPath, 'app/src/generatedCode/FlowObjects/Create/source/Create_Main.js')));
|
|
161
|
+
assert.match(
|
|
162
|
+
await readFile(join(rootPath, 'resource/sls_yaml/generatedCode/source/generated-dynamoDB-table.yml'), 'utf8'),
|
|
163
|
+
/WebSocketTask/
|
|
164
|
+
);
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
async function createCrudProject() {
|
|
168
|
+
const rootPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-public-'));
|
|
169
|
+
const objectDirectory = join(rootPath, 'app/src/schemas/ObjectSchemas');
|
|
170
|
+
await mkdir(objectDirectory, { recursive: true });
|
|
171
|
+
await writeFile(
|
|
172
|
+
join(objectDirectory, 'Order.js'),
|
|
173
|
+
"export default { objectType: 'order', generatedBy: 'userGenerated' };\n"
|
|
174
|
+
);
|
|
175
|
+
return rootPath;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
async function createRbacProject() {
|
|
179
|
+
const rootPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-public-rbac-'));
|
|
180
|
+
const objectDirectory = join(rootPath, 'app/src/schemas/ObjectSchemas');
|
|
181
|
+
await mkdir(objectDirectory, { recursive: true });
|
|
182
|
+
await writeFile(
|
|
183
|
+
join(objectDirectory, 'User.js'),
|
|
184
|
+
"export default { objectType: 'user', addOnDataStructure: [{ type: 'rbac' }] };\n"
|
|
185
|
+
);
|
|
186
|
+
return rootPath;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
async function createOwnTopicProject() {
|
|
190
|
+
const rootPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-public-websocket-'));
|
|
191
|
+
const flowDirectory = join(rootPath, 'app/src/schemas/FlowSchemas');
|
|
192
|
+
await mkdir(flowDirectory, { recursive: true });
|
|
193
|
+
await writeFile(
|
|
194
|
+
join(flowDirectory, 'Track.js'),
|
|
195
|
+
"export default { flowTag: 'track', event: ['ownTopic'], outputTopic: true, statusType: 'none', generatedCodeConfig: { generatedCodeTag: 'create', codeHookTag: 'beforeLogical', invocationType: 'ownTopic' } };\n"
|
|
196
|
+
);
|
|
197
|
+
return rootPath;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
async function createTriggerCacheProject() {
|
|
201
|
+
const rootPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-public-trigger-cache-'));
|
|
202
|
+
const flowDirectory = join(rootPath, 'app/src/schemas/FlowSchemas');
|
|
203
|
+
await mkdir(flowDirectory, { recursive: true });
|
|
204
|
+
await writeFile(
|
|
205
|
+
join(flowDirectory, 'Cart.js'),
|
|
206
|
+
"export default { flowTag: 'cart', event: ['ownTopic'], statusType: 'triggerCache', objType: { serviceTag: 'Order' } };\n"
|
|
207
|
+
);
|
|
208
|
+
return rootPath;
|
|
209
|
+
}
|