@izara_project/izara-core-generate-service-code 1.0.65 → 1.0.66

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (254) 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 -332
  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 -503
  108. package/src/codeGenerators/app/sls_yaml/__tests__/SharedResourceYamlGenerator.test.js +0 -235
  109. package/src/codeGenerators/app/sls_yaml/_policy/PolicyRegistry.js +0 -56
  110. package/src/codeGenerators/app/sls_yaml/_policy/__tests__/PolicyRegistry.test.js +0 -33
  111. package/src/codeGenerators/app/sls_yaml/renderYamlTemplate.js +0 -13
  112. package/src/codeGenerators/app/sls_yaml/templates/FindData_Yaml.ejs +0 -10
  113. package/src/codeGenerators/app/sls_yaml/templates/FunctionYaml_Api.ejs +0 -21
  114. package/src/codeGenerators/app/sls_yaml/templates/FunctionYaml_EventBridge.ejs +0 -14
  115. package/src/codeGenerators/app/sls_yaml/templates/FunctionYaml_Inv.ejs +0 -6
  116. package/src/codeGenerators/app/sls_yaml/templates/FunctionYaml_Sqs.ejs +0 -11
  117. package/src/codeGenerators/app/sls_yaml/templates/FunctionYaml_Wbs.ejs +0 -11
  118. package/src/codeGenerators/app/sls_yaml/templates/ProcessLogical_Yaml.ejs +0 -32
  119. package/src/codeGenerators/app/sls_yaml/templates/RoleNameConfig_Yaml.ejs +0 -5
  120. package/src/codeGenerators/app/src/generatedCode/FindData/FindDataGenerator.js +0 -238
  121. package/src/codeGenerators/app/src/generatedCode/FindData/templates/FindData_HdrSqs.ejs +0 -87
  122. package/src/codeGenerators/app/src/generatedCode/FindData/templates/FindData_Main.ejs +0 -108
  123. package/src/codeGenerators/app/src/generatedCode/FindData/templates/GetByStorage/getByDynamo.ejs +0 -32
  124. package/src/codeGenerators/app/src/generatedCode/FindData/templates/GetByStorage/getByGraph.ejs +0 -87
  125. package/src/codeGenerators/app/src/generatedCode/Flow/FlowObjects/.gitkeep +0 -0
  126. package/src/codeGenerators/app/src/generatedCode/Flow/FlowObjects/EndpointsGenerator.js +0 -120
  127. package/src/codeGenerators/app/src/generatedCode/Flow/FlowObjects/templates/step/FlowEndpointComplete_Main.ejs +0 -313
  128. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/RbacFlowGenerator.js +0 -116
  129. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/CreateRolePermissions.ejs +0 -135
  130. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/CreateTargetRole.ejs +0 -131
  131. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/CreateUserRole.ejs +0 -150
  132. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/DeleteRolePermissions.ejs +0 -132
  133. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/DeleteTargetRole.ejs +0 -132
  134. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/DeleteUserFromRole.ejs +0 -150
  135. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/FlowRbac_Main.ejs +0 -252
  136. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/ListRolePermissions.ejs +0 -120
  137. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/ListTargetRole.ejs +0 -122
  138. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/ListUserInRoles.ejs +0 -117
  139. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRelationships/RelationshipFlowGenerator.js +0 -148
  140. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/.gitkeep +0 -0
  141. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/StatusFieldGenerator.js +0 -109
  142. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/WebSocketGenerator.js +0 -122
  143. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/endpoint/FlowEntryPoint_Main.ejs +0 -38
  144. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/statusField/CompleteStatusFieldSns_Yaml.ejs +0 -52
  145. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/statusField/CompleteStatusField_HdrSqs.ejs +0 -84
  146. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/statusField/CompleteStatusField_Main.ejs +0 -78
  147. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/FlowStep_ByConfig_Awaiting_Main.ejs +0 -123
  148. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/FlowStep_ByConfig_Paginated_Main.ejs +0 -59
  149. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/FlowStep_PlugIn_Main.ejs +0 -72
  150. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/FlowStep_RecievePlugIn_Main.ejs +0 -76
  151. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/templateAwaitingStep.ejs +0 -41
  152. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/templateSendPlugin.ejs +0 -18
  153. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/ProcessWebSocketFlow_Yaml.ejs +0 -26
  154. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/ProcessWebSocketSub_Yaml.ejs +0 -7
  155. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/ProcessWebSocket_HdrSqs.ejs +0 -66
  156. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/ProcessWebSocket_Main.ejs +0 -115
  157. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/ProcessWebSocket_Yaml.ejs +0 -36
  158. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/WebSocketConnect_Main.ejs +0 -52
  159. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/WebSocketConnect_Yaml.ejs +0 -13
  160. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/WebSocketDynamoDb_Yaml.ejs +0 -28
  161. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/BaseDsqHandler.js +0 -63
  162. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/BaseSqsHandler.js +0 -66
  163. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/__tests__/BaseDsqHandler.test.js +0 -94
  164. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/dsq.js +0 -5
  165. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/eventBridge.js +0 -33
  166. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/extTopic.js +0 -6
  167. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/lambdaSyncApi.js +0 -51
  168. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/lambdaSyncInv.js +0 -51
  169. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/ownTopic.js +0 -54
  170. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/registry.js +0 -17
  171. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3.js +0 -56
  172. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3Components/ConfirmAfterUploadS3Generator.js +0 -46
  173. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3Components/CreateObjectGenerator.js +0 -50
  174. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3Components/CreatePreSignUrlGenerator.js +0 -48
  175. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3Components/ProcessAfterUploadS3Generator.js +0 -49
  176. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3Components/ReservedLimitGenerator.js +0 -47
  177. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/eventTypes.js +0 -23
  178. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowClassifier.js +0 -50
  179. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowEntryPointBase.js +0 -106
  180. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowMainFunctionBase.js +0 -172
  181. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowNaming.js +0 -37
  182. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowSelection.js +0 -19
  183. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowStepBase.js +0 -235
  184. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowStepNormalizer.js +0 -75
  185. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowValidator.js +0 -267
  186. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/propertyNormalizer.js +0 -18
  187. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/registry.js +0 -7
  188. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/roleNameDetection.js +0 -49
  189. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/triggerCacheBase.js +0 -177
  190. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/CheckTriggerCache_HdrSqs.ejs +0 -89
  191. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/CheckTriggerCache_Main.ejs +0 -83
  192. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/ProcessTriggerCache_HdrSqs.ejs +0 -103
  193. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/ProcessTriggerCache_Main.ejs +0 -58
  194. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/TriggerCacheComplete_HdrDsq.ejs +0 -104
  195. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/TriggerCacheComplete_HdrSqs.ejs +0 -88
  196. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/TriggerCacheComplete_Main.ejs +0 -80
  197. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/TriggerCacheQueue_Yaml.ejs +0 -36
  198. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/yaml/SharedFunctionSqs_Yaml.ejs +0 -13
  199. package/src/codeGenerators/app/src/generatedCode/ProcessLogical/ProcessLogicalGenerator.js +0 -29
  200. package/src/codeGenerators/app/src/generatedCode/ProcessLogical/templates/PaginateProcessLogical_HdrDsq.ejs +0 -177
  201. package/src/codeGenerators/app/src/generatedCode/ProcessLogical/templates/PaginateProcessLogical_HdrSqs.ejs +0 -155
  202. package/src/codeGenerators/app/src/generatedCode/ProcessLogical/templates/PaginateProcessLogical_Main.ejs +0 -268
  203. package/src/codeGenerators/app/src/generatedCode/ProcessLogical/templates/ProcessLogical_Main.ejs +0 -450
  204. package/src/codeGenerators/app/src/generatedCode/SystemFlowSchemas/RegisterGenerator.js +0 -149
  205. package/src/codeGenerators/app/src/generatedCode/SystemFlowSchemas/templates/register/RegisterComplete_HdrSqs.ejs +0 -85
  206. package/src/codeGenerators/app/src/generatedCode/SystemFlowSchemas/templates/register/RegisterComplete_Main.ejs +0 -176
  207. package/src/codeGenerators/app/src/generatedCode/SystemFlowSchemas/templates/register/Register_HdrWbs.ejs +0 -80
  208. package/src/codeGenerators/app/src/generatedCode/SystemFlowSchemas/templates/register/Register_Main.ejs +0 -164
  209. package/src/codeGenerators/app/src/generatedCode/libs/ConstsGenerator.js +0 -28
  210. package/src/codeGenerators/app/src/generatedCode/libs/GenerateCodeLibsGenerator.js +0 -28
  211. package/src/codeGenerators/app/src/generatedCode/libs/templates/Consts.ejs +0 -448
  212. package/src/codeGenerators/app/src/generatedCode/libs/templates/GenerateCodeLibs.ejs +0 -124
  213. package/src/codeGenerators/resource/sls_yaml/DynamoDBGenerator.js +0 -87
  214. package/src/codeGenerators/resource/sls_yaml/FlowOutGenerator.js +0 -70
  215. package/src/codeGenerators/resource/sls_yaml/FlowResourceYamlGenerator.js +0 -182
  216. package/src/core/renderTemplateFile.js +0 -22
  217. package/src/core/validate.js +0 -165
  218. package/src/generateCode.js +0 -357
  219. package/src/generateSchema.js +0 -123
  220. package/src/parsers/flowSchemaParser.js +0 -112
  221. package/src/parsers/objectSchemaParser.js +0 -39
  222. package/src/parsers/relationshipSchemaParser.js +0 -51
  223. package/src/schemaGenerators/app/src/schemas/FlowSchemas/FlowSchemaGenerator.js +0 -107
  224. package/src/schemaGenerators/app/src/schemas/FlowSchemas/RbacFlowSchemaGenerator.js +0 -98
  225. package/src/schemaGenerators/app/src/schemas/FlowSchemas/RelationshipFlowSchemaGenerator.js +0 -89
  226. package/src/schemaGenerators/app/src/schemas/FlowSchemas/templates/DynamicFlowSchemaTemplate.ejs +0 -41
  227. package/src/schemaGenerators/app/src/schemas/FlowSchemas/templates/DynamicRbacFlowSchemaTemplate.ejs +0 -20
  228. package/src/schemaGenerators/app/src/schemas/FlowSchemas/templates/RelationshipFlowSchemaTemplate.ejs +0 -33
  229. package/src/schemaGenerators/app/src/schemas/FlowSchemas/templates/UserRbacFlowSchemaTemplate.ejs +0 -22
  230. package/src/schemaGenerators/app/src/schemas/ObjectSchemas/AttributeTreeSchemaGenerator.js +0 -124
  231. package/src/schemaGenerators/app/src/schemas/ObjectSchemas/PropertyValueSchemaGenerator.js +0 -119
  232. package/src/schemaGenerators/app/src/schemas/ObjectSchemas/templates/DynamicAttributeTreeManagerSchemaTemplate.ejs +0 -14
  233. package/src/schemaGenerators/app/src/schemas/ObjectSchemas/templates/DynamicAttributeTreeStandardSchemaTemplate.ejs +0 -13
  234. package/src/schemaGenerators/app/src/schemas/ObjectSchemas/templates/DynamicPropertyValueSchemaTemplate.ejs +0 -15
  235. package/src/schemaGenerators/app/src/schemas/RelationshipSchemas/AttributeTreeRelationshipSchemaGenerator.js +0 -109
  236. package/src/schemaGenerators/app/src/schemas/RelationshipSchemas/PropertyValueRelationshipSchemaGenerator.js +0 -103
  237. package/src/schemaGenerators/app/src/schemas/RelationshipSchemas/__tests__/relationshipSchemaHelpers.test.js +0 -38
  238. package/src/schemaGenerators/app/src/schemas/RelationshipSchemas/relationshipSchemaHelpers.js +0 -40
  239. package/src/schemaGenerators/app/src/schemas/RelationshipSchemas/templates/DynamicAttributeTreeRelationshipSchemaTemplate.ejs +0 -7
  240. package/src/schemaGenerators/app/src/schemas/RelationshipSchemas/templates/DynamicPropertyValueRelationshipSchemaTemplate.ejs +0 -7
  241. package/src/schemaGenerators/app/src/schemas/SystemTextSchemas/SystemTextGenerator.js +0 -102
  242. package/src/schemaGenerators/app/src/schemas/SystemTextSchemas/templates/SystemText_Template.ejs +0 -10
  243. /package/src/{codeGenerators/app/src/generatedCode/Flow/_shared/handlers → emit/crud/templates}/FlowHandler_HdrApi.ejs +0 -0
  244. /package/src/{codeGenerators/app/src/generatedCode/Flow/_shared/handlers → emit/crud/templates}/FlowHandler_HdrInv.ejs +0 -0
  245. /package/src/{codeGenerators/app/src/generatedCode/Flow/FlowObjects/templates/crud → emit/crud/templates}/GetEndpoint_Main.ejs +0 -0
  246. /package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/ConfirmReserved_HdrSqs.ejs +0 -0
  247. /package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/CreatePreSignUrl_HdrSqs.ejs +0 -0
  248. /package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/ReservedLimit_HdrSqs.ejs +0 -0
  249. /package/src/{codeGenerators/app/src/generatedCode/Flow/_shared/handlers → emit/relationship/templates}/FlowHandler_HdrSqs.ejs +0 -0
  250. /package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessMoveRelationshipComplete_Main.ejs → emit/relationship/templates/MoveRelationshipComplete_Main.ejs} +0 -0
  251. /package/src/{codeGenerators/resource/sls_yaml → emit/resource}/templates/DynamoDBTable_Yaml.ejs +0 -0
  252. /package/src/{codeGenerators/resource/sls_yaml → emit/resource}/templates/FlowOut_Yaml.ejs +0 -0
  253. /package/src/{codeGenerators/resource/sls_yaml/templates/crud → emit/resource/templates}/ResourceYaml.ejs +0 -0
  254. /package/src/{codeGenerators/resource/sls_yaml → emit/resource}/templates/SystemDynamoDB_Yaml.ejs +0 -0
