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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (256) hide show
  1. package/README.md +73 -11
  2. package/index.js +0 -5
  3. package/package.json +7 -6
  4. package/src/compile/compileProject.js +26 -0
  5. package/src/compile/loadSchemas.js +28 -0
  6. package/src/emit/crud/dynamicCrudFlowSchemaTemplate.js +11 -0
  7. package/src/emit/crud/emitCrudApplicationArtifacts.js +157 -0
  8. package/src/emit/crud/emitDynamicCrudFlowSchemas.js +84 -0
  9. package/src/emit/crud/generateCrudApplicationArtifacts.js +16 -0
  10. package/src/emit/crud/generateDynamicCrudFlowSchemas.js +21 -0
  11. package/src/emit/crud/loadLocalSchemaArrays.js +8 -0
  12. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowObjects/templates/crud → emit/crud/templates}/CreateEndpoint_Main.ejs +1 -1
  13. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowObjects/templates/crud → emit/crud/templates}/DeleteEndpoint_Main.ejs +1 -1
  14. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowObjects/templates/step → emit/crud/templates}/FlowEndpointBeforeLogical_Main.ejs +2 -2
  15. package/src/emit/crud/templates/FlowEndpointComplete_Main.ejs +75 -0
  16. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/endpoint → emit/crud/templates}/FlowEndpoint_HdrWbs.ejs +1 -1
  17. package/src/{codeGenerators/app/src/generatedCode/ProcessLogical/templates/ProcessLogical_HdrSqs.ejs → emit/crud/templates/FlowHandler_HdrSqs.ejs} +52 -56
  18. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/endpoint → emit/crud/templates}/FlowMain_Wbs.ejs +1 -3
  19. package/src/emit/crud/templates/GetRangeEndpoint_Main.ejs +127 -0
  20. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowObjects/templates/crud → emit/crud/templates}/UpdateEndpoint_Main.ejs +1 -1
  21. package/src/emit/custom/customFlows.js +70 -0
  22. package/src/emit/custom/emitCustomFlowApplicationArtifacts.js +308 -0
  23. package/src/emit/custom/generateCustomFlowApplicationArtifacts.js +22 -0
  24. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/endpoint → emit/custom/templates}/FlowEndpoint_Main.ejs +1 -1
  25. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step → emit/custom/templates}/FlowStep_Main.ejs +1 -1
  26. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/ConfirmReserved_Main.ejs +5 -5
  27. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/CreateObject_HdrWbs.ejs +1 -1
  28. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/CreateObject_Main.ejs +3 -3
  29. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/CreatePreSignUrl_Main.ejs +4 -5
  30. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/FlowHandler_HdrS3.ejs +2 -8
  31. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/ProcessS3File_Main.ejs +1 -1
  32. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/ReservedLimit_Main.ejs +5 -6
  33. package/src/emit/custom/templates/triggerCache/CheckTriggerCache_HdrSqs.ejs +32 -0
  34. package/src/emit/custom/templates/triggerCache/CheckTriggerCache_Main.ejs +63 -0
  35. package/src/emit/custom/templates/triggerCache/TriggerCacheComplete_Main.ejs +35 -0
  36. package/src/emit/custom/templates/triggerCache/TriggerCache_Main.ejs +16 -0
  37. package/src/emit/function/functionYamlArtifact.js +111 -0
  38. package/src/emit/rbac/emitDynamicRbacFlowSchemas.js +117 -0
  39. package/src/emit/rbac/emitRbacApplicationArtifacts.js +256 -0
  40. package/src/emit/rbac/generateCreateTargetRoleHandler.js +19 -0
  41. package/src/emit/rbac/generateDynamicRbacFlowSchemas.js +21 -0
  42. package/src/emit/rbac/rbacFlowTag.js +7 -0
  43. package/src/emit/rbac/templates/CreateTargetRole_HdrSqs.ejs +24 -0
  44. package/src/emit/rbac/templates/CreateTargetRole_Main.ejs +25 -0
  45. package/src/emit/rbac/templates/DynamicRbacFlowSchema.ejs +5 -0
  46. package/src/emit/rbac/templates/ListRbac_HdrApi.ejs +17 -0
  47. package/src/emit/rbac/templates/ListRbac_HdrSqs.ejs +13 -0
  48. package/src/emit/rbac/templates/ListRbac_Main.ejs +29 -0
  49. package/src/emit/rbac/templates/RbacMutation_Main.ejs +22 -0
  50. package/src/emit/rbac/templates/UserRbacFlow_HdrInv.ejs +10 -0
  51. package/src/emit/rbac/templates/UserRbacFlow_Main.ejs +44 -0
  52. package/src/emit/rbac/templates/UserRoleMutation_Main.ejs +33 -0
  53. package/src/emit/relationship/dynamicRelationshipFlowSchemaTemplate.js +11 -0
  54. package/src/emit/relationship/emitDynamicRelationshipFlowSchemas.js +66 -0
  55. package/src/emit/relationship/emitRelationshipApplicationArtifacts.js +147 -0
  56. package/src/emit/relationship/generateDynamicRelationshipFlowSchemas.js +23 -0
  57. package/src/emit/relationship/generateRelationshipApplicationArtifacts.js +22 -0
  58. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessChangeRelationshipComplete_Main.ejs → emit/relationship/templates/ChangeRelationshipComplete_Main.ejs} +1 -1
  59. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessChangeRelationship_Main.ejs → emit/relationship/templates/ChangeRelationship_Main.ejs} +10 -2
  60. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessCreateRelationshipComplete_Main.ejs → emit/relationship/templates/CreateRelationshipComplete_Main.ejs} +1 -1
  61. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessCreateRelationship_Main.ejs → emit/relationship/templates/CreateRelationship_Main.ejs} +1 -1
  62. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessDeleteRelationshipComplete_Main.ejs → emit/relationship/templates/DeleteRelationshipComplete_Main.ejs} +1 -1
  63. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessDeleteRelationship_Main.ejs → emit/relationship/templates/DeleteRelationship_Main.ejs} +1 -1
  64. package/src/emit/relationship/templates/FlowHandler_HdrApi.ejs +51 -0
  65. package/src/{codeGenerators/app/src/generatedCode/Flow/_shared/handlers → emit/relationship/templates}/FlowHandler_HdrDsq.ejs +1 -1
  66. package/src/emit/relationship/templates/FlowHandler_HdrInv.ejs +45 -0
  67. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessGetRelationshipComplete_Main.ejs → emit/relationship/templates/GetRelationshipComplete_Main.ejs} +1 -1
  68. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessGetRelationship_Main.ejs → emit/relationship/templates/GetRelationship_Main.ejs} +1 -1
  69. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessMoveRelationship_Main.ejs → emit/relationship/templates/MoveRelationship_Main.ejs} +9 -1
  70. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessUpdateRelationshipComplete_Main.ejs → emit/relationship/templates/UpdateRelationshipComplete_Main.ejs} +1 -1
  71. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessUpdateRelationship_Main.ejs → emit/relationship/templates/UpdateRelationship_Main.ejs} +1 -1
  72. package/src/emit/resource/emitResourceArtifacts.js +300 -0
  73. package/src/emit/resource/generateResourceArtifacts.js +20 -0
  74. package/src/{codeGenerators/resource/sls_yaml/templates/crud → emit/resource/templates}/ResourceBeforeLogicalYaml.ejs +1 -1
  75. package/src/{codeGenerators/resource/sls_yaml/templates/crud → emit/resource/templates}/ResourceSqsYaml.ejs +6 -6
  76. package/src/{codeGenerators/app/sls_yaml → emit/resource}/templates/SharedResource_Yaml.ejs +8 -8
  77. package/src/emit/system/emitSystemWebSocketArtifacts.js +182 -0
  78. package/src/generate.js +60 -126
  79. package/src/output/commitArtifacts.js +213 -0
  80. package/src/output/mergeHooks.js +55 -0
  81. package/src/output/validateArtifacts.js +62 -0
  82. package/src/plan/buildGenerationPlan.js +50 -0
  83. package/test/core.test.js +159 -0
  84. package/test/createTargetRoleHandler.test.js +68 -0
  85. package/test/crudApplicationArtifacts.test.js +107 -0
  86. package/test/customFlowApplicationArtifacts.test.js +294 -0
  87. package/test/dynamicCrudFlowSchemas.test.js +136 -0
  88. package/test/dynamicRbacFlowSchemas.test.js +101 -0
  89. package/test/dynamicRelationshipFlowSchemas.test.js +99 -0
  90. package/test/functionYamlArtifact.test.js +34 -0
  91. package/test/intTestApi.test.js +29 -0
  92. package/test/publicApi.test.js +209 -0
  93. package/test/relationshipApplicationArtifacts.test.js +68 -0
  94. package/test/resourceArtifacts.test.js +121 -0
  95. package/jsconfig.json +0 -9
  96. package/src/__tests__/getIntTestConfig.test.js +0 -51
  97. package/src/__tests__/intTestGeneratorShared.test.cjs +0 -169
  98. package/src/__tests__/pathIntTest.test.js +0 -103
  99. package/src/codeGenerators/app/initial_setup/InitialSetupGenerator.js +0 -199
  100. package/src/codeGenerators/app/initial_setup/templates/InitialSetup_LambdaRole.ejs +0 -50
  101. package/src/codeGenerators/app/initial_setup/templates/InitialSetup_SnsService.ejs +0 -15
  102. package/src/codeGenerators/app/initial_setup/templates/InitialSetup_TableName.ejs +0 -9
  103. package/src/codeGenerators/app/sls_yaml/FindDataYamlGenerator.js +0 -23
  104. package/src/codeGenerators/app/sls_yaml/FunctionYamlGenerator.js +0 -322
  105. package/src/codeGenerators/app/sls_yaml/ProcessLogicalYamlGenerator.js +0 -21
  106. package/src/codeGenerators/app/sls_yaml/RoleNameConfigGenerator.js +0 -48
  107. package/src/codeGenerators/app/sls_yaml/SharedResourceYamlGenerator.js +0 -504
  108. package/src/codeGenerators/app/sls_yaml/__tests__/SharedResourceYamlGenerator.test.js +0 -235
  109. package/src/codeGenerators/app/sls_yaml/_policy/PolicyEmitter.js +0 -46
  110. package/src/codeGenerators/app/sls_yaml/_policy/PolicyRegistry.js +0 -94
  111. package/src/codeGenerators/app/sls_yaml/_policy/__tests__/PolicyEmitter.test.js +0 -55
  112. package/src/codeGenerators/app/sls_yaml/_policy/__tests__/PolicyRegistry.test.js +0 -48
  113. package/src/codeGenerators/app/sls_yaml/_policy/templates/ManagedPolicy_Yaml.ejs +0 -22
  114. package/src/codeGenerators/app/sls_yaml/renderYamlTemplate.js +0 -13
  115. package/src/codeGenerators/app/sls_yaml/templates/FindData_Yaml.ejs +0 -10
  116. package/src/codeGenerators/app/sls_yaml/templates/FunctionYaml_Api.ejs +0 -21
  117. package/src/codeGenerators/app/sls_yaml/templates/FunctionYaml_EventBridge.ejs +0 -14
  118. package/src/codeGenerators/app/sls_yaml/templates/FunctionYaml_Inv.ejs +0 -6
  119. package/src/codeGenerators/app/sls_yaml/templates/FunctionYaml_Sqs.ejs +0 -11
  120. package/src/codeGenerators/app/sls_yaml/templates/FunctionYaml_Wbs.ejs +0 -11
  121. package/src/codeGenerators/app/sls_yaml/templates/ProcessLogical_Yaml.ejs +0 -32
  122. package/src/codeGenerators/app/sls_yaml/templates/RoleNameConfig_Yaml.ejs +0 -5
  123. package/src/codeGenerators/app/src/generatedCode/FindData/FindDataGenerator.js +0 -238
  124. package/src/codeGenerators/app/src/generatedCode/FindData/templates/FindData_HdrSqs.ejs +0 -87
  125. package/src/codeGenerators/app/src/generatedCode/FindData/templates/FindData_Main.ejs +0 -108
  126. package/src/codeGenerators/app/src/generatedCode/FindData/templates/GetByStorage/getByDynamo.ejs +0 -32
  127. package/src/codeGenerators/app/src/generatedCode/FindData/templates/GetByStorage/getByGraph.ejs +0 -87
  128. package/src/codeGenerators/app/src/generatedCode/Flow/FlowObjects/.gitkeep +0 -0
  129. package/src/codeGenerators/app/src/generatedCode/Flow/FlowObjects/EndpointsGenerator.js +0 -120
  130. package/src/codeGenerators/app/src/generatedCode/Flow/FlowObjects/templates/step/FlowEndpointComplete_Main.ejs +0 -313
  131. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/RbacFlowGenerator.js +0 -116
  132. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/CreateRolePermissions.ejs +0 -135
  133. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/CreateTargetRole.ejs +0 -131
  134. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/CreateUserRole.ejs +0 -150
  135. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/DeleteRolePermissions.ejs +0 -132
  136. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/DeleteTargetRole.ejs +0 -132
  137. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/DeleteUserFromRole.ejs +0 -150
  138. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/FlowRbac_Main.ejs +0 -252
  139. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/ListRolePermissions.ejs +0 -120
  140. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/ListTargetRole.ejs +0 -122
  141. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/ListUserInRoles.ejs +0 -117
  142. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRelationships/RelationshipFlowGenerator.js +0 -148
  143. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/.gitkeep +0 -0
  144. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/StatusFieldGenerator.js +0 -109
  145. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/WebSocketGenerator.js +0 -122
  146. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/endpoint/FlowEntryPoint_Main.ejs +0 -38
  147. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/statusField/CompleteStatusFieldSns_Yaml.ejs +0 -52
  148. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/statusField/CompleteStatusField_HdrSqs.ejs +0 -84
  149. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/statusField/CompleteStatusField_Main.ejs +0 -78
  150. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/FlowStep_ByConfig_Awaiting_Main.ejs +0 -123
  151. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/FlowStep_ByConfig_Paginated_Main.ejs +0 -59
  152. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/FlowStep_PlugIn_Main.ejs +0 -72
  153. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/FlowStep_RecievePlugIn_Main.ejs +0 -76
  154. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/templateAwaitingStep.ejs +0 -41
  155. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/templateSendPlugin.ejs +0 -18
  156. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/ProcessWebSocketFlow_Yaml.ejs +0 -26
  157. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/ProcessWebSocketSub_Yaml.ejs +0 -7
  158. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/ProcessWebSocket_HdrSqs.ejs +0 -66
  159. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/ProcessWebSocket_Main.ejs +0 -115
  160. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/ProcessWebSocket_Yaml.ejs +0 -36
  161. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/WebSocketConnect_Main.ejs +0 -52
  162. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/WebSocketConnect_Yaml.ejs +0 -13
  163. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/WebSocketDynamoDb_Yaml.ejs +0 -28
  164. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/BaseDsqHandler.js +0 -55
  165. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/BaseSqsHandler.js +0 -66
  166. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/__tests__/BaseDsqHandler.test.js +0 -93
  167. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/dsq.js +0 -5
  168. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/eventBridge.js +0 -25
  169. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/extTopic.js +0 -6
  170. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/lambdaSyncApi.js +0 -43
  171. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/lambdaSyncInv.js +0 -43
  172. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/ownTopic.js +0 -54
  173. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/registry.js +0 -17
  174. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3.js +0 -56
  175. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3Components/ConfirmAfterUploadS3Generator.js +0 -46
  176. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3Components/CreateObjectGenerator.js +0 -50
  177. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3Components/CreatePreSignUrlGenerator.js +0 -48
  178. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3Components/ProcessAfterUploadS3Generator.js +0 -49
  179. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3Components/ReservedLimitGenerator.js +0 -47
  180. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/eventTypes.js +0 -23
  181. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowClassifier.js +0 -50
  182. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowEntryPointBase.js +0 -106
  183. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowMainFunctionBase.js +0 -172
  184. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowNaming.js +0 -37
  185. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowSelection.js +0 -19
  186. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowStepBase.js +0 -235
  187. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowStepNormalizer.js +0 -75
  188. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowValidator.js +0 -236
  189. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/propertyNormalizer.js +0 -15
  190. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/registry.js +0 -7
  191. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/roleNameDetection.js +0 -49
  192. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/triggerCacheBase.js +0 -177
  193. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/CheckTriggerCache_HdrSqs.ejs +0 -89
  194. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/CheckTriggerCache_Main.ejs +0 -83
  195. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/ProcessTriggerCache_HdrSqs.ejs +0 -103
  196. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/ProcessTriggerCache_Main.ejs +0 -58
  197. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/TriggerCacheComplete_HdrDsq.ejs +0 -104
  198. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/TriggerCacheComplete_HdrSqs.ejs +0 -88
  199. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/TriggerCacheComplete_Main.ejs +0 -80
  200. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/TriggerCacheQueue_Yaml.ejs +0 -36
  201. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/yaml/SharedFunctionSqs_Yaml.ejs +0 -13
  202. package/src/codeGenerators/app/src/generatedCode/ProcessLogical/ProcessLogicalGenerator.js +0 -29
  203. package/src/codeGenerators/app/src/generatedCode/ProcessLogical/templates/PaginateProcessLogical_HdrDsq.ejs +0 -177
  204. package/src/codeGenerators/app/src/generatedCode/ProcessLogical/templates/PaginateProcessLogical_HdrSqs.ejs +0 -155
  205. package/src/codeGenerators/app/src/generatedCode/ProcessLogical/templates/PaginateProcessLogical_Main.ejs +0 -268
  206. package/src/codeGenerators/app/src/generatedCode/ProcessLogical/templates/ProcessLogical_Main.ejs +0 -450
  207. package/src/codeGenerators/app/src/generatedCode/SystemFlowSchemas/RegisterGenerator.js +0 -149
  208. package/src/codeGenerators/app/src/generatedCode/SystemFlowSchemas/templates/register/RegisterComplete_HdrSqs.ejs +0 -85
  209. package/src/codeGenerators/app/src/generatedCode/SystemFlowSchemas/templates/register/RegisterComplete_Main.ejs +0 -176
  210. package/src/codeGenerators/app/src/generatedCode/SystemFlowSchemas/templates/register/Register_HdrWbs.ejs +0 -80
  211. package/src/codeGenerators/app/src/generatedCode/SystemFlowSchemas/templates/register/Register_Main.ejs +0 -164
  212. package/src/codeGenerators/app/src/generatedCode/libs/ConstsGenerator.js +0 -28
  213. package/src/codeGenerators/app/src/generatedCode/libs/GenerateCodeLibsGenerator.js +0 -28
  214. package/src/codeGenerators/app/src/generatedCode/libs/templates/Consts.ejs +0 -448
  215. package/src/codeGenerators/app/src/generatedCode/libs/templates/GenerateCodeLibs.ejs +0 -124
  216. package/src/codeGenerators/resource/sls_yaml/DynamoDBGenerator.js +0 -87
  217. package/src/codeGenerators/resource/sls_yaml/FlowOutGenerator.js +0 -70
  218. package/src/codeGenerators/resource/sls_yaml/FlowResourceYamlGenerator.js +0 -182
  219. package/src/core/renderTemplateFile.js +0 -22
  220. package/src/core/validate.js +0 -165
  221. package/src/generateCode.js +0 -358
  222. package/src/generateSchema.js +0 -123
  223. package/src/parsers/flowSchemaParser.js +0 -112
  224. package/src/parsers/objectSchemaParser.js +0 -39
  225. package/src/parsers/relationshipSchemaParser.js +0 -51
  226. package/src/schemaGenerators/app/src/schemas/FlowSchemas/FlowSchemaGenerator.js +0 -107
  227. package/src/schemaGenerators/app/src/schemas/FlowSchemas/RbacFlowSchemaGenerator.js +0 -98
  228. package/src/schemaGenerators/app/src/schemas/FlowSchemas/RelationshipFlowSchemaGenerator.js +0 -89
  229. package/src/schemaGenerators/app/src/schemas/FlowSchemas/templates/DynamicFlowSchemaTemplate.ejs +0 -41
  230. package/src/schemaGenerators/app/src/schemas/FlowSchemas/templates/DynamicRbacFlowSchemaTemplate.ejs +0 -20
  231. package/src/schemaGenerators/app/src/schemas/FlowSchemas/templates/RelationshipFlowSchemaTemplate.ejs +0 -33
  232. package/src/schemaGenerators/app/src/schemas/FlowSchemas/templates/UserRbacFlowSchemaTemplate.ejs +0 -22
  233. package/src/schemaGenerators/app/src/schemas/ObjectSchemas/AttributeTreeSchemaGenerator.js +0 -124
  234. package/src/schemaGenerators/app/src/schemas/ObjectSchemas/PropertyValueSchemaGenerator.js +0 -119
  235. package/src/schemaGenerators/app/src/schemas/ObjectSchemas/templates/DynamicAttributeTreeManagerSchemaTemplate.ejs +0 -14
  236. package/src/schemaGenerators/app/src/schemas/ObjectSchemas/templates/DynamicAttributeTreeStandardSchemaTemplate.ejs +0 -13
  237. package/src/schemaGenerators/app/src/schemas/ObjectSchemas/templates/DynamicPropertyValueSchemaTemplate.ejs +0 -15
  238. package/src/schemaGenerators/app/src/schemas/RelationshipSchemas/AttributeTreeRelationshipSchemaGenerator.js +0 -149
  239. package/src/schemaGenerators/app/src/schemas/RelationshipSchemas/PropertyValueRelationshipSchemaGenerator.js +0 -143
  240. package/src/schemaGenerators/app/src/schemas/RelationshipSchemas/templates/DynamicAttributeTreeRelationshipSchemaTemplate.ejs +0 -7
  241. package/src/schemaGenerators/app/src/schemas/RelationshipSchemas/templates/DynamicPropertyValueRelationshipSchemaTemplate.ejs +0 -7
  242. package/src/schemaGenerators/app/src/schemas/SystemTextSchemas/SystemTextGenerator.js +0 -102
  243. package/src/schemaGenerators/app/src/schemas/SystemTextSchemas/templates/SystemText_Template.ejs +0 -10
  244. package/test_schema.js +0 -2
  245. /package/src/{codeGenerators/app/src/generatedCode/Flow/_shared/handlers → emit/crud/templates}/FlowHandler_HdrApi.ejs +0 -0
  246. /package/src/{codeGenerators/app/src/generatedCode/Flow/_shared/handlers → emit/crud/templates}/FlowHandler_HdrInv.ejs +0 -0
  247. /package/src/{codeGenerators/app/src/generatedCode/Flow/FlowObjects/templates/crud → emit/crud/templates}/GetEndpoint_Main.ejs +0 -0
  248. /package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/ConfirmReserved_HdrSqs.ejs +0 -0
  249. /package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/CreatePreSignUrl_HdrSqs.ejs +0 -0
  250. /package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/ReservedLimit_HdrSqs.ejs +0 -0
  251. /package/src/{codeGenerators/app/src/generatedCode/Flow/_shared/handlers → emit/relationship/templates}/FlowHandler_HdrSqs.ejs +0 -0
  252. /package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessMoveRelationshipComplete_Main.ejs → emit/relationship/templates/MoveRelationshipComplete_Main.ejs} +0 -0
  253. /package/src/{codeGenerators/resource/sls_yaml → emit/resource}/templates/DynamoDBTable_Yaml.ejs +0 -0
  254. /package/src/{codeGenerators/resource/sls_yaml → emit/resource}/templates/FlowOut_Yaml.ejs +0 -0
  255. /package/src/{codeGenerators/resource/sls_yaml/templates/crud → emit/resource/templates}/ResourceYaml.ejs +0 -0
  256. /package/src/{codeGenerators/resource/sls_yaml → emit/resource}/templates/SystemDynamoDB_Yaml.ejs +0 -0
@@ -0,0 +1,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
+ }