@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.
Files changed (256) hide show
  1. package/README.md +73 -11
  2. package/index.js +0 -5
  3. package/package.json +7 -6
  4. package/src/compile/compileProject.js +26 -0
  5. package/src/compile/loadSchemas.js +28 -0
  6. package/src/emit/crud/dynamicCrudFlowSchemaTemplate.js +11 -0
  7. package/src/emit/crud/emitCrudApplicationArtifacts.js +157 -0
  8. package/src/emit/crud/emitDynamicCrudFlowSchemas.js +84 -0
  9. package/src/emit/crud/generateCrudApplicationArtifacts.js +16 -0
  10. package/src/emit/crud/generateDynamicCrudFlowSchemas.js +21 -0
  11. package/src/emit/crud/loadLocalSchemaArrays.js +8 -0
  12. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowObjects/templates/crud → emit/crud/templates}/CreateEndpoint_Main.ejs +1 -1
  13. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowObjects/templates/crud → emit/crud/templates}/DeleteEndpoint_Main.ejs +1 -1
  14. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowObjects/templates/step → emit/crud/templates}/FlowEndpointBeforeLogical_Main.ejs +2 -2
  15. package/src/emit/crud/templates/FlowEndpointComplete_Main.ejs +75 -0
  16. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/endpoint → emit/crud/templates}/FlowEndpoint_HdrWbs.ejs +1 -1
  17. package/src/{codeGenerators/app/src/generatedCode/ProcessLogical/templates/ProcessLogical_HdrSqs.ejs → emit/crud/templates/FlowHandler_HdrSqs.ejs} +52 -56
  18. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/endpoint → emit/crud/templates}/FlowMain_Wbs.ejs +1 -3
  19. package/src/emit/crud/templates/GetRangeEndpoint_Main.ejs +127 -0
  20. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowObjects/templates/crud → emit/crud/templates}/UpdateEndpoint_Main.ejs +1 -1
  21. package/src/emit/custom/customFlows.js +70 -0
  22. package/src/emit/custom/emitCustomFlowApplicationArtifacts.js +308 -0
  23. package/src/emit/custom/generateCustomFlowApplicationArtifacts.js +22 -0
  24. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/endpoint → emit/custom/templates}/FlowEndpoint_Main.ejs +1 -1
  25. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step → emit/custom/templates}/FlowStep_Main.ejs +1 -1
  26. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/ConfirmReserved_Main.ejs +5 -5
  27. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/CreateObject_HdrWbs.ejs +1 -1
  28. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/CreateObject_Main.ejs +3 -3
  29. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/CreatePreSignUrl_Main.ejs +4 -5
  30. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/FlowHandler_HdrS3.ejs +2 -8
  31. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/ProcessS3File_Main.ejs +1 -1
  32. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/ReservedLimit_Main.ejs +5 -6
  33. package/src/emit/custom/templates/triggerCache/CheckTriggerCache_HdrSqs.ejs +32 -0
  34. package/src/emit/custom/templates/triggerCache/CheckTriggerCache_Main.ejs +63 -0
  35. package/src/emit/custom/templates/triggerCache/TriggerCacheComplete_Main.ejs +35 -0
  36. package/src/emit/custom/templates/triggerCache/TriggerCache_Main.ejs +16 -0
  37. package/src/emit/function/functionYamlArtifact.js +111 -0
  38. package/src/emit/rbac/emitDynamicRbacFlowSchemas.js +117 -0
  39. package/src/emit/rbac/emitRbacApplicationArtifacts.js +256 -0
  40. package/src/emit/rbac/generateCreateTargetRoleHandler.js +19 -0
  41. package/src/emit/rbac/generateDynamicRbacFlowSchemas.js +21 -0
  42. package/src/emit/rbac/rbacFlowTag.js +7 -0
  43. package/src/emit/rbac/templates/CreateTargetRole_HdrSqs.ejs +24 -0
  44. package/src/emit/rbac/templates/CreateTargetRole_Main.ejs +25 -0
  45. package/src/emit/rbac/templates/DynamicRbacFlowSchema.ejs +5 -0
  46. package/src/emit/rbac/templates/ListRbac_HdrApi.ejs +17 -0
  47. package/src/emit/rbac/templates/ListRbac_HdrSqs.ejs +13 -0
  48. package/src/emit/rbac/templates/ListRbac_Main.ejs +29 -0
  49. package/src/emit/rbac/templates/RbacMutation_Main.ejs +22 -0
  50. package/src/emit/rbac/templates/UserRbacFlow_HdrInv.ejs +10 -0
  51. package/src/emit/rbac/templates/UserRbacFlow_Main.ejs +44 -0
  52. package/src/emit/rbac/templates/UserRoleMutation_Main.ejs +33 -0
  53. package/src/emit/relationship/dynamicRelationshipFlowSchemaTemplate.js +11 -0
  54. package/src/emit/relationship/emitDynamicRelationshipFlowSchemas.js +66 -0
  55. package/src/emit/relationship/emitRelationshipApplicationArtifacts.js +147 -0
  56. package/src/emit/relationship/generateDynamicRelationshipFlowSchemas.js +23 -0
  57. package/src/emit/relationship/generateRelationshipApplicationArtifacts.js +22 -0
  58. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessChangeRelationshipComplete_Main.ejs → emit/relationship/templates/ChangeRelationshipComplete_Main.ejs} +1 -1
  59. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessChangeRelationship_Main.ejs → emit/relationship/templates/ChangeRelationship_Main.ejs} +10 -2
  60. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessCreateRelationshipComplete_Main.ejs → emit/relationship/templates/CreateRelationshipComplete_Main.ejs} +1 -1
  61. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessCreateRelationship_Main.ejs → emit/relationship/templates/CreateRelationship_Main.ejs} +1 -1
  62. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessDeleteRelationshipComplete_Main.ejs → emit/relationship/templates/DeleteRelationshipComplete_Main.ejs} +1 -1
  63. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessDeleteRelationship_Main.ejs → emit/relationship/templates/DeleteRelationship_Main.ejs} +1 -1
  64. package/src/emit/relationship/templates/FlowHandler_HdrApi.ejs +51 -0
  65. package/src/{codeGenerators/app/src/generatedCode/Flow/_shared/handlers → emit/relationship/templates}/FlowHandler_HdrDsq.ejs +1 -1
  66. package/src/emit/relationship/templates/FlowHandler_HdrInv.ejs +45 -0
  67. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessGetRelationshipComplete_Main.ejs → emit/relationship/templates/GetRelationshipComplete_Main.ejs} +1 -1
  68. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessGetRelationship_Main.ejs → emit/relationship/templates/GetRelationship_Main.ejs} +1 -1
  69. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessMoveRelationship_Main.ejs → emit/relationship/templates/MoveRelationship_Main.ejs} +9 -1
  70. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessUpdateRelationshipComplete_Main.ejs → emit/relationship/templates/UpdateRelationshipComplete_Main.ejs} +1 -1
  71. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessUpdateRelationship_Main.ejs → emit/relationship/templates/UpdateRelationship_Main.ejs} +1 -1
  72. package/src/emit/resource/emitResourceArtifacts.js +300 -0
  73. package/src/emit/resource/generateResourceArtifacts.js +20 -0
  74. package/src/{codeGenerators/resource/sls_yaml/templates/crud → emit/resource/templates}/ResourceBeforeLogicalYaml.ejs +1 -1
  75. package/src/{codeGenerators/resource/sls_yaml/templates/crud → emit/resource/templates}/ResourceSqsYaml.ejs +6 -6
  76. package/src/{codeGenerators/app/sls_yaml → emit/resource}/templates/SharedResource_Yaml.ejs +8 -8
  77. package/src/emit/system/emitSystemWebSocketArtifacts.js +182 -0
  78. package/src/generate.js +60 -126
  79. package/src/output/commitArtifacts.js +213 -0
  80. package/src/output/mergeHooks.js +55 -0
  81. package/src/output/validateArtifacts.js +62 -0
  82. package/src/plan/buildGenerationPlan.js +50 -0
  83. package/test/core.test.js +159 -0
  84. package/test/createTargetRoleHandler.test.js +68 -0
  85. package/test/crudApplicationArtifacts.test.js +107 -0
  86. package/test/customFlowApplicationArtifacts.test.js +294 -0
  87. package/test/dynamicCrudFlowSchemas.test.js +136 -0
  88. package/test/dynamicRbacFlowSchemas.test.js +101 -0
  89. package/test/dynamicRelationshipFlowSchemas.test.js +99 -0
  90. package/test/functionYamlArtifact.test.js +34 -0
  91. package/test/intTestApi.test.js +29 -0
  92. package/test/publicApi.test.js +209 -0
  93. package/test/relationshipApplicationArtifacts.test.js +68 -0
  94. package/test/resourceArtifacts.test.js +121 -0
  95. package/jsconfig.json +0 -9
  96. package/src/__tests__/getIntTestConfig.test.js +0 -51
  97. package/src/__tests__/intTestGeneratorShared.test.cjs +0 -169
  98. package/src/__tests__/pathIntTest.test.js +0 -103
  99. package/src/codeGenerators/app/initial_setup/InitialSetupGenerator.js +0 -199
  100. package/src/codeGenerators/app/initial_setup/templates/InitialSetup_LambdaRole.ejs +0 -50
  101. package/src/codeGenerators/app/initial_setup/templates/InitialSetup_SnsService.ejs +0 -15
  102. package/src/codeGenerators/app/initial_setup/templates/InitialSetup_TableName.ejs +0 -9
  103. package/src/codeGenerators/app/sls_yaml/FindDataYamlGenerator.js +0 -23
  104. package/src/codeGenerators/app/sls_yaml/FunctionYamlGenerator.js +0 -322
  105. package/src/codeGenerators/app/sls_yaml/ProcessLogicalYamlGenerator.js +0 -21
  106. package/src/codeGenerators/app/sls_yaml/RoleNameConfigGenerator.js +0 -48
  107. package/src/codeGenerators/app/sls_yaml/SharedResourceYamlGenerator.js +0 -504
  108. package/src/codeGenerators/app/sls_yaml/__tests__/SharedResourceYamlGenerator.test.js +0 -235
  109. package/src/codeGenerators/app/sls_yaml/_policy/PolicyEmitter.js +0 -46
  110. package/src/codeGenerators/app/sls_yaml/_policy/PolicyRegistry.js +0 -94
  111. package/src/codeGenerators/app/sls_yaml/_policy/__tests__/PolicyEmitter.test.js +0 -55
  112. package/src/codeGenerators/app/sls_yaml/_policy/__tests__/PolicyRegistry.test.js +0 -48
  113. package/src/codeGenerators/app/sls_yaml/_policy/templates/ManagedPolicy_Yaml.ejs +0 -22
  114. package/src/codeGenerators/app/sls_yaml/renderYamlTemplate.js +0 -13
  115. package/src/codeGenerators/app/sls_yaml/templates/FindData_Yaml.ejs +0 -10
  116. package/src/codeGenerators/app/sls_yaml/templates/FunctionYaml_Api.ejs +0 -21
  117. package/src/codeGenerators/app/sls_yaml/templates/FunctionYaml_EventBridge.ejs +0 -14
  118. package/src/codeGenerators/app/sls_yaml/templates/FunctionYaml_Inv.ejs +0 -6
  119. package/src/codeGenerators/app/sls_yaml/templates/FunctionYaml_Sqs.ejs +0 -11
  120. package/src/codeGenerators/app/sls_yaml/templates/FunctionYaml_Wbs.ejs +0 -11
  121. package/src/codeGenerators/app/sls_yaml/templates/ProcessLogical_Yaml.ejs +0 -32
  122. package/src/codeGenerators/app/sls_yaml/templates/RoleNameConfig_Yaml.ejs +0 -5
  123. package/src/codeGenerators/app/src/generatedCode/FindData/FindDataGenerator.js +0 -238
  124. package/src/codeGenerators/app/src/generatedCode/FindData/templates/FindData_HdrSqs.ejs +0 -87
  125. package/src/codeGenerators/app/src/generatedCode/FindData/templates/FindData_Main.ejs +0 -108
  126. package/src/codeGenerators/app/src/generatedCode/FindData/templates/GetByStorage/getByDynamo.ejs +0 -32
  127. package/src/codeGenerators/app/src/generatedCode/FindData/templates/GetByStorage/getByGraph.ejs +0 -87
  128. package/src/codeGenerators/app/src/generatedCode/Flow/FlowObjects/.gitkeep +0 -0
  129. package/src/codeGenerators/app/src/generatedCode/Flow/FlowObjects/EndpointsGenerator.js +0 -120
  130. package/src/codeGenerators/app/src/generatedCode/Flow/FlowObjects/templates/step/FlowEndpointComplete_Main.ejs +0 -313
  131. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/RbacFlowGenerator.js +0 -116
  132. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/CreateRolePermissions.ejs +0 -135
  133. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/CreateTargetRole.ejs +0 -131
  134. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/CreateUserRole.ejs +0 -150
  135. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/DeleteRolePermissions.ejs +0 -132
  136. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/DeleteTargetRole.ejs +0 -132
  137. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/DeleteUserFromRole.ejs +0 -150
  138. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/FlowRbac_Main.ejs +0 -252
  139. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/ListRolePermissions.ejs +0 -120
  140. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/ListTargetRole.ejs +0 -122
  141. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/ListUserInRoles.ejs +0 -117
  142. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRelationships/RelationshipFlowGenerator.js +0 -148
  143. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/.gitkeep +0 -0
  144. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/StatusFieldGenerator.js +0 -109
  145. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/WebSocketGenerator.js +0 -122
  146. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/endpoint/FlowEntryPoint_Main.ejs +0 -38
  147. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/statusField/CompleteStatusFieldSns_Yaml.ejs +0 -52
  148. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/statusField/CompleteStatusField_HdrSqs.ejs +0 -84
  149. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/statusField/CompleteStatusField_Main.ejs +0 -78
  150. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/FlowStep_ByConfig_Awaiting_Main.ejs +0 -123
  151. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/FlowStep_ByConfig_Paginated_Main.ejs +0 -59
  152. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/FlowStep_PlugIn_Main.ejs +0 -72
  153. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/FlowStep_RecievePlugIn_Main.ejs +0 -76
  154. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/templateAwaitingStep.ejs +0 -41
  155. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/templateSendPlugin.ejs +0 -18
  156. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/ProcessWebSocketFlow_Yaml.ejs +0 -26
  157. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/ProcessWebSocketSub_Yaml.ejs +0 -7
  158. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/ProcessWebSocket_HdrSqs.ejs +0 -66
  159. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/ProcessWebSocket_Main.ejs +0 -115
  160. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/ProcessWebSocket_Yaml.ejs +0 -36
  161. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/WebSocketConnect_Main.ejs +0 -52
  162. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/WebSocketConnect_Yaml.ejs +0 -13
  163. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/WebSocketDynamoDb_Yaml.ejs +0 -28
  164. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/BaseDsqHandler.js +0 -55
  165. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/BaseSqsHandler.js +0 -66
  166. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/__tests__/BaseDsqHandler.test.js +0 -93
  167. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/dsq.js +0 -5
  168. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/eventBridge.js +0 -25
  169. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/extTopic.js +0 -6
  170. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/lambdaSyncApi.js +0 -43
  171. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/lambdaSyncInv.js +0 -43
  172. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/ownTopic.js +0 -54
  173. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/registry.js +0 -17
  174. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3.js +0 -56
  175. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3Components/ConfirmAfterUploadS3Generator.js +0 -46
  176. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3Components/CreateObjectGenerator.js +0 -50
  177. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3Components/CreatePreSignUrlGenerator.js +0 -48
  178. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3Components/ProcessAfterUploadS3Generator.js +0 -49
  179. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3Components/ReservedLimitGenerator.js +0 -47
  180. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/eventTypes.js +0 -23
  181. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowClassifier.js +0 -50
  182. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowEntryPointBase.js +0 -106
  183. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowMainFunctionBase.js +0 -172
  184. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowNaming.js +0 -37
  185. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowSelection.js +0 -19
  186. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowStepBase.js +0 -235
  187. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowStepNormalizer.js +0 -75
  188. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowValidator.js +0 -236
  189. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/propertyNormalizer.js +0 -15
  190. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/registry.js +0 -7
  191. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/roleNameDetection.js +0 -49
  192. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/triggerCacheBase.js +0 -177
  193. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/CheckTriggerCache_HdrSqs.ejs +0 -89
  194. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/CheckTriggerCache_Main.ejs +0 -83
  195. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/ProcessTriggerCache_HdrSqs.ejs +0 -103
  196. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/ProcessTriggerCache_Main.ejs +0 -58
  197. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/TriggerCacheComplete_HdrDsq.ejs +0 -104
  198. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/TriggerCacheComplete_HdrSqs.ejs +0 -88
  199. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/TriggerCacheComplete_Main.ejs +0 -80
  200. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/TriggerCacheQueue_Yaml.ejs +0 -36
  201. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/yaml/SharedFunctionSqs_Yaml.ejs +0 -13
  202. package/src/codeGenerators/app/src/generatedCode/ProcessLogical/ProcessLogicalGenerator.js +0 -29
  203. package/src/codeGenerators/app/src/generatedCode/ProcessLogical/templates/PaginateProcessLogical_HdrDsq.ejs +0 -177
  204. package/src/codeGenerators/app/src/generatedCode/ProcessLogical/templates/PaginateProcessLogical_HdrSqs.ejs +0 -155
  205. package/src/codeGenerators/app/src/generatedCode/ProcessLogical/templates/PaginateProcessLogical_Main.ejs +0 -268
  206. package/src/codeGenerators/app/src/generatedCode/ProcessLogical/templates/ProcessLogical_Main.ejs +0 -450
  207. package/src/codeGenerators/app/src/generatedCode/SystemFlowSchemas/RegisterGenerator.js +0 -149
  208. package/src/codeGenerators/app/src/generatedCode/SystemFlowSchemas/templates/register/RegisterComplete_HdrSqs.ejs +0 -85
  209. package/src/codeGenerators/app/src/generatedCode/SystemFlowSchemas/templates/register/RegisterComplete_Main.ejs +0 -176
  210. package/src/codeGenerators/app/src/generatedCode/SystemFlowSchemas/templates/register/Register_HdrWbs.ejs +0 -80
  211. package/src/codeGenerators/app/src/generatedCode/SystemFlowSchemas/templates/register/Register_Main.ejs +0 -164
  212. package/src/codeGenerators/app/src/generatedCode/libs/ConstsGenerator.js +0 -28
  213. package/src/codeGenerators/app/src/generatedCode/libs/GenerateCodeLibsGenerator.js +0 -28
  214. package/src/codeGenerators/app/src/generatedCode/libs/templates/Consts.ejs +0 -448
  215. package/src/codeGenerators/app/src/generatedCode/libs/templates/GenerateCodeLibs.ejs +0 -124
  216. package/src/codeGenerators/resource/sls_yaml/DynamoDBGenerator.js +0 -87
  217. package/src/codeGenerators/resource/sls_yaml/FlowOutGenerator.js +0 -70
  218. package/src/codeGenerators/resource/sls_yaml/FlowResourceYamlGenerator.js +0 -182
  219. package/src/core/renderTemplateFile.js +0 -22
  220. package/src/core/validate.js +0 -165
  221. package/src/generateCode.js +0 -358
  222. package/src/generateSchema.js +0 -123
  223. package/src/parsers/flowSchemaParser.js +0 -112
  224. package/src/parsers/objectSchemaParser.js +0 -39
  225. package/src/parsers/relationshipSchemaParser.js +0 -51
  226. package/src/schemaGenerators/app/src/schemas/FlowSchemas/FlowSchemaGenerator.js +0 -107
  227. package/src/schemaGenerators/app/src/schemas/FlowSchemas/RbacFlowSchemaGenerator.js +0 -98
  228. package/src/schemaGenerators/app/src/schemas/FlowSchemas/RelationshipFlowSchemaGenerator.js +0 -89
  229. package/src/schemaGenerators/app/src/schemas/FlowSchemas/templates/DynamicFlowSchemaTemplate.ejs +0 -41
  230. package/src/schemaGenerators/app/src/schemas/FlowSchemas/templates/DynamicRbacFlowSchemaTemplate.ejs +0 -20
  231. package/src/schemaGenerators/app/src/schemas/FlowSchemas/templates/RelationshipFlowSchemaTemplate.ejs +0 -33
  232. package/src/schemaGenerators/app/src/schemas/FlowSchemas/templates/UserRbacFlowSchemaTemplate.ejs +0 -22
  233. package/src/schemaGenerators/app/src/schemas/ObjectSchemas/AttributeTreeSchemaGenerator.js +0 -124
  234. package/src/schemaGenerators/app/src/schemas/ObjectSchemas/PropertyValueSchemaGenerator.js +0 -119
  235. package/src/schemaGenerators/app/src/schemas/ObjectSchemas/templates/DynamicAttributeTreeManagerSchemaTemplate.ejs +0 -14
  236. package/src/schemaGenerators/app/src/schemas/ObjectSchemas/templates/DynamicAttributeTreeStandardSchemaTemplate.ejs +0 -13
  237. package/src/schemaGenerators/app/src/schemas/ObjectSchemas/templates/DynamicPropertyValueSchemaTemplate.ejs +0 -15
  238. package/src/schemaGenerators/app/src/schemas/RelationshipSchemas/AttributeTreeRelationshipSchemaGenerator.js +0 -149
  239. package/src/schemaGenerators/app/src/schemas/RelationshipSchemas/PropertyValueRelationshipSchemaGenerator.js +0 -143
  240. package/src/schemaGenerators/app/src/schemas/RelationshipSchemas/templates/DynamicAttributeTreeRelationshipSchemaTemplate.ejs +0 -7
  241. package/src/schemaGenerators/app/src/schemas/RelationshipSchemas/templates/DynamicPropertyValueRelationshipSchemaTemplate.ejs +0 -7
  242. package/src/schemaGenerators/app/src/schemas/SystemTextSchemas/SystemTextGenerator.js +0 -102
  243. package/src/schemaGenerators/app/src/schemas/SystemTextSchemas/templates/SystemText_Template.ejs +0 -10
  244. package/test_schema.js +0 -2
  245. /package/src/{codeGenerators/app/src/generatedCode/Flow/_shared/handlers → emit/crud/templates}/FlowHandler_HdrApi.ejs +0 -0
  246. /package/src/{codeGenerators/app/src/generatedCode/Flow/_shared/handlers → emit/crud/templates}/FlowHandler_HdrInv.ejs +0 -0
  247. /package/src/{codeGenerators/app/src/generatedCode/Flow/FlowObjects/templates/crud → emit/crud/templates}/GetEndpoint_Main.ejs +0 -0
  248. /package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/ConfirmReserved_HdrSqs.ejs +0 -0
  249. /package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/CreatePreSignUrl_HdrSqs.ejs +0 -0
  250. /package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/ReservedLimit_HdrSqs.ejs +0 -0
  251. /package/src/{codeGenerators/app/src/generatedCode/Flow/_shared/handlers → emit/relationship/templates}/FlowHandler_HdrSqs.ejs +0 -0
  252. /package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessMoveRelationshipComplete_Main.ejs → emit/relationship/templates/MoveRelationshipComplete_Main.ejs} +0 -0
  253. /package/src/{codeGenerators/resource/sls_yaml → emit/resource}/templates/DynamoDBTable_Yaml.ejs +0 -0
  254. /package/src/{codeGenerators/resource/sls_yaml → emit/resource}/templates/FlowOut_Yaml.ejs +0 -0
  255. /package/src/{codeGenerators/resource/sls_yaml/templates/crud → emit/resource/templates}/ResourceYaml.ejs +0 -0
  256. /package/src/{codeGenerators/resource/sls_yaml → emit/resource}/templates/SystemDynamoDB_Yaml.ejs +0 -0
