@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
@@ -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
+ }