@@ -1,48 +0,0 @@
1
- import fs from 'fs/promises';
2
- import path from 'path';
3
- import ejs from 'ejs';
4
- import { fileURLToPath } from 'url';
5
- import { detectRoleNames } from '../src/generatedCode/Flow/_shared/shared/roleNameDetection.js';
6
-
7
- const __filename = fileURLToPath(import.meta.url);
8
- const __dirname = path.dirname(__filename);
9
-
10
- const FALLBACK_TEMPLATE = `# createIamRole
11
- <% roleNameConfigs.forEach(function(roleNameConfig){ _%>
12
- - arn:aws:iam::\${self:custom.iz_accountId}:role/\${self:custom.iz_resourcePrefix}<%- roleNameConfig %>
13
- <% }) _%>
14
- `;
15
-
16
- export async function generateRoleNameConfig(allSchemas, options) {
17
- console.log(' [RoleNameConfigGenerator] Generating IAM Role Configurations...');
18
-
19
- const resourceYamlDir = path.join(
20
- options.outputPath,
21
- 'app',
22
- 'sls_yaml',
23
- 'generatedCode',
24
- 'source'
25
- );
26
- await fs.mkdir(resourceYamlDir, { recursive: true });
27
-
28
- const { roleNames } = detectRoleNames(allSchemas);
29
- const roleNameConfigs = Array.from(roleNames);
30
- const templatePath = path.join(__dirname, 'templates', 'RoleNameConfig_Yaml.ejs');
31
-
32
- let templateString;
33
- try {
34
- templateString = await fs.readFile(templatePath, 'utf-8');
35
- } catch {
36
- templateString = FALLBACK_TEMPLATE;
37
- await fs.mkdir(path.dirname(templatePath), { recursive: true });
38
- await fs.writeFile(templatePath, templateString, 'utf-8');
39
- }
40
-
41
- const fileContent = ejs.render(templateString, { roleNameConfigs });
42
- const outputPath = path.join(resourceYamlDir, 'role-name-config.yml');
43
- await fs.writeFile(outputPath, fileContent, 'utf-8');
44
-
45
- console.log(
46
- ` [RoleNameConfigGenerator] Wrote ${roleNameConfigs.length} role configs to ${outputPath}`
47
- );
48
- }
@@ -1,503 +0,0 @@
1
- import fs from 'fs/promises';
2
- import path from 'path';
3
- import ejs from 'ejs';
4
- import { fileURLToPath } from 'url';
5
- import { policyRegistry } from './_policy/PolicyRegistry.js';
6
- import { getFlowsForGeneration } from '../src/generatedCode/Flow/_shared/shared/flowSelection.js';
7
-
8
- const __filename = fileURLToPath(import.meta.url);
9
- const __dirname = path.dirname(__filename);
10
-
11
- const APP_SOURCE_FILES = [
12
- 'find-data.yml',
13
- 'flow-schema.yml',
14
- 'flow-rbac.yml',
15
- 'flow-objects.yml',
16
- 'process-logical.yml',
17
- 'flow-relationships.yml'
18
- ];
19
-
20
- const FLOW_OBJECTS_ROLE = 'FlowObjectsRole';
21
-
22
- const QUEUE_OWNERSHIP_PREFIXES = {
23
- [FLOW_OBJECTS_ROLE]: ['Create', 'Update', 'Delete', 'Get'],
24
- FlowRbacRole: [
25
- 'CreateTargetRole',
26
- 'ListTargetRole',
27
- 'DeleteTargetRole',
28
- 'CreateRolePermissions',
29
- 'ListRolePermissions',
30
- 'DeleteRolePermissions',
31
- 'CreateUserRole',
32
- 'ListUserInRoles',
33
- 'DeleteUserFromRole',
34
- 'UserRbacFlow'
35
- ],
36
- FlowRelationshipRole: [
37
- 'CreateRelationship',
38
- 'UpdateRelationship',
39
- 'DeleteRelationship',
40
- 'GetRelationship',
41
- 'ChangeRelationship',
42
- 'MoveRelationship'
43
- ],
44
- ProcFindDataRole: ['FindData', 'ProcessLogical', 'PaginateProcessLogical'],
45
- RegisterRole: ['Register'],
46
- WebSocketMainRole: ['WebSocket']
47
- };
48
-
49
- const COMMON_S3_STATEMENTS = [
50
- {
51
- action: 's3:GetObject',
52
- resource:
53
- 'arn:aws:s3:::${self:custom.iz_serviceSchemaBucketName}/perServiceSchemas/*'
54
- },
55
- {
56
- action: 's3:GetObjectVersion',
57
- resource:
58
- 'arn:aws:s3:::${self:custom.iz_serviceSchemaBucketName}/perServiceSchemas/*'
59
- },
60
- {
61
- action: 's3:GetObject',
62
- resource:
63
- 'arn:aws:s3:::${self:custom.iz_serviceSchemaBucketName}/serviceConfig/GraphServerTags.json'
64
- },
65
- {
66
- action: 's3:GetObjectVersion',
67
- resource:
68
- 'arn:aws:s3:::${self:custom.iz_serviceSchemaBucketName}/serviceConfig/GraphServerTags.json'
69
- },
70
- {
71
- action: 's3:ListBucket',
72
- resource: 'arn:aws:s3:::${self:custom.iz_serviceSchemaBucketName}'
73
- }
74
- ];
75
-
76
- const DEFAULT_DYNAMO_ACTIONS = [
77
- 'dynamodb:DeleteItem',
78
- 'dynamodb:GetItem',
79
- 'dynamodb:PutItem',
80
- 'dynamodb:Query',
81
- 'dynamodb:UpdateItem'
82
- ];
83
-
84
- const DYNAMO_ACTIONS_BY_ROLE = {
85
- RegisterRole: [],
86
- WebSocketMainRole: ['dynamodb:DeleteItem', 'dynamodb:PutItem', 'dynamodb:Query']
87
- };
88
-
89
- const SQS_CONSUMER_ACTIONS = [
90
- 'sqs:DeleteMessage',
91
- 'sqs:DeleteMessageBatch',
92
- 'sqs:GetQueueAttributes',
93
- 'sqs:GetQueueUrl',
94
- 'sqs:ReceiveMessage'
95
- ];
96
-
97
- function upperCase(str) {
98
- if (!str) return str;
99
- return str.charAt(0).toUpperCase() + str.slice(1);
100
- }
101
-
102
- async function readTextIfExists(filePath) {
103
- try {
104
- return await fs.readFile(filePath, 'utf8');
105
- } catch {
106
- return '';
107
- }
108
- }
109
-
110
- function collectMatches(text, regex) {
111
- const out = new Set();
112
-
113
- for (const match of text.matchAll(regex)) {
114
- if (match[1]) out.add(match[1]);
115
- }
116
-
117
- return out;
118
- }
119
-
120
- function splitTopLevelBlocks(text) {
121
- const lines = text.split(/\r?\n/);
122
- const blocks = [];
123
- let current = [];
124
-
125
- for (const line of lines) {
126
- if (/^[A-Za-z0-9][A-Za-z0-9]*:/.test(line) && current.length > 0) {
127
- blocks.push(current.join('\n'));
128
- current = [line];
129
- continue;
130
- }
131
-
132
- current.push(line);
133
- }
134
-
135
- if (current.length > 0) blocks.push(current.join('\n'));
136
- return blocks;
137
- }
138
-
139
- function rolePrefixes(roleName) {
140
- if (QUEUE_OWNERSHIP_PREFIXES[roleName]) return QUEUE_OWNERSHIP_PREFIXES[roleName];
141
- if (roleName.endsWith('Role')) return [roleName.replace(/Role$/, '')];
142
- return [roleName];
143
- }
144
-
145
- function topicBelongsToRole(roleName, topicName) {
146
- if (topicName.endsWith('Complete_In')) return false;
147
-
148
- const prefixes = rolePrefixes(roleName);
149
-
150
- if (roleName === FLOW_OBJECTS_ROLE) {
151
- const reservedPrefixes = [
152
- ...QUEUE_OWNERSHIP_PREFIXES.FlowRbacRole,
153
- ...QUEUE_OWNERSHIP_PREFIXES.FlowRelationshipRole
154
- ];
155
-
156
- return (
157
- prefixes.some(prefix => topicName.startsWith(prefix)) &&
158
- !reservedPrefixes.some(prefix => topicName.startsWith(prefix)) &&
159
- !topicName.includes('Relationship')
160
- );
161
- }
162
-
163
- return prefixes.some(prefix => topicName.startsWith(prefix));
164
- }
165
-
166
- function buildDynamoArn(tableName) {
167
- return (
168
- 'arn:aws:dynamodb:${self:custom.iz_region}:${self:custom.iz_accountId}:table/' +
169
- '${self:custom.iz_resourcePrefix}' +
170
- tableName
171
- );
172
- }
173
-
174
- function buildQueueArn(queueName) {
175
- return (
176
- 'arn:aws:sqs:${self:custom.iz_region}:${self:custom.iz_accountId}:' +
177
- '${self:custom.iz_resourcePrefix}' +
178
- queueName
179
- );
180
- }
181
-
182
- function buildTopicArn(topicName) {
183
- return (
184
- 'arn:aws:sns:${self:custom.iz_region}:${self:custom.iz_accountId}:' +
185
- '${self:custom.iz_serviceTag}_${self:custom.iz_stage}_' +
186
- topicName
187
- );
188
- }
189
-
190
- function buildWebSocketArn() {
191
- return (
192
- 'arn:aws:execute-api:${self:custom.iz_region}:${self:custom.iz_accountId}:' +
193
- '${self:custom.iz_webSocketHostId}/*'
194
- );
195
- }
196
-
197
- function detectRoleNamesFromSchemas(allSchemas = {}) {
198
- const roleNames = new Set(['ProcFindDataRole', 'RegisterRole']);
199
- const flows = getFlowsForGeneration(allSchemas);
200
-
201
- if ((allSchemas.objects || []).length > 0) roleNames.add(FLOW_OBJECTS_ROLE);
202
- if ((allSchemas.relationships || []).length > 0) roleNames.add('FlowRelationshipRole');
203
-
204
- for (const flow of flows) {
205
- if (!flow.flowTag) continue;
206
-
207
- const upperFlowTag = upperCase(flow.flowTag);
208
-
209
- if (QUEUE_OWNERSHIP_PREFIXES.FlowRbacRole.includes(upperFlowTag)) {
210
- roleNames.add('FlowRbacRole');
211
- continue;
212
- }
213
-
214
- if (upperFlowTag.endsWith('RbacFlow')) {
215
- roleNames.add('FlowRbacRole');
216
- continue;
217
- }
218
-
219
- if (QUEUE_OWNERSHIP_PREFIXES.FlowRelationshipRole.includes(upperFlowTag)) {
220
- roleNames.add('FlowRelationshipRole');
221
- continue;
222
- }
223
-
224
- if (QUEUE_OWNERSHIP_PREFIXES[FLOW_OBJECTS_ROLE].includes(upperFlowTag)) {
225
- roleNames.add(FLOW_OBJECTS_ROLE);
226
- continue;
227
- }
228
-
229
- if ((flow.event || []).includes('ownTopic')) {
230
- roleNames.add('WebSocketMainRole');
231
- // ponytail: removed continue; so custom flows with ownTopic get their own specific role
232
- }
233
-
234
- roleNames.add(`${upperFlowTag}Role`);
235
- }
236
-
237
- return roleNames;
238
- }
239
-
240
- async function readRoleNames(outputPath, allSchemas) {
241
- const roleConfigPath = path.join(
242
- outputPath,
243
- 'app',
244
- 'sls_yaml',
245
- 'generatedCode',
246
- 'source',
247
- 'role-name-config.yml'
248
- );
249
- const roleConfigText = await readTextIfExists(roleConfigPath);
250
- const fromFile = collectMatches(
251
- roleConfigText,
252
- /\$\{self:custom\.iz_resourcePrefix\}([A-Za-z0-9]+Role)/g
253
- );
254
-
255
- if (fromFile.size > 0) return new Set(fromFile);
256
- return detectRoleNamesFromSchemas(allSchemas);
257
- }
258
-
259
- async function collectExplicitResourceNames(outputPath) {
260
- const resourceSourceDir = path.join(
261
- outputPath,
262
- 'resource',
263
- 'sls_yaml',
264
- 'generatedCode',
265
- 'source'
266
- );
267
- const dynamoText = await readTextIfExists(
268
- path.join(resourceSourceDir, 'generated-dynamoDB-table.yml')
269
- );
270
-
271
- return {
272
- tableNames: Array.from(
273
- collectMatches(
274
- dynamoText,
275
- /TableName:\s+\$\{self:custom\.iz_resourcePrefix\}([A-Za-z0-9]+)/g
276
- )
277
- ).sort()
278
- };
279
- }
280
-
281
- async function collectRoleScopedResourceNames(outputPath, allowedRoles) {
282
- const appSourceDir = path.join(
283
- outputPath,
284
- 'app',
285
- 'sls_yaml',
286
- 'generatedCode',
287
- 'source'
288
- );
289
- const resourceSourceDir = path.join(
290
- outputPath,
291
- 'resource',
292
- 'sls_yaml',
293
- 'generatedCode',
294
- 'source'
295
- );
296
-
297
- const texts = await Promise.all([
298
- ...APP_SOURCE_FILES.map(fileName =>
299
- readTextIfExists(path.join(appSourceDir, fileName))
300
- ),
301
- readTextIfExists(path.join(resourceSourceDir, 'generated-sns-in-sqs.yml')),
302
- readTextIfExists(path.join(resourceSourceDir, 'generated-sns-out.yml'))
303
- ]);
304
-
305
- const appTexts = texts.slice(0, APP_SOURCE_FILES.length);
306
- const snsInSqsText = texts[APP_SOURCE_FILES.length];
307
- const snsOutText = texts[APP_SOURCE_FILES.length + 1];
308
- const allTopics = new Set([
309
- ...collectMatches(
310
- snsInSqsText,
311
- /TopicName:\s+\$\{self:custom\.iz_serviceTag\}_\$\{self:custom\.iz_stage\}_([A-Za-z0-9_]+)/g
312
- ),
313
- ...collectMatches(
314
- snsOutText,
315
- /TopicName:\s+\$\{self:custom\.iz_serviceTag\}_\$\{self:custom\.iz_stage\}_([A-Za-z0-9_]+)/g
316
- )
317
- ]);
318
-
319
- const roleQueues = new Map();
320
-
321
- for (const roleName of allowedRoles) {
322
- roleQueues.set(roleName, new Set());
323
- }
324
-
325
- for (const text of appTexts) {
326
- for (const block of splitTopLevelBlocks(text)) {
327
- const roleMatch = block.match(/role:\s+([A-Za-z0-9]+)/);
328
- if (!roleMatch || !allowedRoles.has(roleMatch[1])) continue;
329
-
330
- const queueNames = collectMatches(
331
- block,
332
- /arn:aws:sqs:\$\{self:custom\.iz_region\}:\$\{self:custom\.iz_accountId\}:\$\{self:custom\.iz_resourcePrefix\}([A-Za-z0-9]+)/g
333
- );
334
-
335
- for (const queueName of queueNames) {
336
- roleQueues.get(roleMatch[1]).add(queueName);
337
- }
338
- }
339
- }
340
-
341
- const scoped = new Map();
342
-
343
- for (const roleName of allowedRoles) {
344
- const queueNames = Array.from(roleQueues.get(roleName) || []).sort();
345
- const topicNames = Array.from(allTopics).filter(topicName => {
346
- return topicBelongsToRole(roleName, topicName);
347
- });
348
-
349
- scoped.set(roleName, {
350
- queueNames,
351
- topicNames: topicNames.sort()
352
- });
353
- }
354
-
355
- return scoped;
356
- }
357
-
358
- function tableNamesForRole(roleName, tableNames) {
359
- if (roleName === 'RegisterRole') return [];
360
-
361
- if (roleName === 'WebSocketMainRole') {
362
- const filtered = tableNames.filter(tableName => /websocket|upload/i.test(tableName));
363
- // ponytail: fall back to all tables if websocket tables are not named consistently yet.
364
- return filtered.length > 0 ? filtered : tableNames;
365
- }
366
-
367
- // ponytail: least privilege for ProcFindDataRole, exclude system internal tables
368
- if (roleName === 'ProcFindDataRole') {
369
- return tableNames.filter(tableName => !/Awaiting|WebSocket|Upload/i.test(tableName));
370
- }
371
-
372
- const isFlowRole = roleName.endsWith('Role');
373
- if (isFlowRole) {
374
- const flowTables = tableNames.filter(tableName => !/FindDataMain|LogicalResults|RegisterRecords|Upload/i.test(tableName));
375
- if (roleName === 'FlowRbacRole') {
376
- return [...new Set([...flowTables, 'TargetRoles', 'RolePermissions', 'RoleUsers', 'UserRoles'])];
377
- }
378
- return flowTables;
379
- }
380
-
381
- return tableNames;
382
- }
383
-
384
- function dynamoActionsForRole(roleName) {
385
- return DYNAMO_ACTIONS_BY_ROLE[roleName] || DEFAULT_DYNAMO_ACTIONS;
386
- }
387
-
388
- function buildRoleStatements(roleName, resources, scopedResources) {
389
- const statements = [...COMMON_S3_STATEMENTS];
390
- const scoped = scopedResources.get(roleName) || { queueNames: [], topicNames: [] };
391
-
392
- for (const tableName of tableNamesForRole(roleName, resources.tableNames)) {
393
- for (const action of dynamoActionsForRole(roleName)) {
394
- statements.push({ action, resource: buildDynamoArn(tableName) });
395
- }
396
- }
397
-
398
- for (const queueName of scoped.queueNames) {
399
- for (const action of SQS_CONSUMER_ACTIONS) {
400
- statements.push({ action, resource: buildQueueArn(queueName) });
401
- }
402
- }
403
-
404
- for (const topicName of scoped.topicNames) {
405
- statements.push({ action: 'sns:Publish', resource: buildTopicArn(topicName) });
406
- }
407
-
408
- if (roleName === 'WebSocketMainRole') {
409
- statements.push({
410
- action: 'execute-api:ManageConnections',
411
- resource: buildWebSocketArn()
412
- });
413
- }
414
-
415
- return statements;
416
- }
417
-
418
- function groupStatementsByResources(statements) {
419
- const grouped = new Map();
420
-
421
- for (const statement of statements) {
422
- const resources = Array.isArray(statement.resource)
423
- ? [...statement.resource].sort()
424
- : [statement.resource];
425
- const key = JSON.stringify(resources);
426
-
427
- if (!grouped.has(key)) {
428
- grouped.set(key, { action: new Set(), resource: resources });
429
- }
430
-
431
- grouped.get(key).action.add(statement.action);
432
- }
433
-
434
- return [...grouped.values()].map(entry => ({
435
- action: [...entry.action].sort(),
436
- resource: entry.resource
437
- }));
438
- }
439
-
440
- export async function generateSharedResourceYaml(allSchemas, options) {
441
- console.log(
442
- ' [SharedResourceYamlGenerator] Generating Shared Resource YAML (IAM Roles)...'
443
- );
444
-
445
- const slsYamlDir = path.join(
446
- options.outputPath,
447
- 'app',
448
- 'sls_yaml',
449
- 'generatedCode',
450
- 'source'
451
- );
452
- await fs.mkdir(slsYamlDir, { recursive: true });
453
-
454
- const allowedRoles = await readRoleNames(options.outputPath, allSchemas);
455
- const resources = await collectExplicitResourceNames(options.outputPath);
456
- const scopedResources = await collectRoleScopedResourceNames(
457
- options.outputPath,
458
- allowedRoles
459
- );
460
-
461
- for (const roleName of allowedRoles) {
462
- for (const statement of buildRoleStatements(roleName, resources, scopedResources)) {
463
- policyRegistry.add(roleName, statement.action, statement.resource);
464
- }
465
- }
466
-
467
- const groupedStatements = policyRegistry.toGroupedByRole();
468
- const unexpectedRoles = Object.keys(groupedStatements).filter(
469
- roleName => !allowedRoles.has(roleName)
470
- );
471
-
472
- if (unexpectedRoles.length > 0) {
473
- console.warn(
474
- ` [SharedResourceYamlGenerator] Ignoring roles not present in role-name-config.yml: ${unexpectedRoles.join(', ')}`
475
- );
476
- }
477
-
478
- const roles = Array.from(allowedRoles)
479
- .sort()
480
- .map(roleName => ({
481
- roleName,
482
- statements: groupStatementsByResources(groupedStatements[roleName]?.statements || [])
483
- }));
484
-
485
- const templatePath = path.join(__dirname, 'templates', 'SharedResource_Yaml.ejs');
486
- const templateString = await fs.readFile(templatePath, 'utf-8');
487
- const fileContent = ejs.render(templateString, { roles });
488
- let normalizedContent = fileContent
489
- .split('\n')
490
- .filter(line => line.trim() !== '')
491
- .join('\n');
492
-
493
- normalizedContent =
494
- normalizedContent
495
- .replace(/^ [A-Za-z0-9]+:/gm, '\n\n$&')
496
- .replace(/^Resources:\n+ /, 'Resources:\n\n ') + '\n';
497
-
498
- const outputPath = path.join(slsYamlDir, 'generate-shared-resource.yml');
499
- await fs.writeFile(outputPath, normalizedContent, 'utf-8');
500
- console.log(
501
- ` [SharedResourceYamlGenerator] Wrote generate-shared-resource.yml to ${outputPath}`
502
- );
503
- }