@@ -0,0 +1,300 @@
1
+ import ejs from 'ejs';
2
+ import { readFile } from 'node:fs/promises';
3
+
4
+ import { customFlowRoleName, flowExtTopicSteps, generatedOwnTopicFlows, supportedCustomFlows, triggerCacheFlows, triggerCacheQueueNames } from '../custom/customFlows.js';
5
+ import { hasSystemWebSocket } from '../system/emitSystemWebSocketArtifacts.js';
6
+
7
+ const TEMPLATE_URL = new URL('./templates/', import.meta.url);
8
+ const RESOURCE_ROOT = 'resource/sls_yaml/generatedCode/source';
9
+ const APP_ROOT = 'app/sls_yaml/generatedCode/source';
10
+ const CRUD_ACTIONS = ['Create', 'Update', 'Delete', 'Get'];
11
+ const RELATIONSHIP_ACTIONS = ['CreateRelationship', 'UpdateRelationship', 'DeleteRelationship', 'GetRelationship', 'ChangeRelationship', 'MoveRelationship'];
12
+ const RBAC_ACTIONS = ['CreateTargetRole', 'ListTargetRole', 'DeleteTargetRole', 'CreateRolePermissions', 'ListRolePermissions', 'DeleteRolePermissions', 'CreateUserRole', 'ListUserInRoles', 'DeleteUserFromRole'];
13
+ const SYSTEM_TABLES = ['WebSocketTask', 'UserUploadRecords', 'RegisterRecords', 'AwaitingMultipleSteps', 'AwaitingMultipleStepByPending', 'FindDataMain', 'LogicalResultsMain', 'LogicalResultsData', 'AwaitingStep', 'TargetRoles', 'RolePermissions', 'RoleUsers', 'UserRoles'];
14
+ const RBAC_TABLES = ['TargetRoles', 'RolePermissions', 'RoleUsers', 'UserRoles', 'WebSocketTask'];
15
+ const LEGACY_PROCESS_QUEUES = ['FindDataHdrSqs', 'ProcessLogicalHdrSqs', 'PaginateProcessLogicalHdrDsq', 'PaginateProcessLogicalHdrSqs'];
16
+ const DYNAMO_ACTIONS = ['dynamodb:DeleteItem', 'dynamodb:GetItem', 'dynamodb:PutItem', 'dynamodb:Query', 'dynamodb:UpdateItem'];
17
+ const SQS_CONSUMER_ACTIONS = ['sqs:DeleteMessage', 'sqs:GetQueueAttributes', 'sqs:ReceiveMessage'];
18
+
19
+ export async function emitResourceArtifacts({ objects, relationships, flows = [] }) {
20
+ if (![objects, relationships, flows].every(Array.isArray)) {
21
+ throw new TypeError('objects, relationships, and flows must be arrays');
22
+ }
23
+ const state = createResourceState({ objects, relationships, flows });
24
+ const [inSqs, out, dynamo, iam] = await Promise.all([
25
+ renderInSqs(state),
26
+ renderOut(state),
27
+ renderDynamo(state),
28
+ renderIam(state)
29
+ ]);
30
+ return [
31
+ { path: `${RESOURCE_ROOT}/generated-sns-in-sqs.yml`, content: normalizeYaml(inSqs) },
32
+ { path: `${RESOURCE_ROOT}/generated-sns-out.yml`, content: normalizeYaml(out) },
33
+ { path: `${RESOURCE_ROOT}/generated-dynamoDB-table.yml`, content: normalizeYaml(dynamo) },
34
+ { path: `${APP_ROOT}/generate-shared-resource.yml`, content: normalizeYaml(iam) }
35
+ ];
36
+ }
37
+
38
+ export const resourceArtifactPaths = [
39
+ `${RESOURCE_ROOT}/generated-sns-in-sqs.yml`,
40
+ `${RESOURCE_ROOT}/generated-sns-out.yml`,
41
+ `${RESOURCE_ROOT}/generated-dynamoDB-table.yml`,
42
+ `${APP_ROOT}/generate-shared-resource.yml`
43
+ ];
44
+
45
+ function createResourceState({ objects, relationships, flows }) {
46
+ const crud = objects.some(isCrudObject);
47
+ const rbac = objects.some(hasRbacAddOn);
48
+ const ownTopics = new Set(flows.filter(flow => includesEvent(flow, 'ownTopic')).map(flow => upperFirst(flow.flowTag)));
49
+ const sqsQueues = new Set([
50
+ ...LEGACY_PROCESS_QUEUES,
51
+ ...flows.filter(flow => includesEvent(flow, 'extTopic')).map(flow => `Process${upperFirst(flow.flowTag)}HdrSqs`)
52
+ ]);
53
+ const triggerCache = triggerCacheFlows(flows);
54
+ const triggerCacheQueues = [...new Set(triggerCache.flatMap(triggerCacheQueueNames))].map(queueName => ({
55
+ queueName,
56
+ resourceQueueName: queueName.replaceAll('_', '')
57
+ }));
58
+ flowExtTopicSteps(flows).forEach(({ flowTag, stepName }) => sqsQueues.add(`${flowTag}${stepName}HdrSqs`));
59
+ flows.filter(flow => includesEvent(flow, 's3')).forEach(flow => {
60
+ const tag = upperFirst(flow.flowTag);
61
+ sqsQueues.add(`${tag}CreatePreSignUrlHdrSqs`);
62
+ sqsQueues.add(`${tag}ReservedLimitHdrSqs`);
63
+ sqsQueues.add(`${tag}ConfirmAfterUploadHdrSqs`);
64
+ });
65
+ const dsqQueues = new Set(flows.filter(flow => includesEvent(flow, 'dsq')).map(flow => `Process${upperFirst(flow.flowTag)}HdrDsq`));
66
+ if (crud) {
67
+ CRUD_ACTIONS.forEach(action => ownTopics.add(action));
68
+ ['Create', 'Update', 'Delete'].forEach(action => sqsQueues.add(`${action}CompleteHdrSqs`));
69
+ }
70
+ if (relationships.length > 0) {
71
+ RELATIONSHIP_ACTIONS.forEach(action => {
72
+ ownTopics.add(action);
73
+ sqsQueues.add(`${action}CompleteHdrSqs`);
74
+ });
75
+ dsqQueues.add('GetRelationshipHdrDsq');
76
+ }
77
+ if (rbac) {
78
+ RBAC_ACTIONS.forEach(action => {
79
+ ownTopics.add(action);
80
+ sqsQueues.add(`Process${action}HdrSqs`);
81
+ });
82
+ objects.filter(hasRbacAddOn).forEach(object => sqsQueues.add(`Process${upperFirst(object.objectType)}RbacFlowHdrInv`));
83
+ }
84
+ const beforeLogicalByAction = new Map();
85
+ for (const flow of flows.filter(flow => flow?.generatedCodeConfig?.codeHookTag === 'beforeLogical')) {
86
+ const action = upperFirst(flow.generatedCodeConfig.generatedCodeTag);
87
+ if (!action || !flow.flowTag) continue;
88
+ const flowTags = beforeLogicalByAction.get(action) ?? new Set();
89
+ flowTags.add(flow.flowTag);
90
+ beforeLogicalByAction.set(action, flowTags);
91
+ }
92
+ const beforeLogical = [...beforeLogicalByAction].map(([action, flowTags]) => ({ action, flowTags: [...flowTags].sort() }));
93
+ const customRoles = [...new Set([
94
+ ...supportedCustomFlows(flows).map(flow => customFlowRoleName(flow.flowTag)),
95
+ ...generatedOwnTopicFlows(flows).map(flow => customFlowRoleName(flow.flowTag)),
96
+ ...flowExtTopicSteps(flows).map(({ flow }) => customFlowRoleName(flow.flowTag)),
97
+ ...triggerCache.map(flow => customFlowRoleName(flow.flowTag))
98
+ ])];
99
+ const websocket = hasSystemWebSocket(flows, { includeRelationshipOwnTopic: relationships.length > 0 });
100
+ const webSocketRoles = new Set(websocket ? ['WebSocketMainRole'] : []);
101
+ if (crud) webSocketRoles.add('FlowObjectsRole');
102
+ if (relationships.length > 0) webSocketRoles.add('FlowRelationshipRole');
103
+ if (rbac) webSocketRoles.add('FlowRbacRole');
104
+ [...supportedCustomFlows(flows), ...generatedOwnTopicFlows(flows)]
105
+ .filter(flow => includesEvent(flow, 'ownTopic') || includesEvent(flow, 's3'))
106
+ .forEach(flow => webSocketRoles.add(customFlowRoleName(flow.flowTag)));
107
+ const outTopics = new Set([
108
+ ...ownTopics,
109
+ ...beforeLogical.map(({ action }) => action),
110
+ ...flows.filter(flow => flow?.outputTopic && upperFirst(flow.flowTag)).map(flow => upperFirst(flow.flowTag))
111
+ ]);
112
+ const objectTableNames = [...collectTables(objects).keys()];
113
+ const relationshipTableNames = [...collectTables(relationships).keys()];
114
+ const tableMap = new Map([...collectTables(objects), ...collectTables(relationships)]);
115
+ return {
116
+ crud,
117
+ rbac,
118
+ relationships: relationships.length > 0,
119
+ ownTopics: [...ownTopics].filter(Boolean).sort(),
120
+ sqsQueues: [...sqsQueues].filter(Boolean).sort(),
121
+ triggerCacheQueues,
122
+ dsqQueues: [...dsqQueues].filter(Boolean).sort(),
123
+ beforeLogical,
124
+ customRoles,
125
+ websocket,
126
+ webSocketRoles,
127
+ webSocketSubscriptions: websocket
128
+ ? [...outTopics].filter(topic => (
129
+ flows.some(flow => flow?.outputTopic && upperFirst(flow.flowTag) === topic) ||
130
+ (relationships.length > 0 && topic !== 'GetRelationship' && RELATIONSHIP_ACTIONS.includes(topic))
131
+ )).sort()
132
+ : [],
133
+ outTopics: [...outTopics].filter(Boolean).sort(),
134
+ tables: [...tableMap.entries()].map(([tableName, keys]) => ({ tableName, ...keys })),
135
+ allTableNames: [...new Set([...SYSTEM_TABLES, ...tableMap.keys()])].sort(),
136
+ objectTableNames,
137
+ relationshipTableNames,
138
+ objectTablesByType: new Map(objects.map(object => [object.objectType, Object.values(object.storageResources ?? {}).find(resource => resource?.storageType === 'dynamoDB')?.tableName]).filter(([, tableName]) => tableName)),
139
+ flows
140
+ };
141
+ }
142
+
143
+ async function renderInSqs(state) {
144
+ const chunks = await Promise.all([
145
+ ...state.ownTopics.map(queueName => render('ResourceYaml.ejs', { queueName })),
146
+ ...state.sqsQueues.map(queueName => render('ResourceSqsYaml.ejs', { queueName })),
147
+ ...state.triggerCacheQueues.map(queue => render('ResourceSqsYaml.ejs', queue)),
148
+ ...state.dsqQueues.map(queueName => render('ResourceSqsYaml.ejs', { queueName })),
149
+ ...state.beforeLogical.map(({ action, flowTags }) => render('ResourceBeforeLogicalYaml.ejs', { queueName: `${action}BeforeLogical`, flowTags })),
150
+ ...(state.websocket ? [render('ResourceSqsYaml.ejs', { queueName: 'WebSocketCompleteHdrSqs' })] : [])
151
+ ]);
152
+ return `Resources:\n${chunks.join('\n')}\n${state.webSocketSubscriptions.map(renderWebSocketSubscription).join('\n')}`;
153
+ }
154
+
155
+ async function renderOut(state) {
156
+ return `Resources:\n${(await Promise.all(state.outTopics.map(topicName => render('FlowOut_Yaml.ejs', { topicName })))).join('\n')}`;
157
+ }
158
+
159
+ async function renderDynamo(state) {
160
+ const [system, ...tables] = await Promise.all([
161
+ render('SystemDynamoDB_Yaml.ejs', {}),
162
+ ...state.tables.map(table => render('DynamoDBTable_Yaml.ejs', table))
163
+ ]);
164
+ return `${system}\n${tables.join('\n')}`;
165
+ }
166
+
167
+ async function renderIam(state) {
168
+ const roles = ['ProcFindDataRole', 'RegisterRole'];
169
+ if (state.crud) roles.push('FlowObjectsRole');
170
+ if (state.relationships) roles.push('FlowRelationshipRole');
171
+ if (state.rbac) roles.push('FlowRbacRole');
172
+ if (state.websocket) roles.push('WebSocketMainRole');
173
+ roles.push(...state.customRoles);
174
+ return render('SharedResource_Yaml.ejs', { roles: roles.sort().map(roleName => ({ roleName, statements: roleStatements(state, roleName) })) });
175
+ }
176
+
177
+ function roleStatements(state, roleName) {
178
+ const statements = [];
179
+ if (roleNeedsSchemaRead(state, roleName)) {
180
+ statements.push({ action: ['s3:GetObject'], resource: ['arn:aws:s3:::${self:custom.iz_serviceSchemaBucketName}/perServiceSchemas/*'] });
181
+ }
182
+ addStatement(statements, dynamoActionsForRole(roleName), dynamoArns(roleTableNames(state, roleName)));
183
+ addStatement(statements, SQS_CONSUMER_ACTIONS, queueArns(roleQueueNames(state, roleName)));
184
+ addStatement(statements, ['sns:Publish'], topicArns(roleTopicNames(state, roleName)));
185
+ if (state.webSocketRoles.has(roleName)) {
186
+ statements.push({ action: ['execute-api:ManageConnections'], resource: ['arn:aws:execute-api:${self:custom.iz_region}:${self:custom.iz_accountId}:${self:custom.iz_webSocketHostId}/*'] });
187
+ }
188
+ return statements;
189
+ }
190
+
191
+ function addStatement(statements, action, resource) {
192
+ if (resource.length > 0) statements.push({ action, resource });
193
+ }
194
+
195
+ function roleNeedsSchemaRead(state, roleName) {
196
+ if (!roleName.endsWith('Role') || !roleName) return false;
197
+ return roleName !== 'FlowRbacRole' || state.rbac;
198
+ }
199
+
200
+ function roleTableNames(state, roleName) {
201
+ if (roleName === 'RegisterRole') return [];
202
+ if (roleName === 'WebSocketMainRole') return ['UserUploadRecords', 'WebSocketTask'];
203
+ if (roleName === 'FlowObjectsRole') return [...state.objectTableNames, 'WebSocketTask'];
204
+ if (roleName === 'FlowRelationshipRole') return [...state.objectTableNames, ...state.relationshipTableNames, 'AwaitingMultipleSteps', 'WebSocketTask'];
205
+ if (roleName === 'FlowRbacRole') return RBAC_TABLES;
206
+ if (roleName === 'ProcFindDataRole') return [...state.objectTableNames, ...state.relationshipTableNames, 'FindDataMain', 'LogicalResultsMain', 'LogicalResultsData'];
207
+ const flow = state.flows.find(candidate => customFlowRoleName(candidate?.flowTag ?? '') === roleName);
208
+ if (!flow) return [];
209
+ const tables = [];
210
+ if (includesEvent(flow, 'ownTopic') || includesEvent(flow, 's3')) tables.push('WebSocketTask');
211
+ if (includesEvent(flow, 's3')) tables.push('UserUploadRecords');
212
+ if (flow.statusType === 'storedCache') {
213
+ const object = state.objectTablesByType.get(flow.objType?.objectType);
214
+ if (object) tables.push(object);
215
+ }
216
+ return [...new Set(tables)];
217
+ }
218
+
219
+ function dynamoActionsForRole(roleName) {
220
+ if (roleName === 'ProcFindDataRole') return ['dynamodb:GetItem', 'dynamodb:Query'];
221
+ if (roleName === 'WebSocketMainRole') return ['dynamodb:DeleteItem', 'dynamodb:PutItem', 'dynamodb:Query'];
222
+ if (roleName === 'FlowRbacRole') return [...DYNAMO_ACTIONS, 'dynamodb:TransactWriteItems'];
223
+ return DYNAMO_ACTIONS;
224
+ }
225
+
226
+ function roleQueueNames(state, roleName) {
227
+ if (roleName === 'ProcFindDataRole') return LEGACY_PROCESS_QUEUES;
228
+ if (roleName === 'WebSocketMainRole') return state.websocket ? ['WebSocketCompleteHdrSqs'] : [];
229
+ if (roleName === 'FlowObjectsRole') return [
230
+ ...CRUD_ACTIONS.map(action => `${action}HdrSqs`),
231
+ ...CRUD_ACTIONS.filter(action => action !== 'Get').map(action => `${action}CompleteHdrSqs`),
232
+ ...state.beforeLogical.filter(({ action }) => CRUD_ACTIONS.includes(action)).map(({ action }) => `${action}BeforeLogicalHdrSqs`)
233
+ ];
234
+ if (roleName === 'FlowRelationshipRole') return [
235
+ ...RELATIONSHIP_ACTIONS.flatMap(action => [`${action}HdrSqs`, `${action}CompleteHdrSqs`]),
236
+ 'GetRelationshipHdrDsq'
237
+ ];
238
+ if (roleName === 'FlowRbacRole') return RBAC_ACTIONS.flatMap(action => [`${action}HdrSqs`, `Process${action}HdrSqs`]);
239
+ const flow = state.flows.find(candidate => customFlowRoleName(candidate?.flowTag ?? '') === roleName);
240
+ if (!flow) return [];
241
+ const tag = upperFirst(flow.flowTag);
242
+ return [
243
+ ...(includesEvent(flow, 'extTopic') ? [`Process${tag}HdrSqs`] : []),
244
+ ...(includesEvent(flow, 'ownTopic') ? [`${tag}HdrSqs`] : []),
245
+ ...flowExtTopicSteps([flow]).map(({ flowTag, stepName }) => `${flowTag}${stepName}HdrSqs`),
246
+ ...state.sqsQueues.filter(queueName => includesEvent(flow, 's3') && queueName.startsWith(tag)),
247
+ ...(flow.statusType === 'triggerCache' ? triggerCacheQueueNames(flow) : [])
248
+ ];
249
+ }
250
+
251
+ function roleTopicNames(state, roleName) {
252
+ if (roleName === 'ProcFindDataRole') return [];
253
+ if (roleName === 'FlowObjectsRole') return state.outTopics.filter(topic => CRUD_ACTIONS.includes(topic));
254
+ if (roleName === 'FlowRelationshipRole') return state.outTopics.filter(topic => RELATIONSHIP_ACTIONS.includes(topic));
255
+ if (roleName === 'FlowRbacRole') return state.outTopics.filter(topic => RBAC_ACTIONS.includes(topic));
256
+ const flow = state.flows.find(candidate => customFlowRoleName(candidate?.flowTag ?? '') === roleName);
257
+ return flow ? state.outTopics.filter(topic => topic === upperFirst(flow.flowTag)) : [];
258
+ }
259
+
260
+ function dynamoArns(tableNames) {
261
+ return [...new Set(tableNames)].sort().map(tableName => `arn:aws:dynamodb:${'${self:custom.iz_region}'}:${'${self:custom.iz_accountId}'}:table/${'${self:custom.iz_resourcePrefix}'}${tableName}`);
262
+ }
263
+
264
+ function queueArns(queueNames) {
265
+ return [...new Set(queueNames)].sort().map(queueName => `arn:aws:sqs:${'${self:custom.iz_region}'}:${'${self:custom.iz_accountId}'}:${'${self:custom.iz_resourcePrefix}'}${queueName}`);
266
+ }
267
+
268
+ function topicArns(topicNames) {
269
+ return [...new Set(topicNames)].sort().map(topic => `arn:aws:sns:${'${self:custom.iz_region}'}:${'${self:custom.iz_accountId}'}:${'${self:custom.iz_serviceTag}'}_${'${self:custom.iz_stage}'}_${topic}_Out`);
270
+ }
271
+
272
+ function renderWebSocketSubscription(topicName) {
273
+ return `##===== WebSocket completion subscription\n SubscriptionToOut${topicName}WebSocketComplete:\n Type: AWS::SNS::Subscription\n Properties:\n TopicArn: !Ref Out${topicName}\n Endpoint: "arn:aws:sqs:${'${self:custom.iz_region}'}:${'${self:custom.iz_accountId}'}:${'${self:custom.iz_resourcePrefix}'}WebSocketCompleteHdrSqs"\n Protocol: "sqs"`;
274
+ }
275
+
276
+ function collectTables(schemas) {
277
+ const tables = new Map();
278
+ for (const schema of schemas) {
279
+ if (!schema?.storageResources) continue;
280
+ const identifiers = Array.isArray(schema.identifiers) ? schema.identifiers : [];
281
+ const pk = keyName(identifiers.find(identifier => identifier.type === 'partitionKey' || identifier.type === 'identifier')) ?? 'PK';
282
+ const sk = keyName(identifiers.find(identifier => identifier.type === 'sortKey'));
283
+ for (const resource of Object.values(schema.storageResources)) {
284
+ if (resource?.storageType === 'dynamoDB' && resource.tableName && !tables.has(resource.tableName)) tables.set(resource.tableName, { pk, sk });
285
+ }
286
+ }
287
+ return tables;
288
+ }
289
+
290
+ function keyName(identifier) {
291
+ if (!identifier) return undefined;
292
+ return identifier.name ?? identifier.fieldName ?? (Array.isArray(identifier.fieldNames) ? identifier.fieldNames.join(identifier.deliminator ?? '_') : undefined);
293
+ }
294
+
295
+ function isCrudObject(object) { return object?.generatedBy === 'userGenerated' || object?.generatedBy === 'systemGenerated'; }
296
+ function hasRbacAddOn(object) { return Array.isArray(object?.addOnDataStructure) && object.addOnDataStructure.some(addOn => addOn?.type === 'rbac'); }
297
+ function includesEvent(flow, event) { return Array.isArray(flow?.event) && flow.event.includes(event); }
298
+ function upperFirst(value) { return typeof value === 'string' && value ? value[0].toUpperCase() + value.slice(1) : ''; }
299
+ function normalizeYaml(content) { return `${content.trimEnd()}\n`; }
300
+ async function render(templateName, data) { return ejs.render(await readFile(new URL(templateName, TEMPLATE_URL), 'utf8'), { resourceQueueName: data.queueName, ...data }); }
@@ -0,0 +1,20 @@
1
+ import { buildGenerationPlan } from '../../plan/buildGenerationPlan.js';
2
+ import { commitArtifacts } from '../../output/commitArtifacts.js';
3
+ import { compileProject } from '../../compile/compileProject.js';
4
+ import { loadLocalSchemaDirectory } from '../../compile/loadSchemas.js';
5
+ import { emitResourceArtifacts, resourceArtifactPaths } from './emitResourceArtifacts.js';
6
+
7
+ export async function generateResourceArtifacts(rootPath, options = {}) {
8
+ const project = compileProject({ ...options, rootPath });
9
+ const [objects, relationships, flows] = await Promise.all([
10
+ loadLocalSchemaDirectory(project, 'ObjectSchemas'),
11
+ loadLocalSchemaDirectory(project, 'RelationshipSchemas'),
12
+ loadLocalSchemaDirectory(project, 'FlowSchemas')
13
+ ]);
14
+ const artifacts = await emitResourceArtifacts({ objects, relationships, flows });
15
+ const files = await commitArtifacts(buildGenerationPlan(project, artifacts, {
16
+ managedPaths: resourceArtifactPaths,
17
+ managedScope: 'shared-resources'
18
+ }));
19
+ return { project, files };
20
+ }
@@ -44,4 +44,4 @@
44
44
  - Ref: <%- queueName %>HdrSqs
