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