@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,136 @@
1
+ import assert from 'node:assert/strict';
2
+ import { mkdir, mkdtemp, readFile, writeFile } from 'node:fs/promises';
3
+ import { tmpdir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import test from 'node:test';
6
+ import { pathToFileURL } from 'node:url';
7
+
8
+ import { generateDynamicCrudFlowSchemas } from '../src/emit/crud/generateDynamicCrudFlowSchemas.js';
9
+
10
+ test('generates dynamic CRUD schemas from local schema modules', async () => {
11
+ const rootPath = await createProject({
12
+ generatedBy: 'userGenerated',
13
+ flow: createHookFlow(['ownTopic'])
14
+ });
15
+
16
+ const result = await generateDynamicCrudFlowSchemas(rootPath);
17
+ assert.deepEqual(result.files.map(file => file.path), [
18
+ 'app/src/schemas/FlowSchemas/generateCode/Create.js',
19
+ 'app/src/schemas/FlowSchemas/generateCode/Update.js',
20
+ 'app/src/schemas/FlowSchemas/generateCode/Delete.js',
21
+ 'app/src/schemas/FlowSchemas/generateCode/Get.js'
22
+ ]);
23
+
24
+ const create = await readGeneratedFlow(rootPath, 'Create');
25
+ const get = await readGeneratedFlow(rootPath, 'Get');
26
+ assert.deepEqual(create.event, ['ownTopic']);
27
+ assert.deepEqual(create.flowSteps.map(step => step.stepName), ['start', 'BeforeLogical', 'Complete']);
28
+ assert.deepEqual(create.flowSteps[0].returnValues.messageAttributes, ['userId', 'correlationId']);
29
+ assert.equal(get.outputTopic, false);
30
+ assert.deepEqual(get.event, ['lambdaSyncInv', 'lambdaSyncApi']);
31
+ assert.equal(get.flowSteps[0].returnValues, undefined);
32
+ });
33
+
34
+ test('accepts singleton object exports used by existing schema files', async () => {
35
+ const rootPath = await createProject({
36
+ generatedBy: 'userGenerated',
37
+ flow: createHookFlow(['ownTopic']),
38
+ singletonExports: true
39
+ });
40
+
41
+ const result = await generateDynamicCrudFlowSchemas(rootPath);
42
+
43
+ assert.equal(result.files.length, 4);
44
+ assert.deepEqual((await readGeneratedFlow(rootPath, 'Create')).flowSteps.map(step => step.stepName), [
45
+ 'start',
46
+ 'BeforeLogical',
47
+ 'Complete'
48
+ ]);
49
+ });
50
+
51
+ test('does not generate CRUD schemas without an applicable object', async () => {
52
+ const rootPath = await createProject({ generatedBy: 'userGenerated' });
53
+ await generateDynamicCrudFlowSchemas(rootPath);
54
+ await writeFile(
55
+ join(rootPath, 'app/src/schemas/ObjectSchemas/Order.js'),
56
+ "export default [{ objectType: 'order', generatedBy: 'external' }];\n"
57
+ );
58
+
59
+ const result = await generateDynamicCrudFlowSchemas(rootPath);
60
+
61
+ assert.deepEqual(result.files, []);
62
+ await assert.rejects(readGeneratedFile(rootPath, 'Create'));
63
+ });
64
+
65
+ test('does not allow options to override the rootPath argument', async () => {
66
+ const rootPath = await createProject({ generatedBy: 'userGenerated' });
67
+ const ignoredRootPath = await createProject({ generatedBy: 'external' });
68
+
69
+ const result = await generateDynamicCrudFlowSchemas(rootPath, { rootPath: ignoredRootPath });
70
+
71
+ assert.equal(result.project.rootPath, rootPath);
72
+ assert.equal(result.files.length, 4);
73
+ });
74
+
75
+ test('rejects source modules that do not default-export schema objects or arrays', async () => {
76
+ const rootPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-invalid-schema-'));
77
+ const objectDirectory = join(rootPath, 'app/src/schemas/ObjectSchemas');
78
+ await mkdir(objectDirectory, { recursive: true });
79
+ await writeFile(join(objectDirectory, 'Invalid.js'), "export default 'not-a-schema';\n");
80
+
81
+ await assert.rejects(
82
+ generateDynamicCrudFlowSchemas(rootPath),
83
+ /must default-export an object or array/
84
+ );
85
+ });
86
+
87
+ test('reloads changed local flow schemas instead of reusing module cache', async () => {
88
+ const rootPath = await createProject({
89
+ generatedBy: 'systemGenerated',
90
+ flow: createHookFlow(['ownTopic'])
91
+ });
92
+ const flowPath = join(rootPath, 'app/src/schemas/FlowSchemas/CreateHook.js');
93
+
94
+ await generateDynamicCrudFlowSchemas(rootPath);
95
+ assert.match(await readGeneratedFile(rootPath, 'Create'), /BeforeLogical/);
96
+
97
+ await writeFile(flowPath, `export default [${JSON.stringify(createHookFlow([]))}];\n`);
98
+ await generateDynamicCrudFlowSchemas(rootPath);
99
+ assert.doesNotMatch(await readGeneratedFile(rootPath, 'Create'), /BeforeLogical/);
100
+ });
101
+
102
+ async function createProject({ generatedBy, flow, singletonExports = false }) {
103
+ const rootPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-crud-'));
104
+ const objectPath = join(rootPath, 'app/src/schemas/ObjectSchemas/Order.js');
105
+ const flowPath = join(rootPath, 'app/src/schemas/FlowSchemas/CreateHook.js');
106
+ await mkdir(join(rootPath, 'app/src/schemas/ObjectSchemas'), { recursive: true });
107
+ await mkdir(join(rootPath, 'app/src/schemas/FlowSchemas'), { recursive: true });
108
+ const object = `{ objectType: 'order', generatedBy: '${generatedBy}' }`;
109
+ await writeFile(objectPath, `export default ${singletonExports ? object : `[${object}]`};\n`);
110
+ if (flow) {
111
+ const flowSource = JSON.stringify(flow);
112
+ await writeFile(flowPath, `export default ${singletonExports ? flowSource : `[${flowSource}]`};\n`);
113
+ }
114
+ return rootPath;
115
+ }
116
+
117
+ function createHookFlow(event) {
118
+ return {
119
+ flowTag: 'CreateHook',
120
+ event,
121
+ generatedCodeConfig: {
122
+ generatedCodeTag: 'create',
123
+ codeHookTag: 'beforeLogical',
124
+ invocationType: 'ownTopic'
125
+ }
126
+ };
127
+ }
128
+
129
+ async function readGeneratedFlow(rootPath, action) {
130
+ const filePath = join(rootPath, 'app/src/schemas/FlowSchemas/generateCode', `${action}.js`);
131
+ return import(`${pathToFileURL(filePath).href}?test=${process.hrtime.bigint()}`).then(module => module.default);
132
+ }
133
+
134
+ function readGeneratedFile(rootPath, action) {
135
+ return readFile(join(rootPath, 'app/src/schemas/FlowSchemas/generateCode', `${action}.js`), 'utf8');
136
+ }
@@ -0,0 +1,101 @@
1
+ import assert from 'node:assert/strict';
2
+ import { mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
3
+ import { tmpdir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import test, { after } from 'node:test';
6
+ import { pathToFileURL } from 'node:url';
7
+
8
+ import { generateDynamicRbacFlowSchemas } from '../src/emit/rbac/generateDynamicRbacFlowSchemas.js';
9
+
10
+ const projectRoots = new Set();
11
+ const STATIC_ACTIONS = [
12
+ 'CreateTargetRole',
13
+ 'ListTargetRole',
14
+ 'DeleteTargetRole',
15
+ 'CreateRolePermissions',
16
+ 'ListRolePermissions',
17
+ 'DeleteRolePermissions',
18
+ 'CreateUserRole',
19
+ 'ListUserInRoles',
20
+ 'DeleteUserFromRole'
21
+ ];
22
+
23
+ after(async () => {
24
+ await Promise.all([...projectRoots].map(rootPath => rm(rootPath, { recursive: true, force: true })));
25
+ });
26
+
27
+ test('generates shared and object-specific RBAC flow schemas', async () => {
28
+ const rootPath = await createProject({ hasRbac: true });
29
+
30
+ const result = await generateDynamicRbacFlowSchemas(rootPath, { serviceTag: 'UserAccount' });
31
+
32
+ assert.deepEqual(result.files.map(file => file.path), [
33
+ ...STATIC_ACTIONS.map(action => `app/src/schemas/FlowSchemas/generateCode/${action}.js`),
34
+ 'app/src/schemas/FlowSchemas/generateCode/UserRbacFlow.js'
35
+ ]);
36
+ const createTargetRole = await readGeneratedFlow(rootPath, 'CreateTargetRole');
37
+ const listTargetRole = await readGeneratedFlow(rootPath, 'ListTargetRole');
38
+ const user = await readGeneratedFlow(rootPath, 'UserRbacFlow');
39
+ assert.deepEqual(createTargetRole.flowSteps[0].returnValues, {
40
+ properties: ['returnResult'],
41
+ messageAttributes: []
42
+ });
43
+ assert.deepEqual(listTargetRole.event, ['lambdaSyncApi']);
44
+ assert.equal(listTargetRole.outputTopic, true);
45
+ assert.deepEqual(user.objType, { serviceTag: 'UserAccount', objectType: 'user' });
46
+ assert.deepEqual(user.flowSteps[0].messageAttributes, ['userId', 'correlationId']);
47
+ assert.equal(user.steps, undefined);
48
+ });
49
+
50
+ test('removes RBAC schemas when the last RBAC object is removed', async () => {
51
+ const rootPath = await createProject({ hasRbac: true });
52
+ const objectPath = join(rootPath, 'app/src/schemas/ObjectSchemas/User.js');
53
+ await generateDynamicRbacFlowSchemas(rootPath, { serviceTag: 'UserAccount' });
54
+ await writeFile(objectPath, "export default { objectType: 'user', addOnDataStructure: [] };\n");
55
+
56
+ const result = await generateDynamicRbacFlowSchemas(rootPath);
57
+
58
+ assert.deepEqual(result.files, []);
59
+ await assert.rejects(readFile(join(rootPath, 'app/src/schemas/FlowSchemas/generateCode/CreateTargetRole.js')));
60
+ await assert.rejects(readFile(join(rootPath, 'app/src/schemas/FlowSchemas/generateCode/UserRbacFlow.js')));
61
+ });
62
+
63
+ test('requires a serviceTag only when RBAC schemas are needed', async () => {
64
+ const rbacRoot = await createProject({ hasRbac: true });
65
+ const plainRoot = await createProject();
66
+
67
+ await assert.rejects(
68
+ generateDynamicRbacFlowSchemas(rbacRoot),
69
+ /serviceTag is required/
70
+ );
71
+ assert.deepEqual((await generateDynamicRbacFlowSchemas(plainRoot)).files, []);
72
+ });
73
+
74
+ test('removes object-specific RBAC schemas when the ObjectSchema file is deleted', async () => {
75
+ const rootPath = await createProject({ hasRbac: true });
76
+ const objectPath = join(rootPath, 'app/src/schemas/ObjectSchemas/User.js');
77
+ await generateDynamicRbacFlowSchemas(rootPath, { serviceTag: 'UserAccount' });
78
+ await rm(objectPath);
79
+
80
+ await generateDynamicRbacFlowSchemas(rootPath);
81
+
82
+ await assert.rejects(readFile(join(rootPath, 'app/src/schemas/FlowSchemas/generateCode/UserRbacFlow.js')));
83
+ });
84
+
85
+ async function createProject({ hasRbac = false } = {}) {
86
+ const rootPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-rbac-'));
87
+ projectRoots.add(rootPath);
88
+ const objectDirectory = join(rootPath, 'app/src/schemas/ObjectSchemas');
89
+ await mkdir(objectDirectory, { recursive: true });
90
+ await writeFile(
91
+ join(objectDirectory, 'User.js'),
92
+ `export default { objectType: 'user', addOnDataStructure: ${hasRbac ? "[{ type: 'rbac' }]" : '[]'} };\n`
93
+ );
94
+ return rootPath;
95
+ }
96
+
97
+ async function readGeneratedFlow(rootPath, flowTag) {
98
+ const filePath = join(rootPath, 'app/src/schemas/FlowSchemas/generateCode', `${flowTag}.js`);
99
+ const module = await import(`${pathToFileURL(filePath).href}?test=${process.hrtime.bigint()}`);
100
+ return module.default;
101
+ }
@@ -0,0 +1,99 @@
1
+ import assert from 'node:assert/strict';
2
+ import { mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
3
+ import { tmpdir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import test, { after } from 'node:test';
6
+ import { pathToFileURL } from 'node:url';
7
+
8
+ import { generateDynamicRelationshipFlowSchemas } from '../src/emit/relationship/generateDynamicRelationshipFlowSchemas.js';
9
+
10
+ const RELATIONSHIP_ACTIONS = [
11
+ 'CreateRelationship',
12
+ 'UpdateRelationship',
13
+ 'DeleteRelationship',
14
+ 'GetRelationship',
15
+ 'ChangeRelationship',
16
+ 'MoveRelationship'
17
+ ];
18
+ const projectRoots = new Set();
19
+
20
+ after(async () => {
21
+ await Promise.all([...projectRoots].map(rootPath =>
22
+ rm(rootPath, { recursive: true, force: true })
23
+ ));
24
+ });
25
+
26
+ test('generates dynamic relationship schemas even without declared relationships for legacy compatibility', async () => {
27
+ const rootPath = await createProject();
28
+
29
+ const result = await generateDynamicRelationshipFlowSchemas(rootPath);
30
+
31
+ assert.deepEqual(
32
+ result.files.map(file => file.path),
33
+ RELATIONSHIP_ACTIONS.map(action => `app/src/schemas/FlowSchemas/generateCode/${action}.js`)
34
+ );
35
+
36
+ const create = await readGeneratedFlow(rootPath, 'CreateRelationship');
37
+ const get = await readGeneratedFlow(rootPath, 'GetRelationship');
38
+ assert.deepEqual(create.event, ['ownTopic']);
39
+ assert.deepEqual(create.flowSteps.map(step => step.stepName), ['start', 'Complete']);
40
+ assert.deepEqual(create.flowSteps[0].returnValues.messageAttributes, ['userId', 'correlationId']);
41
+ assert.deepEqual(get.event, ['lambdaSyncInv', 'lambdaSyncApi', 'dsq', 'ownTopic']);
42
+ assert.equal(get.outputTopic, false);
43
+ assert.equal(get.flowSteps[0].returnValues, undefined);
44
+ assert.equal(get.flowSteps.find(step => step.stepName === 'Complete'), undefined);
45
+ });
46
+
47
+ test('accepts singleton and array RelationshipSchema exports', async () => {
48
+ const singletonRoot = await createProject({ singletonExport: true });
49
+ const arrayRoot = await createProject();
50
+
51
+ assert.equal((await generateDynamicRelationshipFlowSchemas(singletonRoot)).files.length, 6);
52
+ assert.equal((await generateDynamicRelationshipFlowSchemas(arrayRoot)).files.length, 6);
53
+ });
54
+
55
+ test('reloads a changed RelationshipSchema instead of reusing the module cache', async () => {
56
+ const rootPath = await createProject();
57
+ const relationshipPath = join(rootPath, 'app/src/schemas/RelationshipSchemas/OrderCustomer.js');
58
+
59
+ await generateDynamicRelationshipFlowSchemas(rootPath);
60
+ await writeFile(relationshipPath, "export default 'not-a-schema';\n");
61
+
62
+ await assert.rejects(
63
+ generateDynamicRelationshipFlowSchemas(rootPath),
64
+ /must default-export an object or array/
65
+ );
66
+ });
67
+
68
+ test('does not allow options to override the rootPath argument', async () => {
69
+ const rootPath = await createProject();
70
+ const ignoredRootPath = await createProject();
71
+
72
+ const result = await generateDynamicRelationshipFlowSchemas(rootPath, { rootPath: ignoredRootPath });
73
+
74
+ assert.equal(result.project.rootPath, rootPath);
75
+ assert.equal(result.files.length, 6);
76
+ assert.match(
77
+ await readFile(join(rootPath, 'app/src/schemas/FlowSchemas/generateCode/CreateRelationship.js'), 'utf8'),
78
+ /export default/
79
+ );
80
+ });
81
+
82
+ async function createProject({ singletonExport = false } = {}) {
83
+ const rootPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-relationship-'));
84
+ projectRoots.add(rootPath);
85
+ const relationshipDirectory = join(rootPath, 'app/src/schemas/RelationshipSchemas');
86
+ await mkdir(relationshipDirectory, { recursive: true });
87
+ const relationship = { relationshipTag: 'orderCustomer', links: [] };
88
+ await writeFile(
89
+ join(relationshipDirectory, 'OrderCustomer.js'),
90
+ `export default ${JSON.stringify(singletonExport ? relationship : [relationship])};\n`
91
+ );
92
+ return rootPath;
93
+ }
94
+
95
+ async function readGeneratedFlow(rootPath, action) {
96
+ const filePath = join(rootPath, 'app/src/schemas/FlowSchemas/generateCode', `${action}.js`);
97
+ const module = await import(`${pathToFileURL(filePath).href}?test=${process.hrtime.bigint()}`);
98
+ return module.default;
99
+ }
@@ -0,0 +1,34 @@
1
+ import assert from 'node:assert/strict';
2
+ import test from 'node:test';
3
+
4
+ import {
5
+ renderApiFunctionYaml,
6
+ renderEventBridgeFunctionYaml,
7
+ renderInvFunctionYaml,
8
+ renderSqsFunctionYaml,
9
+ renderWbsFunctionYaml
10
+ } from '../src/emit/function/functionYamlArtifact.js';
11
+
12
+ test('renders function-setting hooks for every function transport', () => {
13
+ const functions = [
14
+ ['CreateHdrSqs', renderSqsFunctionYaml({ functionName: 'CreateHdrSqs', handlerPath: 'src/create.main', roleName: 'Role', queueName: 'CreateHdrSqs' })],
15
+ ['GetHdrApi', renderApiFunctionYaml({ functionName: 'GetHdrApi', handlerPath: 'src/get.main', roleName: 'Role', routes: [{ path: '/orders/get', upperName: 'Get' }] })],
16
+ ['CreateHdrWbs', renderWbsFunctionYaml({ functionName: 'CreateHdrWbs', handlerPath: 'src/create.main', roleName: 'Role', routeName: 'create' })],
17
+ ['GetHdrInv', renderInvFunctionYaml({ functionName: 'GetHdrInv', handlerPath: 'src/get.main', roleName: 'Role' })],
18
+ ['ScheduledHdrInv', renderEventBridgeFunctionYaml({ functionName: 'ScheduledHdrInv', handlerPath: 'src/scheduled.main', roleName: 'Role', flowTag: 'scheduled', schedules: [{ name: 'daily', rate: ['rate(1 day)'] }] })]
19
+ ];
20
+
21
+ for (const [functionName, yaml] of functions) {
22
+ assert.match(yaml, new RegExp(`#<#${functionName}FunctionSetting#>`));
23
+ assert.match(yaml, new RegExp(`#<#/${functionName}FunctionSetting#>`));
24
+ }
25
+ });
26
+
27
+ test('filters only completion SQS functions by their calling flow', () => {
28
+ const completion = renderSqsFunctionYaml({ functionName: 'CreateCompleteHdrSqs', handlerPath: 'src/create.main', roleName: 'Role', queueName: 'CreateCompleteHdrSqs' });
29
+ const ordinary = renderSqsFunctionYaml({ functionName: 'CreateHdrSqs', handlerPath: 'src/create.main', roleName: 'Role', queueName: 'CreateHdrSqs' });
30
+
31
+ assert.match(completion, /filterPatterns:[\s\S]*\$\{self:custom\.iz_resourcePrefix\}CreateCompleteHdrSqs/);
32
+ assert.match(completion, /exists: false/);
33
+ assert.doesNotMatch(ordinary, /filterPatterns:/);
34
+ });
@@ -0,0 +1,29 @@
1
+ import assert from 'node:assert/strict';
2
+ import { mkdtemp, mkdir, rm, writeFile } from 'node:fs/promises';
3
+ import os from 'node:os';
4
+ import path from 'node:path';
5
+ import test from 'node:test';
6
+
7
+ import {
8
+ generateIntTest,
9
+ generateResourceIntTest
10
+ } from '../index.js';
11
+
12
+ test('exports IntTest generators and requires a service tag', async () => {
13
+ const rootPath = await mkdtemp(path.join(os.tmpdir(), 'generate-service-code-inttest-'));
14
+ await mkdir(path.join(rootPath, 'config'));
15
+ await writeFile(path.join(rootPath, 'config', 'serverless.config.yml'), 'main_config: {}\n');
16
+
17
+ try {
18
+ await assert.rejects(
19
+ generateIntTest(rootPath),
20
+ /Missing iz_serviceTag/
21
+ );
22
+ await assert.rejects(
23
+ generateResourceIntTest(rootPath),
24
+ /Missing iz_serviceTag/
25
+ );
26
+ } finally {
27
+ await rm(rootPath, { recursive: true, force: true });
28
+ }
29
+ });
@@ -0,0 +1,209 @@
1
+ import assert from 'node:assert/strict';
2
+ import { execFileSync } from 'node:child_process';
3
+ import { mkdir, mkdtemp, readFile, writeFile } from 'node:fs/promises';
4
+ import { tmpdir } from 'node:os';
5
+ import { join } from 'node:path';
6
+ import test from 'node:test';
7
+
8
+ import * as publicApi from '../index.js';
9
+
10
+ const { generate } = publicApi;
11
+
12
+ test('public package surface exposes generation and IntTest APIs', () => {
13
+ assert.deepEqual(Object.keys(publicApi), [
14
+ 'generate',
15
+ 'generateIntTest',
16
+ 'generateResourceIntTest'
17
+ ]);
18
+ });
19
+
20
+ test('generate commits schemas, application artifacts, and resources in one public result', async () => {
21
+ const rootPath = await createCrudProject();
22
+ const result = await generate(rootPath);
23
+
24
+ assert.equal(result.files.length, 36);
25
+ assert.equal(result.project.rootPath, rootPath);
26
+ assert.match(
27
+ await readFile(join(rootPath, 'app/src/generatedCode/FlowObjects/Create/source/Create_Main.js'), 'utf8'),
28
+ /CreateMainLogical/
29
+ );
30
+ assert.match(
31
+ await readFile(join(rootPath, 'resource/sls_yaml/generatedCode/source/generated-dynamoDB-table.yml'), 'utf8'),
32
+ /Resources:/
33
+ );
34
+ });
35
+
36
+ test('generate logs its lifecycle through the supplied logger', async () => {
37
+ const rootPath = await createCrudProject();
38
+ const messages = [];
39
+ const logger = Object.fromEntries(['info', 'debug', 'error'].map(level => [level, message => messages.push(message)]));
40
+
41
+ await generate(rootPath, { logger });
42
+
43
+ assert.match(messages[0], /STATUS=STARTED/);
44
+ assert.ok(messages.some(message => /STATUS=SCHEMAS_LOADED/.test(message)));
45
+ assert.ok(messages.some(message => /STATUS=ARTIFACTS_EMITTED/.test(message)));
46
+ assert.match(messages.at(-1), /STATUS=FINISHED/);
47
+ });
48
+
49
+ test('generate commits RBAC WebSocket entries for own-topic mutation flows', async () => {
50
+ const rootPath = await createRbacProject();
51
+
52
+ const result = await generate(rootPath, { serviceTag: 'UserAccount' });
53
+
54
+ assert.ok(result.files.some(file => file.path === 'app/src/generatedCode/FlowRbac/CreateTargetRole/source/CreateTargetRole_HdrWbs.js'));
55
+ assert.match(
56
+ await readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/flow-rbac.yml'), 'utf8'),
57
+ /CreateTargetRoleHdrWbs:\n[\s\S]*websocket:/
58
+ );
59
+ });
60
+
61
+ test('generate commits the system WebSocket completion path for own-topic flows', async () => {
62
+ const rootPath = await createOwnTopicProject();
63
+ const result = await generate(rootPath);
64
+
65
+ assert.ok(result.files.some(file => file.path === 'app/src/generatedCode/SystemFlowSchemas/WebSocketMain/source/WebSocketComplete_HdrSqs.js'));
66
+ assert.ok(result.files.some(file => file.path === 'app/src/generatedCode/FlowSchemas/Track/source/Track_HdrWbs.js'));
67
+ assert.match(
68
+ await readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/flow-schema.yml'), 'utf8'),
69
+ /WebSocketConnect:[\s\S]*route: \$connect[\s\S]*WebSocketCompleteHdrSqs:/
70
+ );
71
+ assert.match(
72
+ await readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/flow-schema.yml'), 'utf8'),
73
+ /filterPatterns:[\s\S]*WebSocketCompleteHdrSqs/
74
+ );
75
+ assert.match(
76
+ await readFile(join(rootPath, 'resource/sls_yaml/generatedCode/source/generated-sns-in-sqs.yml'), 'utf8'),
77
+ /WebSocketCompleteHdrSqs:[\s\S]*SubscriptionToOutTrackWebSocketComplete:/
78
+ );
79
+ assert.match(
80
+ await readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/generate-shared-resource.yml'), 'utf8'),
81
+ /WebSocketMainRole:/
82
+ );
83
+ for (const path of [
84
+ 'app/src/generatedCode/SystemFlowSchemas/WebSocketMain/source/WebSocketConnect.js',
85
+ 'app/src/generatedCode/SystemFlowSchemas/WebSocketMain/source/WebSocketComplete_Main.js',
86
+ 'app/src/generatedCode/SystemFlowSchemas/WebSocketMain/source/WebSocketComplete_HdrSqs.js',
87
+ 'app/src/generatedCode/FlowSchemas/Track/source/Track_Main.js',
88
+ 'app/src/generatedCode/FlowSchemas/Track/source/Track_HdrSqs.js',
89
+ 'app/src/generatedCode/FlowSchemas/Track/source/Track_WbsMain.js',
90
+ 'app/src/generatedCode/FlowSchemas/Track/source/Track_HdrWbs.js'
91
+ ]) {
92
+ execFileSync(process.execPath, ['--check', join(rootPath, path)], { stdio: 'inherit' });
93
+ }
94
+ const webSocketComplete = await readFile(join(rootPath, 'app/src/generatedCode/SystemFlowSchemas/WebSocketMain/source/WebSocketComplete_Main.js'), 'utf8');
95
+ assert.match(webSocketComplete, /\(\<createIdentifiersFlow\>\)/);
96
+ assert.match(webSocketComplete, /\(\<beforePostMessage\>\)/);
97
+ const webSocketHandler = await readFile(join(rootPath, 'app/src/generatedCode/SystemFlowSchemas/WebSocketMain/source/WebSocketComplete_HdrSqs.js'), 'utf8');
98
+ assert.match(webSocketHandler, /record\.body\.TopicArn/);
99
+ assert.match(webSocketHandler, /addCallingFlowToPassOnProperties/);
100
+ });
101
+
102
+ test('generate commits the legacy trigger-cache suite with its queues', async () => {
103
+ const rootPath = await createTriggerCacheProject();
104
+ const result = await generate(rootPath);
105
+
106
+ for (const path of [
107
+ 'app/src/generatedCode/FlowSchemas/Cart/source/ProcessTriggerCacheCart_Main.js',
108
+ 'app/src/generatedCode/FlowSchemas/Cart/source/CheckTriggerCacheCartComplete_HdrSqs.js',
109
+ 'app/src/generatedCode/FlowSchemas/Cart/source/TriggerCacheCartComplete_HdrDsq.js'
110
+ ]) assert.ok(result.files.some(file => file.path === path));
111
+ assert.match(
112
+ await readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/flow-schema.yml'), 'utf8'),
113
+ /ProcessTriggerCacheCartHdrDsq:[\s\S]*TriggerCacheCartCompleteHdrDsq:/
114
+ );
115
+ assert.match(
116
+ await readFile(join(rootPath, 'resource/sls_yaml/generatedCode/source/generated-sns-in-sqs.yml'), 'utf8'),
117
+ /OrderCartMain:[\s\S]*TriggerCacheCartCompleteHdrDsq/
118
+ );
119
+ });
120
+
121
+ test('generate removes the system WebSocket path when the last own-topic flow is removed', async () => {
122
+ const rootPath = await createOwnTopicProject();
123
+ await generate(rootPath);
124
+ await writeFile(join(rootPath, 'app/src/schemas/FlowSchemas/Track.js'), "export default { flowTag: 'track', event: ['dsq'] };\n");
125
+
126
+ await generate(rootPath);
127
+
128
+ await assert.rejects(readFile(join(rootPath, 'app/src/generatedCode/SystemFlowSchemas/WebSocketMain/source/WebSocketComplete_HdrSqs.js')));
129
+ await assert.rejects(readFile(join(rootPath, 'app/src/generatedCode/FlowSchemas/Track/source/Track_HdrWbs.js')));
130
+ await assert.rejects(readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/flow-schema.yml')));
131
+ assert.doesNotMatch(
132
+ await readFile(join(rootPath, 'resource/sls_yaml/generatedCode/source/generated-sns-in-sqs.yml'), 'utf8'),
133
+ /WebSocketCompleteHdrSqs/
134
+ );
135
+ });
136
+
137
+ test('generate rolls back every slice when one output target conflicts', async () => {
138
+ const rootPath = await createCrudProject();
139
+ await mkdir(join(rootPath, 'app/sls_yaml/generatedCode/source/flow-objects.yml'), { recursive: true });
140
+
141
+ await assert.rejects(
142
+ generate(rootPath),
143
+ /not a file/
144
+ );
145
+ await assert.rejects(readFile(join(rootPath, 'app/src/schemas/FlowSchemas/generateCode/Create.js')));
146
+ });
147
+
148
+ test('generate removes stale CRUD schemas and application artifacts', async () => {
149
+ const rootPath = await createCrudProject();
150
+ await generate(rootPath);
151
+ await writeFile(
152
+ join(rootPath, 'app/src/schemas/ObjectSchemas/Order.js'),
153
+ "export default { objectType: 'order', generatedBy: 'external' };\n"
154
+ );
155
+
156
+ const result = await generate(rootPath);
157
+
158
+ assert.equal(result.files.length, 10);
159
+ await assert.rejects(readFile(join(rootPath, 'app/src/schemas/FlowSchemas/generateCode/Create.js')));
160
+ await assert.rejects(readFile(join(rootPath, 'app/src/generatedCode/FlowObjects/Create/source/Create_Main.js')));
161
+ assert.match(
162
+ await readFile(join(rootPath, 'resource/sls_yaml/generatedCode/source/generated-dynamoDB-table.yml'), 'utf8'),
163
+ /WebSocketTask/
164
+ );
165
+ });
166
+
167
+ async function createCrudProject() {
168
+ const rootPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-public-'));
169
+ const objectDirectory = join(rootPath, 'app/src/schemas/ObjectSchemas');
170
+ await mkdir(objectDirectory, { recursive: true });
171
+ await writeFile(
172
+ join(objectDirectory, 'Order.js'),
173
+ "export default { objectType: 'order', generatedBy: 'userGenerated' };\n"
174
+ );
175
+ return rootPath;
176
+ }
177
+
178
+ async function createRbacProject() {
179
+ const rootPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-public-rbac-'));
180
+ const objectDirectory = join(rootPath, 'app/src/schemas/ObjectSchemas');
181
+ await mkdir(objectDirectory, { recursive: true });
182
+ await writeFile(
183
+ join(objectDirectory, 'User.js'),
184
+ "export default { objectType: 'user', addOnDataStructure: [{ type: 'rbac' }] };\n"
185
+ );
186
+ return rootPath;
187
+ }
188
+
189
+ async function createOwnTopicProject() {
190
+ const rootPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-public-websocket-'));
191
+ const flowDirectory = join(rootPath, 'app/src/schemas/FlowSchemas');
192
+ await mkdir(flowDirectory, { recursive: true });
193
+ await writeFile(
194
+ join(flowDirectory, 'Track.js'),
195
+ "export default { flowTag: 'track', event: ['ownTopic'], outputTopic: true, statusType: 'none', generatedCodeConfig: { generatedCodeTag: 'create', codeHookTag: 'beforeLogical', invocationType: 'ownTopic' } };\n"
196
+ );
197
+ return rootPath;
198
+ }
199
+
200
+ async function createTriggerCacheProject() {
201
+ const rootPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-public-trigger-cache-'));
202
+ const flowDirectory = join(rootPath, 'app/src/schemas/FlowSchemas');
203
+ await mkdir(flowDirectory, { recursive: true });
204
+ await writeFile(
205
+ join(flowDirectory, 'Cart.js'),
206
+ "export default { flowTag: 'cart', event: ['ownTopic'], statusType: 'triggerCache', objType: { serviceTag: 'Order' } };\n"
207
+ );
208
+ return rootPath;
209
+ }