45
45
 
46
46
  #<#<%- queueName %>QueueSetting#>
47
- #<#/<%- queueName %>QueueSetting#>
47
+ #<#/<%- queueName %>QueueSetting#>
@@ -1,24 +1,24 @@
1
1
  ##===== [Queue]
2
- <%- queueName %>:
2
+ <%- resourceQueueName || queueName %>:
3
3
  Type: "AWS::SQS::Queue"
4
4
  Properties:
5
5
  QueueName: ${self:custom.iz_resourcePrefix}<%- queueName %>
6
6
  RedrivePolicy:
7
7
  deadLetterTargetArn:
8
8
  Fn::GetAtt:
9
- - <%- queueName %>DLQ
9
+ - <%- resourceQueueName || queueName %>DLQ
10
10
  - Arn
11
11
  maxReceiveCount: 3
12
12
  VisibilityTimeout: 120
13
13
 
14
14
  ##===== [Queue DLQ]
15
- <%- queueName %>DLQ:
15
+ <%- resourceQueueName || queueName %>DLQ:
16
16
  Type: AWS::SQS::Queue
17
17
  Properties:
18
18
  QueueName: ${self:custom.iz_resourcePrefix}<%- queueName %>DLQ
19
19
 
20
20
  ##===== [Queue Policy]
21
- <%- queueName %>Policy:
21
+ <%- resourceQueueName || queueName %>Policy:
22
22
  Type: AWS::SQS::QueuePolicy
23
23
  Properties:
24
24
  PolicyDocument:
@@ -29,11 +29,11 @@
29
29
  Principal: "*"
30
30
  Resource:
31
31
  Fn::GetAtt:
32
- - <%- queueName %>
32
+ - <%- resourceQueueName || queueName %>
33
33
  - Arn
34
34
  Action: "SQS:SendMessage"
35
35
  Queues:
36
- - Ref: <%- queueName %>
36
+ - Ref: <%- resourceQueueName || queueName %>
37
37
 
38
38
  #<#<%- queueName %>QueueSetting#>
39
39
  #<#/<%- queueName %>QueueSetting#>
@@ -1,5 +1,5 @@
1
1
  Resources:
2
- <% roles.forEach(({ roleName, statements }) => { %>
2
+ <% roles.forEach(({ roleName, statements }) => { -%>
3
3
  <%- roleName %>:
4
4
  Type: AWS::IAM::Role
5
5
  Properties:
@@ -22,18 +22,18 @@ Resources:
22
22
  PolicyDocument:
23
23
  Version: "2012-10-17"
24
24
  Statement:
25
- <% statements.forEach((stmt) => { %>
25
+ <% statements.forEach((stmt) => { -%>
26
26
  - Effect: Allow
27
27
  Action:
28
- <% stmt.action.forEach((a) => { %>
28
+ <% stmt.action.forEach((a) => { -%>
29
29
  - <%- a %>
30
- <% }) %>
30
+ <% }) -%>
31
31
  Resource:
32
- <% stmt.resource.forEach((r) => { %>
32
+ <% stmt.resource.forEach((r) => { -%>
33
33
  - "<%- r %>"
34
- <% }) %>
35
- <% }) %>
34
+ <% }) -%>
35
+ <% }) -%>
36
36
  #<#<%- roleName %>StatementHookCode#>
37
37
  #<#/<%- roleName %>StatementHookCode#>
38
38
 
39
- <% }) %>
39
+ <% }) -%>
@@ -0,0 +1,182 @@
1
+ const SOURCE = 'app/src/generatedCode/SystemFlowSchemas/WebSocketMain/source';
2
+
3
+ export async function emitSystemWebSocketArtifacts(flows, { includeRelationshipOwnTopic = false } = {}) {
4
+ if (!hasSystemWebSocket(flows, { includeRelationshipOwnTopic })) return { artifacts: [], functions: [] };
5
+
6
+ return {
7
+ artifacts: [
8
+ { path: `${SOURCE}/WebSocketConnect.js`, content: webSocketConnect() },
9
+ { path: `${SOURCE}/WebSocketComplete_Main.js`, content: webSocketCompleteMain() },
10
+ { path: `${SOURCE}/WebSocketComplete_HdrSqs.js`, content: webSocketCompleteHandler() }
11
+ ],
12
+ functions: [
13
+ renderWebSocketConnectYaml(),
14
+ renderWebSocketCompleteYaml()
15
+ ]
16
+ };
17
+ }
18
+
19
+ export function systemWebSocketManagedPaths() {
20
+ return [
21
+ `${SOURCE}/WebSocketConnect.js`,
22
+ `${SOURCE}/WebSocketComplete_Main.js`,
23
+ `${SOURCE}/WebSocketComplete_HdrSqs.js`
24
+ ];
25
+ }
26
+
27
+ export function hasSystemWebSocket(flows, { includeRelationshipOwnTopic = false } = {}) {
28
+ return includeRelationshipOwnTopic || (Array.isArray(flows) && flows.some(flow => Array.isArray(flow?.event) && flow.event.includes('ownTopic')));
29
+ }
30
+
31
+ function renderWebSocketConnectYaml() {
32
+ return `WebSocketConnect:
33
+ handler: src/generatedCode/SystemFlowSchemas/WebSocketMain/source/WebSocketConnect.main
34
+ name: \${self:custom.iz_resourcePrefix}WebSocketConnect
35
+ role: WebSocketMainRole
36
+ events:
37
+ - websocket:
38
+ route: $connect
39
+ - websocket:
40
+ route: $disconnect
41
+ - websocket:
42
+ route: $default
43
+ `;
44
+ }
45
+
46
+ function renderWebSocketCompleteYaml() {
47
+ return `WebSocketCompleteHdrSqs:
48
+ handler: src/generatedCode/SystemFlowSchemas/WebSocketMain/source/WebSocketComplete_HdrSqs.main
49
+ name: \${self:custom.iz_resourcePrefix}WebSocketCompleteHdrSqs
50
+ role: WebSocketMainRole
51
+ events:
52
+ - sqs:
53
+ arn: arn:aws:sqs:\${self:custom.iz_region}:\${self:custom.iz_accountId}:\${self:custom.iz_resourcePrefix}WebSocketCompleteHdrSqs
54
+ batchSize: 10
55
+ filterPatterns:
56
+ - body:
57
+ MessageAttributes:
58
+ callingFlow:
59
+ Value:
60
+ - \${self:custom.iz_resourcePrefix}WebSocketCompleteHdrSqs
61
+ - body:
62
+ MessageAttributes:
63
+ callingFlow:
64
+ Value:
65
+ - exists: false
66
+ `;
67
+ }
68
+
69
+ function webSocketConnect() {
70
+ return `import dynamodbSharedLib from '@izara_project/izara-core-library-dynamodb';
71
+ import { middlewareHandler as middleware, response } from '@izara_project/izara-middleware';
72
+
73
+ export const main = middleware.wrap(async event => {
74
+ const { eventType, connectionId } = event.requestContext ?? {};
75
+ try {
76
+ event._izContext.logger.debug('Event:', event);
77
+ if (eventType === 'CONNECT') {
78
+ const { userId, submittedByUserId } = event.queryStringParameters ?? {};
79
+ await dynamodbSharedLib.putItem(event._izContext, await dynamodbSharedLib.tableName(event._izContext, 'UserUploadRecords'), {
80
+ connectionId, userId, submittedByUserId, expirationTime: Math.floor(Date.now() / 1000) + 7200
81
+ });
82
+ //(<webSocketConnect>)
83
+ //(</webSocketConnect>)
84
+ } else if (eventType === 'DISCONNECT') {
85
+ await dynamodbSharedLib.deleteItem(event._izContext, await dynamodbSharedLib.tableName(event._izContext, 'UserUploadRecords'), { connectionId });
86
+ //(<webSocketDisconnect>)
87
+ //(</webSocketDisconnect>)
88
+ }
89
+ return response.webSocketSuccess();
90
+ } catch (error) {
91
+ event._izContext.logger.error('Error, WebSocketConnect: ', error);
92
+ return response.failure(error);
93
+ }
94
+ });
95
+ `;
96
+ }
97
+
98
+ function webSocketCompleteMain() {
99
+ return `import { NoRetryError } from '@izara_project/izara-core-library-core';
100
+ import { consts } from '@izara_project/izara-middleware';
101
+ import { getObjectSchema, utils } from '@izara_project/izara-core-library-service-schemas';
102
+ import dynamodbSharedLib from '@izara_project/izara-core-library-dynamodb';
103
+ import { webSocket } from '@izara_project/izara-core-library-external-request';
104
+
105
+ const { createFlowTypeConcat } = utils;
106
+ const { postToConnection } = webSocket;
107
+
108
+ export default async function WebSocketComplete(_izContext, topicArn, requestParams, callingFlowConfig = {}) {
109
+ try {
110
+ _izContext.logger.debug('WebSocketComplete _izContext', _izContext);
111
+ _izContext.logger.debug('WebSocketComplete requestParams', requestParams);
112
+ _izContext.logger.debug('WebSocketComplete callingFlowConfig', callingFlowConfig);
113
+ const correlationId = _izContext.correlationIds.get(consts.X_CORRELATION_ID);
114
+ if (!topicArn) throw new NoRetryError('not have TopicArn for get FlowSchemas');
115
+ const topicName = topicArn.split(':')[5].split('_');
116
+ let flowTag = topicName[2];
117
+ let flowSchema = await getObjectSchema.getFlowSchemaS3WithCache(_izContext, { flowTag, serviceTag: topicName[0] });
118
+ if (!flowSchema) {
119
+ if (!requestParams?.hasOwnProperty('flowTag')) throw new NoRetryError('Could not find flowSchema from topicArn or requestParams.flowTag');
120
+ flowTag = requestParams.flowTag;
121
+ flowSchema = await getObjectSchema.getFlowSchemaS3WithCache(_izContext, { flowTag, serviceTag: process.env.iz_serviceTag });
122
+ }
123
+ //(<createIdentifiersFlow>)
124
+ let identifiers;
125
+ //(</createIdentifiersFlow>)
126
+ let taskKey;
127
+ if (flowSchema.statusType === 'statusField' || flowSchema.statusType === 'storedCache' || flowSchema.statusType === 'triggerCache') {
128
+ taskKey = createFlowTypeConcat(_izContext, { flowTag, serviceTag: topicName[0] }) + identifiers;
129
+ } else if (flowSchema.statusType === 'none') {
130
+ taskKey = createFlowTypeConcat(_izContext, { flowTag, serviceTag: topicName[0] }) + correlationId;
131
+ }
132
+ if (!taskKey) return;
133
+ const tasks = await dynamodbSharedLib.query(_izContext, await dynamodbSharedLib.tableName(_izContext, 'WebSocketTask'), { taskKey });
134
+ await Promise.all((tasks.Items ?? []).map(async task => {
135
+ //(<beforePostMessage>)
136
+ //(</beforePostMessage>)
137
+ await postToConnection({ message: requestParams }, task.connectionId);
138
+ await dynamodbSharedLib.deleteItem(_izContext, await dynamodbSharedLib.tableName(_izContext, 'WebSocketTask'), { taskKey: task.taskKey, connectionId: task.connectionId });
139
+ }));
140
+ } catch (error) {
141
+ _izContext.logger.error('error WebSocketInvoke: ', error);
142
+ throw error;
143
+ }
144
+ }
145
+ `;
146
+ }
147
+
148
+ function webSocketCompleteHandler() {
149
+ return `import { middlewareHandler as middleware } from '@izara_project/izara-middleware';
150
+ import Logger from '@izara_project/izara-core-library-logger';
151
+ import { recordHandlerSharedLib } from '@izara_project/izara-core-library-record-handler';
152
+ import callingFlowSharedLib from '@izara_project/izara-core-library-calling-flow';
153
+ import WebSocketComplete from './WebSocketComplete_Main.js';
154
+
155
+ middleware.setValidatorSchema(recordHandlerSharedLib.baseValidatorSchema());
156
+ const perRecordsValidatorSchema = {};
157
+ export const main = middleware.wrap(async (event, context, callback) => {
158
+ try {
159
+ const recordPromises = [];
160
+ await Promise.all(event.Records.map(async record => {
161
+ record._izContext.logger.debug('record ReceiveMsgOutHdrSqs', record);
162
+ await recordHandlerSharedLib.validateRecord(record, 'WebSocketCompleteHdrSqs', perRecordsValidatorSchema);
163
+ recordPromises.push(recordHandlerSharedLib.recordHandler(
164
+ record,
165
+ WebSocketComplete,
166
+ 'WebSocketCompleteHdrSqs',
167
+ [record.body.TopicArn, record.body.Message, callingFlowSharedLib.addCallingFlowToPassOnProperties(record.body.Message)]
168
+ ));
169
+ }));
170
+ try {
171
+ await Promise.all(recordPromises);
172
+ return event.Records;
173
+ } catch {
174
+ Logger.debug('Promise.all(recordPromises) in handler threw error (at least one record did no resolve)');
175
+ }
176
+ } catch (error) {
177
+ Logger.error('Unhandled Error, WebSocketComplete_HdrSqs: ', error);
178
+ throw error;
179
+ }
180
+ });
181
+ `;
182
+ }