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

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 (257) hide show
  1. package/README.md +73 -11
  2. package/docs/TriggeredCache Flow.drawio +193 -0
  3. package/docs/test.mmd +47 -0
  4. package/docs/test.png +0 -0
  5. package/index.js +0 -5
  6. package/package.json +7 -6
  7. package/src/compile/compileProject.js +26 -0
  8. package/src/compile/loadSchemas.js +50 -0
  9. package/src/emit/crud/dynamicCrudFlowSchemaTemplate.js +11 -0
  10. package/src/emit/crud/emitCrudApplicationArtifacts.js +161 -0
  11. package/src/emit/crud/emitDynamicCrudFlowSchemas.js +84 -0
  12. package/src/emit/crud/generateCrudApplicationArtifacts.js +16 -0
  13. package/src/emit/crud/generateDynamicCrudFlowSchemas.js +21 -0
  14. package/src/emit/crud/loadLocalSchemaArrays.js +8 -0
  15. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowObjects/templates/crud → emit/crud/templates}/CreateEndpoint_Main.ejs +6 -6
  16. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowObjects/templates/crud → emit/crud/templates}/DeleteEndpoint_Main.ejs +6 -6
  17. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowObjects/templates/step → emit/crud/templates}/FlowEndpointBeforeLogical_Main.ejs +2 -2
  18. package/src/emit/crud/templates/FlowEndpointComplete_Main.ejs +96 -0
  19. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/endpoint → emit/crud/templates}/FlowEndpoint_HdrWbs.ejs +1 -1
  20. package/src/emit/crud/templates/FlowHandler_HdrApi.ejs +69 -0
  21. package/src/{codeGenerators/app/src/generatedCode/ProcessLogical/templates/ProcessLogical_HdrSqs.ejs → emit/crud/templates/FlowHandler_HdrSqs.ejs} +52 -56
  22. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/endpoint → emit/crud/templates}/FlowMain_Wbs.ejs +1 -3
  23. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowObjects/templates/crud → emit/crud/templates}/GetEndpoint_Main.ejs +2 -2
  24. package/src/emit/crud/templates/GetRangeEndpoint_Main.ejs +127 -0
  25. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowObjects/templates/crud → emit/crud/templates}/UpdateEndpoint_Main.ejs +11 -9
  26. package/src/emit/custom/customFlows.js +121 -0
  27. package/src/emit/custom/emitCustomFlowApplicationArtifacts.js +325 -0
  28. package/src/emit/custom/generateCustomFlowApplicationArtifacts.js +22 -0
  29. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/endpoint → emit/custom/templates}/FlowEndpoint_Main.ejs +5 -5
  30. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step → emit/custom/templates}/FlowStep_Main.ejs +1 -1
  31. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/ConfirmReserved_Main.ejs +5 -5
  32. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/CreateObject_HdrWbs.ejs +1 -1
  33. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/CreateObject_Main.ejs +3 -3
  34. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/CreatePreSignUrl_Main.ejs +4 -5
  35. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/FlowHandler_HdrS3.ejs +2 -8
  36. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/ProcessS3File_Main.ejs +1 -1
  37. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/ReservedLimit_Main.ejs +5 -6
  38. package/src/emit/custom/templates/triggerCache/CheckTriggerCache_HdrSqs.ejs +32 -0
  39. package/src/emit/custom/templates/triggerCache/CheckTriggerCache_Main.ejs +63 -0
  40. package/src/emit/custom/templates/triggerCache/TriggerCacheComplete_Main.ejs +35 -0
  41. package/src/emit/custom/templates/triggerCache/TriggerCache_Main.ejs +16 -0
  42. package/src/emit/function/functionYamlArtifact.js +125 -0
  43. package/src/emit/rbac/emitDynamicRbacFlowSchemas.js +117 -0
  44. package/src/emit/rbac/emitRbacApplicationArtifacts.js +270 -0
  45. package/src/emit/rbac/generateCreateTargetRoleHandler.js +19 -0
  46. package/src/emit/rbac/generateDynamicRbacFlowSchemas.js +21 -0
  47. package/src/emit/rbac/rbacFlowTag.js +7 -0
  48. package/src/emit/rbac/templates/CreateTargetRole_HdrSqs.ejs +24 -0
  49. package/src/emit/rbac/templates/CreateTargetRole_Main.ejs +25 -0
  50. package/src/emit/rbac/templates/DynamicRbacFlowSchema.ejs +5 -0
  51. package/src/emit/rbac/templates/ListRbac_HdrApi.ejs +17 -0
  52. package/src/emit/rbac/templates/ListRbac_HdrSqs.ejs +13 -0
  53. package/src/emit/rbac/templates/ListRbac_Main.ejs +29 -0
  54. package/src/emit/rbac/templates/RbacMutation_Main.ejs +22 -0
  55. package/src/emit/rbac/templates/UserRbacFlow_HdrInv.ejs +10 -0
  56. package/src/emit/rbac/templates/UserRbacFlow_Main.ejs +44 -0
  57. package/src/emit/rbac/templates/UserRoleMutation_Main.ejs +33 -0
  58. package/src/emit/relationship/dynamicRelationshipFlowSchemaTemplate.js +11 -0
  59. package/src/emit/relationship/emitDynamicRelationshipFlowSchemas.js +66 -0
  60. package/src/emit/relationship/emitRelationshipApplicationArtifacts.js +148 -0
  61. package/src/emit/relationship/generateDynamicRelationshipFlowSchemas.js +23 -0
  62. package/src/emit/relationship/generateRelationshipApplicationArtifacts.js +22 -0
  63. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessChangeRelationshipComplete_Main.ejs → emit/relationship/templates/ChangeRelationshipComplete_Main.ejs} +1 -1
  64. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessChangeRelationship_Main.ejs → emit/relationship/templates/ChangeRelationship_Main.ejs} +12 -4
  65. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessCreateRelationshipComplete_Main.ejs → emit/relationship/templates/CreateRelationshipComplete_Main.ejs} +1 -1
  66. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessCreateRelationship_Main.ejs → emit/relationship/templates/CreateRelationship_Main.ejs} +1 -1
  67. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessDeleteRelationshipComplete_Main.ejs → emit/relationship/templates/DeleteRelationshipComplete_Main.ejs} +1 -1
  68. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessDeleteRelationship_Main.ejs → emit/relationship/templates/DeleteRelationship_Main.ejs} +1 -1
  69. package/src/{codeGenerators/app/src/generatedCode/Flow/_shared/handlers → emit/relationship/templates}/FlowHandler_HdrDsq.ejs +1 -1
  70. package/src/emit/relationship/templates/FlowHandler_HdrInv.ejs +45 -0
  71. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessGetRelationshipComplete_Main.ejs → emit/relationship/templates/GetRelationshipComplete_Main.ejs} +1 -1
  72. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessGetRelationship_Main.ejs → emit/relationship/templates/GetRelationship_Main.ejs} +1 -1
  73. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessMoveRelationship_Main.ejs → emit/relationship/templates/MoveRelationship_Main.ejs} +9 -1
  74. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessUpdateRelationshipComplete_Main.ejs → emit/relationship/templates/UpdateRelationshipComplete_Main.ejs} +1 -1
  75. package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessUpdateRelationship_Main.ejs → emit/relationship/templates/UpdateRelationship_Main.ejs} +1 -1
  76. package/src/emit/resource/emitResourceArtifacts.js +595 -0
  77. package/src/emit/resource/generateResourceArtifacts.js +20 -0
  78. package/src/{codeGenerators/resource/sls_yaml/templates/crud → emit/resource/templates}/ResourceBeforeLogicalYaml.ejs +1 -1
  79. package/src/{codeGenerators/resource/sls_yaml/templates/crud → emit/resource/templates}/ResourceSqsYaml.ejs +6 -6
  80. package/src/{codeGenerators/app/sls_yaml → emit/resource}/templates/SharedResource_Yaml.ejs +8 -8
  81. package/src/emit/system/emitSystemWebSocketArtifacts.js +183 -0
  82. package/src/generate.js +60 -126
  83. package/src/output/commitArtifacts.js +213 -0
  84. package/src/output/mergeHooks.js +55 -0
  85. package/src/output/validateArtifacts.js +62 -0
  86. package/src/plan/buildGenerationPlan.js +50 -0
  87. package/test/core.test.js +159 -0
  88. package/test/createTargetRoleHandler.test.js +68 -0
  89. package/test/crudApplicationArtifacts.test.js +107 -0
  90. package/test/customFlowApplicationArtifacts.test.js +297 -0
  91. package/test/dynamicCrudFlowSchemas.test.js +136 -0
  92. package/test/dynamicRbacFlowSchemas.test.js +101 -0
  93. package/test/dynamicRelationshipFlowSchemas.test.js +99 -0
  94. package/test/functionYamlArtifact.test.js +34 -0
  95. package/test/intTestApi.test.js +29 -0
  96. package/test/publicApi.test.js +209 -0
  97. package/test/relationshipApplicationArtifacts.test.js +68 -0
  98. package/test/resourceArtifacts.test.js +121 -0
  99. package/jsconfig.json +0 -9
  100. package/src/__tests__/getIntTestConfig.test.js +0 -51
  101. package/src/__tests__/intTestGeneratorShared.test.cjs +0 -169
  102. package/src/__tests__/pathIntTest.test.js +0 -103
  103. package/src/codeGenerators/app/initial_setup/InitialSetupGenerator.js +0 -199
  104. package/src/codeGenerators/app/initial_setup/templates/InitialSetup_LambdaRole.ejs +0 -50
  105. package/src/codeGenerators/app/initial_setup/templates/InitialSetup_SnsService.ejs +0 -15
  106. package/src/codeGenerators/app/initial_setup/templates/InitialSetup_TableName.ejs +0 -9
  107. package/src/codeGenerators/app/sls_yaml/FindDataYamlGenerator.js +0 -23
  108. package/src/codeGenerators/app/sls_yaml/FunctionYamlGenerator.js +0 -332
  109. package/src/codeGenerators/app/sls_yaml/ProcessLogicalYamlGenerator.js +0 -21
  110. package/src/codeGenerators/app/sls_yaml/RoleNameConfigGenerator.js +0 -48
  111. package/src/codeGenerators/app/sls_yaml/SharedResourceYamlGenerator.js +0 -503
  112. package/src/codeGenerators/app/sls_yaml/__tests__/SharedResourceYamlGenerator.test.js +0 -235
  113. package/src/codeGenerators/app/sls_yaml/_policy/PolicyRegistry.js +0 -56
  114. package/src/codeGenerators/app/sls_yaml/_policy/__tests__/PolicyRegistry.test.js +0 -33
  115. package/src/codeGenerators/app/sls_yaml/renderYamlTemplate.js +0 -13
  116. package/src/codeGenerators/app/sls_yaml/templates/FindData_Yaml.ejs +0 -10
  117. package/src/codeGenerators/app/sls_yaml/templates/FunctionYaml_Api.ejs +0 -21
  118. package/src/codeGenerators/app/sls_yaml/templates/FunctionYaml_EventBridge.ejs +0 -14
  119. package/src/codeGenerators/app/sls_yaml/templates/FunctionYaml_Inv.ejs +0 -6
  120. package/src/codeGenerators/app/sls_yaml/templates/FunctionYaml_Sqs.ejs +0 -11
  121. package/src/codeGenerators/app/sls_yaml/templates/FunctionYaml_Wbs.ejs +0 -11
  122. package/src/codeGenerators/app/sls_yaml/templates/ProcessLogical_Yaml.ejs +0 -32
  123. package/src/codeGenerators/app/sls_yaml/templates/RoleNameConfig_Yaml.ejs +0 -5
  124. package/src/codeGenerators/app/src/generatedCode/FindData/FindDataGenerator.js +0 -238
  125. package/src/codeGenerators/app/src/generatedCode/FindData/templates/FindData_HdrSqs.ejs +0 -87
  126. package/src/codeGenerators/app/src/generatedCode/FindData/templates/FindData_Main.ejs +0 -108
  127. package/src/codeGenerators/app/src/generatedCode/FindData/templates/GetByStorage/getByDynamo.ejs +0 -32
  128. package/src/codeGenerators/app/src/generatedCode/FindData/templates/GetByStorage/getByGraph.ejs +0 -87
  129. package/src/codeGenerators/app/src/generatedCode/Flow/FlowObjects/.gitkeep +0 -0
  130. package/src/codeGenerators/app/src/generatedCode/Flow/FlowObjects/EndpointsGenerator.js +0 -120
  131. package/src/codeGenerators/app/src/generatedCode/Flow/FlowObjects/templates/step/FlowEndpointComplete_Main.ejs +0 -313
  132. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/RbacFlowGenerator.js +0 -116
  133. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/CreateRolePermissions.ejs +0 -135
  134. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/CreateTargetRole.ejs +0 -131
  135. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/CreateUserRole.ejs +0 -150
  136. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/DeleteRolePermissions.ejs +0 -132
  137. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/DeleteTargetRole.ejs +0 -132
  138. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/DeleteUserFromRole.ejs +0 -150
  139. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/FlowRbac_Main.ejs +0 -252
  140. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/ListRolePermissions.ejs +0 -120
  141. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/ListTargetRole.ejs +0 -122
  142. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/ListUserInRoles.ejs +0 -117
  143. package/src/codeGenerators/app/src/generatedCode/Flow/FlowRelationships/RelationshipFlowGenerator.js +0 -148
  144. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/.gitkeep +0 -0
  145. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/StatusFieldGenerator.js +0 -109
  146. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/WebSocketGenerator.js +0 -122
  147. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/endpoint/FlowEntryPoint_Main.ejs +0 -38
  148. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/statusField/CompleteStatusFieldSns_Yaml.ejs +0 -52
  149. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/statusField/CompleteStatusField_HdrSqs.ejs +0 -84
  150. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/statusField/CompleteStatusField_Main.ejs +0 -78
  151. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/FlowStep_ByConfig_Awaiting_Main.ejs +0 -123
  152. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/FlowStep_ByConfig_Paginated_Main.ejs +0 -59
  153. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/FlowStep_PlugIn_Main.ejs +0 -72
  154. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/FlowStep_RecievePlugIn_Main.ejs +0 -76
  155. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/templateAwaitingStep.ejs +0 -41
  156. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/templateSendPlugin.ejs +0 -18
  157. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/ProcessWebSocketFlow_Yaml.ejs +0 -26
  158. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/ProcessWebSocketSub_Yaml.ejs +0 -7
  159. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/ProcessWebSocket_HdrSqs.ejs +0 -66
  160. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/ProcessWebSocket_Main.ejs +0 -115
  161. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/ProcessWebSocket_Yaml.ejs +0 -36
  162. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/WebSocketConnect_Main.ejs +0 -52
  163. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/WebSocketConnect_Yaml.ejs +0 -13
  164. package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/WebSocketDynamoDb_Yaml.ejs +0 -28
  165. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/BaseDsqHandler.js +0 -63
  166. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/BaseSqsHandler.js +0 -66
  167. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/__tests__/BaseDsqHandler.test.js +0 -94
  168. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/dsq.js +0 -5
  169. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/eventBridge.js +0 -33
  170. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/extTopic.js +0 -6
  171. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/lambdaSyncApi.js +0 -51
  172. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/lambdaSyncInv.js +0 -51
  173. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/ownTopic.js +0 -54
  174. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/registry.js +0 -17
  175. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3.js +0 -56
  176. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3Components/ConfirmAfterUploadS3Generator.js +0 -46
  177. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3Components/CreateObjectGenerator.js +0 -50
  178. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3Components/CreatePreSignUrlGenerator.js +0 -48
  179. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3Components/ProcessAfterUploadS3Generator.js +0 -49
  180. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3Components/ReservedLimitGenerator.js +0 -47
  181. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/eventTypes.js +0 -23
  182. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowClassifier.js +0 -50
  183. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowEntryPointBase.js +0 -106
  184. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowMainFunctionBase.js +0 -172
  185. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowNaming.js +0 -37
  186. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowSelection.js +0 -19
  187. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowStepBase.js +0 -235
  188. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowStepNormalizer.js +0 -75
  189. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowValidator.js +0 -267
  190. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/propertyNormalizer.js +0 -18
  191. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/registry.js +0 -7
  192. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/roleNameDetection.js +0 -49
  193. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/triggerCacheBase.js +0 -177
  194. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/CheckTriggerCache_HdrSqs.ejs +0 -89
  195. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/CheckTriggerCache_Main.ejs +0 -83
  196. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/ProcessTriggerCache_HdrSqs.ejs +0 -103
  197. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/ProcessTriggerCache_Main.ejs +0 -58
  198. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/TriggerCacheComplete_HdrDsq.ejs +0 -104
  199. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/TriggerCacheComplete_HdrSqs.ejs +0 -88
  200. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/TriggerCacheComplete_Main.ejs +0 -80
  201. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/TriggerCacheQueue_Yaml.ejs +0 -36
  202. package/src/codeGenerators/app/src/generatedCode/Flow/_shared/yaml/SharedFunctionSqs_Yaml.ejs +0 -13
  203. package/src/codeGenerators/app/src/generatedCode/ProcessLogical/ProcessLogicalGenerator.js +0 -29
  204. package/src/codeGenerators/app/src/generatedCode/ProcessLogical/templates/PaginateProcessLogical_HdrDsq.ejs +0 -177
  205. package/src/codeGenerators/app/src/generatedCode/ProcessLogical/templates/PaginateProcessLogical_HdrSqs.ejs +0 -155
  206. package/src/codeGenerators/app/src/generatedCode/ProcessLogical/templates/PaginateProcessLogical_Main.ejs +0 -268
  207. package/src/codeGenerators/app/src/generatedCode/ProcessLogical/templates/ProcessLogical_Main.ejs +0 -450
  208. package/src/codeGenerators/app/src/generatedCode/SystemFlowSchemas/RegisterGenerator.js +0 -149
  209. package/src/codeGenerators/app/src/generatedCode/SystemFlowSchemas/templates/register/RegisterComplete_HdrSqs.ejs +0 -85
  210. package/src/codeGenerators/app/src/generatedCode/SystemFlowSchemas/templates/register/RegisterComplete_Main.ejs +0 -176
  211. package/src/codeGenerators/app/src/generatedCode/SystemFlowSchemas/templates/register/Register_HdrWbs.ejs +0 -80
  212. package/src/codeGenerators/app/src/generatedCode/SystemFlowSchemas/templates/register/Register_Main.ejs +0 -164
  213. package/src/codeGenerators/app/src/generatedCode/libs/ConstsGenerator.js +0 -28
  214. package/src/codeGenerators/app/src/generatedCode/libs/GenerateCodeLibsGenerator.js +0 -28
  215. package/src/codeGenerators/app/src/generatedCode/libs/templates/Consts.ejs +0 -448
  216. package/src/codeGenerators/app/src/generatedCode/libs/templates/GenerateCodeLibs.ejs +0 -124
  217. package/src/codeGenerators/resource/sls_yaml/DynamoDBGenerator.js +0 -87
  218. package/src/codeGenerators/resource/sls_yaml/FlowOutGenerator.js +0 -70
  219. package/src/codeGenerators/resource/sls_yaml/FlowResourceYamlGenerator.js +0 -182
  220. package/src/core/renderTemplateFile.js +0 -22
  221. package/src/core/validate.js +0 -165
  222. package/src/generateCode.js +0 -357
  223. package/src/generateSchema.js +0 -123
  224. package/src/parsers/flowSchemaParser.js +0 -112
  225. package/src/parsers/objectSchemaParser.js +0 -39
  226. package/src/parsers/relationshipSchemaParser.js +0 -51
  227. package/src/schemaGenerators/app/src/schemas/FlowSchemas/FlowSchemaGenerator.js +0 -107
  228. package/src/schemaGenerators/app/src/schemas/FlowSchemas/RbacFlowSchemaGenerator.js +0 -98
  229. package/src/schemaGenerators/app/src/schemas/FlowSchemas/RelationshipFlowSchemaGenerator.js +0 -89
  230. package/src/schemaGenerators/app/src/schemas/FlowSchemas/templates/DynamicFlowSchemaTemplate.ejs +0 -41
  231. package/src/schemaGenerators/app/src/schemas/FlowSchemas/templates/DynamicRbacFlowSchemaTemplate.ejs +0 -20
  232. package/src/schemaGenerators/app/src/schemas/FlowSchemas/templates/RelationshipFlowSchemaTemplate.ejs +0 -33
  233. package/src/schemaGenerators/app/src/schemas/FlowSchemas/templates/UserRbacFlowSchemaTemplate.ejs +0 -22
  234. package/src/schemaGenerators/app/src/schemas/ObjectSchemas/AttributeTreeSchemaGenerator.js +0 -124
  235. package/src/schemaGenerators/app/src/schemas/ObjectSchemas/PropertyValueSchemaGenerator.js +0 -119
  236. package/src/schemaGenerators/app/src/schemas/ObjectSchemas/templates/DynamicAttributeTreeManagerSchemaTemplate.ejs +0 -14
  237. package/src/schemaGenerators/app/src/schemas/ObjectSchemas/templates/DynamicAttributeTreeStandardSchemaTemplate.ejs +0 -13
  238. package/src/schemaGenerators/app/src/schemas/ObjectSchemas/templates/DynamicPropertyValueSchemaTemplate.ejs +0 -15
  239. package/src/schemaGenerators/app/src/schemas/RelationshipSchemas/AttributeTreeRelationshipSchemaGenerator.js +0 -109
  240. package/src/schemaGenerators/app/src/schemas/RelationshipSchemas/PropertyValueRelationshipSchemaGenerator.js +0 -103
  241. package/src/schemaGenerators/app/src/schemas/RelationshipSchemas/__tests__/relationshipSchemaHelpers.test.js +0 -38
  242. package/src/schemaGenerators/app/src/schemas/RelationshipSchemas/relationshipSchemaHelpers.js +0 -40
  243. package/src/schemaGenerators/app/src/schemas/RelationshipSchemas/templates/DynamicAttributeTreeRelationshipSchemaTemplate.ejs +0 -7
  244. package/src/schemaGenerators/app/src/schemas/RelationshipSchemas/templates/DynamicPropertyValueRelationshipSchemaTemplate.ejs +0 -7
  245. package/src/schemaGenerators/app/src/schemas/SystemTextSchemas/SystemTextGenerator.js +0 -102
  246. package/src/schemaGenerators/app/src/schemas/SystemTextSchemas/templates/SystemText_Template.ejs +0 -10
  247. /package/src/{codeGenerators/app/src/generatedCode/Flow/_shared/handlers → emit/crud/templates}/FlowHandler_HdrInv.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_HdrApi.ejs +0 -0
  252. /package/src/{codeGenerators/app/src/generatedCode/Flow/_shared/handlers → emit/relationship/templates}/FlowHandler_HdrSqs.ejs +0 -0
  253. /package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessMoveRelationshipComplete_Main.ejs → emit/relationship/templates/MoveRelationshipComplete_Main.ejs} +0 -0
  254. /package/src/{codeGenerators/resource/sls_yaml → emit/resource}/templates/DynamoDBTable_Yaml.ejs +0 -0
  255. /package/src/{codeGenerators/resource/sls_yaml → emit/resource}/templates/FlowOut_Yaml.ejs +0 -0
  256. /package/src/{codeGenerators/resource/sls_yaml/templates/crud → emit/resource/templates}/ResourceYaml.ejs +0 -0
  257. /package/src/{codeGenerators/resource/sls_yaml → emit/resource}/templates/SystemDynamoDB_Yaml.ejs +0 -0
@@ -0,0 +1,62 @@
1
+ import { isAbsolute, normalize } from 'node:path';
2
+
3
+ export function normalizeArtifacts(artifacts) {
4
+ if (!Array.isArray(artifacts)) {
5
+ throw new TypeError('artifacts must be an array');
6
+ }
7
+
8
+ const paths = new Set();
9
+ return Object.freeze(artifacts.map(artifact => {
10
+ if (!artifact || typeof artifact.path !== 'string' || artifact.path.trim() === '') {
11
+ throw new TypeError('Artifact.path must be a non-empty relative path');
12
+ }
13
+ if (isAbsolute(artifact.path)) {
14
+ throw new TypeError(`Artifact.path must be relative: ${artifact.path}`);
15
+ }
16
+ if (typeof artifact.content !== 'string') {
17
+ throw new TypeError(`Artifact.content must be a string: ${artifact.path}`);
18
+ }
19
+
20
+ const path = normalizeArtifactPath(artifact.path);
21
+ if (paths.has(path)) {
22
+ throw new Error(`Duplicate artifact path: ${path}`);
23
+ }
24
+ paths.add(path);
25
+ return Object.freeze({ path, content: artifact.content });
26
+ }));
27
+ }
28
+
29
+ export function validateArtifacts(artifacts) {
30
+ return normalizeArtifacts(artifacts);
31
+ }
32
+
33
+ export function normalizeArtifactPaths(paths) {
34
+ if (!Array.isArray(paths)) {
35
+ throw new TypeError('managedPaths must be an array');
36
+ }
37
+
38
+ const seenPaths = new Set();
39
+ return Object.freeze(paths.map(path => {
40
+ const normalizedPath = normalizeArtifactPath(path);
41
+ if (seenPaths.has(normalizedPath)) {
42
+ throw new Error(`Duplicate artifact path: ${normalizedPath}`);
43
+ }
44
+ seenPaths.add(normalizedPath);
45
+ return normalizedPath;
46
+ }));
47
+ }
48
+
49
+ function normalizeArtifactPath(path) {
50
+ if (typeof path !== 'string' || path.trim() === '') {
51
+ throw new TypeError('Artifact.path must be a non-empty relative path');
52
+ }
53
+ if (isAbsolute(path)) {
54
+ throw new TypeError(`Artifact.path must be relative: ${path}`);
55
+ }
56
+
57
+ const normalizedPath = normalize(path);
58
+ if (normalizedPath === '..' || normalizedPath.startsWith('../')) {
59
+ throw new TypeError(`Artifact.path escapes output root: ${path}`);
60
+ }
61
+ return normalizedPath;
62
+ }
@@ -0,0 +1,50 @@
1
+ import { normalizeArtifactPaths, validateArtifacts } from '../output/validateArtifacts.js';
2
+
3
+ export function buildGenerationPlan(project, artifacts = [], { managedPaths = [], managedScope, managedScopes } = {}) {
4
+ if (!project?.rootPath || !project?.outputPath) {
5
+ throw new TypeError('ProjectModel must include rootPath and outputPath');
6
+ }
7
+ if (managedScope !== undefined && managedScopes !== undefined) {
8
+ throw new TypeError('GenerationPlan must use managedScope or managedScopes, not both');
9
+ }
10
+ return Object.freeze({
11
+ project,
12
+ artifacts: validateArtifacts(artifacts),
13
+ managedPaths: normalizeArtifactPaths(managedPaths),
14
+ managedScope: normalizeManagedScope(managedScope),
15
+ managedScopes: normalizeManagedScopes(managedScopes)
16
+ });
17
+ }
18
+
19
+ function normalizeManagedScope(scope) {
20
+ if (scope === undefined) {
21
+ return undefined;
22
+ }
23
+ if (typeof scope !== 'string' || scope.trim() === '') {
24
+ throw new TypeError('managedScope must be a non-empty string');
25
+ }
26
+ return scope;
27
+ }
28
+
29
+ function normalizeManagedScopes(scopes) {
30
+ if (scopes === undefined) {
31
+ return undefined;
32
+ }
33
+ if (!scopes || Array.isArray(scopes) || typeof scopes !== 'object') {
34
+ throw new TypeError('managedScopes must be an object of scope paths');
35
+ }
36
+ const seenPaths = new Set();
37
+ const normalized = {};
38
+ for (const [scope, paths] of Object.entries(scopes)) {
39
+ const scopeName = normalizeManagedScope(scope);
40
+ const normalizedPaths = normalizeArtifactPaths(paths);
41
+ for (const path of normalizedPaths) {
42
+ if (seenPaths.has(path)) {
43
+ throw new Error(`Artifact path belongs to multiple managed scopes: ${path}`);
44
+ }
45
+ seenPaths.add(path);
46
+ }
47
+ normalized[scopeName] = normalizedPaths;
48
+ }
49
+ return Object.freeze(normalized);
50
+ }
@@ -0,0 +1,159 @@
1
+ import assert from 'node:assert/strict';
2
+ import { mkdir, mkdtemp, readFile, readdir, symlink, writeFile } from 'node:fs/promises';
3
+ import { tmpdir } from 'node:os';
4
+ import { dirname, join } from 'node:path';
5
+ import test from 'node:test';
6
+
7
+ import { buildGenerationPlan } from '../src/plan/buildGenerationPlan.js';
8
+ import { commitArtifacts } from '../src/output/commitArtifacts.js';
9
+ import { compileProject } from '../src/compile/compileProject.js';
10
+
11
+ test('compiles a request and commits only declared relative artifacts', async () => {
12
+ const outputPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-'));
13
+ const project = compileProject({ rootPath: outputPath });
14
+ const plan = buildGenerationPlan(project, [
15
+ { path: 'app/generated/example.js', content: 'export default 1;\n' }
16
+ ]);
17
+
18
+ assert.deepEqual(await commitArtifacts(plan), [{ path: 'app/generated/example.js' }]);
19
+ assert.equal(
20
+ await readFile(join(outputPath, 'app/generated/example.js'), 'utf8'),
21
+ 'export default 1;\n'
22
+ );
23
+ });
24
+
25
+ test('rejects invalid generation inputs before writing files', async () => {
26
+ assert.throws(() => compileProject({}), /rootPath/);
27
+
28
+ const outputPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-invalid-'));
29
+ const project = compileProject({ rootPath: outputPath });
30
+ await assert.rejects(
31
+ Promise.resolve().then(() => buildGenerationPlan(project, [{ path: '../outside.js', content: '' }])),
32
+ /escapes output root/
33
+ );
34
+ await assert.rejects(
35
+ Promise.resolve().then(() => buildGenerationPlan(project, [
36
+ { path: 'same.js', content: '' },
37
+ { path: 'same.js', content: '' }
38
+ ])),
39
+ /Duplicate artifact path/
40
+ );
41
+ await assert.rejects(readFile(join(outputPath, 'same.js')));
42
+ });
43
+
44
+ test('rejects a symlinked output directory', async () => {
45
+ const outputPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-output-'));
46
+ const outsidePath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-outside-'));
47
+ await symlink(outsidePath, join(outputPath, 'linked'));
48
+
49
+ const plan = buildGenerationPlan(compileProject({ rootPath: outputPath }), [
50
+ { path: 'linked/escaped.js', content: 'export default 1;\n' }
51
+ ]);
52
+
53
+ await assert.rejects(commitArtifacts(plan), /non-directory/);
54
+ await assert.rejects(readFile(join(outsidePath, 'escaped.js')));
55
+ });
56
+
57
+ test('does not delete a legacy file before a managed scope has established ownership', async () => {
58
+ const outputPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-managed-scope-'));
59
+ const project = compileProject({ rootPath: outputPath });
60
+ await writeFile(join(outputPath, 'legacy.js'), 'legacy\n');
61
+
62
+ await commitArtifacts(buildGenerationPlan(project, [], {
63
+ managedPaths: ['legacy.js'],
64
+ managedScope: 'example-scope'
65
+ }));
66
+ assert.equal(await readFile(join(outputPath, 'legacy.js'), 'utf8'), 'legacy\n');
67
+
68
+ await commitArtifacts(buildGenerationPlan(project, [{ path: 'legacy.js', content: 'v2\n' }], {
69
+ managedPaths: ['legacy.js'],
70
+ managedScope: 'example-scope'
71
+ }));
72
+ await commitArtifacts(buildGenerationPlan(project, [], {
73
+ managedPaths: ['legacy.js'],
74
+ managedScope: 'example-scope'
75
+ }));
76
+ await assert.rejects(readFile(join(outputPath, 'legacy.js')));
77
+ });
78
+
79
+ test('commits and cleans multiple managed scopes in one transaction', async () => {
80
+ const outputPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-multi-scope-'));
81
+ const project = compileProject({ rootPath: outputPath });
82
+ const managedScopes = { schemas: ['schemas.js'], application: ['application.js'] };
83
+ await commitArtifacts(buildGenerationPlan(project, [
84
+ { path: 'schemas.js', content: 'schema\n' },
85
+ { path: 'application.js', content: 'application\n' }
86
+ ], { managedScopes }));
87
+
88
+ await commitArtifacts(buildGenerationPlan(project, [
89
+ { path: 'application.js', content: 'application next\n' }
90
+ ], { managedScopes }));
91
+
92
+ await assert.rejects(readFile(join(outputPath, 'schemas.js')));
93
+ assert.equal(await readFile(join(outputPath, 'application.js'), 'utf8'), 'application next\n');
94
+ });
95
+
96
+ test('merges preserved hook blocks into staged source without changing the hook', async () => {
97
+ const outputPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-hooks-'));
98
+ const hookPath = join(outputPath, 'app/generated/hook/example.js');
99
+ await mkdir(dirname(hookPath), { recursive: true });
100
+ await writeFile(hookPath, '//(<hookCode>)\ncustom();\n//(</hookCode>)\n');
101
+
102
+ await commitArtifacts(buildGenerationPlan(compileProject({ rootPath: outputPath }), [{
103
+ path: 'app/generated/source/example.js',
104
+ content: '//(<hookCode>)\ndefault();\n//(</hookCode>)\n'
105
+ }]));
106
+
107
+ assert.equal(
108
+ await readFile(join(outputPath, 'app/generated/source/example.js'), 'utf8'),
109
+ '//(<hookCode>)\ncustom();\n//(</hookCode>)\n'
110
+ );
111
+ assert.equal(await readFile(hookPath, 'utf8'), '//(<hookCode>)\ncustom();\n//(</hookCode>)\n');
112
+ });
113
+
114
+ test('rejects an invalid rendered artifact before staging output', async () => {
115
+ const outputPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-invalid-render-'));
116
+ const sourcePath = join(outputPath, 'app/generated/source/example.js');
117
+ await mkdir(dirname(sourcePath), { recursive: true });
118
+ await writeFile(sourcePath, 'existing source\n');
119
+
120
+ await assert.rejects(
121
+ commitArtifacts({
122
+ project: compileProject({ rootPath: outputPath }),
123
+ artifacts: [{ path: 'app/generated/source/example.js', content: null }]
124
+ }),
125
+ /content must be a string/
126
+ );
127
+ assert.equal(await readFile(sourcePath, 'utf8'), 'existing source\n');
128
+ assert.deepEqual(
129
+ (await readdir(outputPath)).filter(name => name.startsWith('.generate-service-code-v2-stage-')),
130
+ []
131
+ );
132
+ });
133
+
134
+ test('rejects a failed output transaction without partial files, hooks, or staging residue', async () => {
135
+ const outputPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-transaction-'));
136
+ const project = compileProject({ rootPath: outputPath });
137
+ const sourcePath = join(outputPath, 'app/generated/source/first.js');
138
+ const hookPath = join(outputPath, 'app/generated/hook/first.js');
139
+ await mkdir(dirname(sourcePath), { recursive: true });
140
+ await mkdir(dirname(hookPath), { recursive: true });
141
+ await writeFile(sourcePath, 'old source\n');
142
+ await writeFile(hookPath, 'custom hook\n');
143
+ await mkdir(join(outputPath, 'app/generated/source/second.js'));
144
+
145
+ await assert.rejects(
146
+ commitArtifacts(buildGenerationPlan(project, [
147
+ { path: 'app/generated/source/first.js', content: 'new source\n' },
148
+ { path: 'app/generated/source/second.js', content: 'never committed\n' }
149
+ ])),
150
+ /not a file/
151
+ );
152
+ assert.equal(await readFile(sourcePath, 'utf8'), 'old source\n');
153
+ assert.equal(await readFile(hookPath, 'utf8'), 'custom hook\n');
154
+ assert.deepEqual(
155
+ (await readdir(outputPath)).filter(name => name.startsWith('.generate-service-code-v2-stage-')),
156
+ []
157
+ );
158
+ assert.equal((await readdir(outputPath)).includes('.bak'), false);
159
+ });
@@ -0,0 +1,68 @@
1
+ import assert from 'node:assert/strict';
2
+ import { mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
3
+ import { tmpdir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import test, { after } from 'node:test';
6
+
7
+ import { generateCreateTargetRoleHandler } from '../src/emit/rbac/generateCreateTargetRoleHandler.js';
8
+
9
+ const roots = new Set();
10
+ const OWN_TOPIC_FLOWS = [
11
+ 'CreateTargetRole',
12
+ 'CreateRolePermissions',
13
+ 'DeleteRolePermissions',
14
+ 'DeleteTargetRole',
15
+ 'CreateUserRole',
16
+ 'DeleteUserFromRole'
17
+ ];
18
+ after(() => Promise.all([...roots].map(root => rm(root, { recursive: true, force: true }))));
19
+
20
+ test('generates RBAC own-topic WebSocket entries alongside their SQS handlers', async () => {
21
+ const rootPath = await createProject(true);
22
+ const result = await generateCreateTargetRoleHandler(rootPath);
23
+
24
+ assert.equal(result.files.length, 36);
25
+ assert.match(await readFile(join(rootPath, result.files[0].path), 'utf8'), /ProcessCreateTargetRole/);
26
+ assert.match(await readFile(join(rootPath, result.files[1].path), 'utf8'), /ProcessCreateTargetRoleHdrSqs/);
27
+ assert.match(
28
+ await readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/flow-rbac.yml'), 'utf8'),
29
+ /FlowRbacRole/
30
+ );
31
+ assert.match(
32
+ await readFile(join(rootPath, 'app/src/generatedCode/FlowRbac/ListTargetRole/source/ProcessListTargetRole_HdrApi.js'), 'utf8'),
33
+ /ProcessListTargetRole/
34
+ );
35
+ const yaml = await readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/flow-rbac.yml'), 'utf8');
36
+ for (const flowTag of OWN_TOPIC_FLOWS) {
37
+ assert.match(
38
+ await readFile(join(rootPath, `app/src/generatedCode/FlowRbac/${flowTag}/source/${flowTag}_HdrWbs.js`), 'utf8'),
39
+ new RegExp(`import ${flowTag}`)
40
+ );
41
+ assert.match(yaml, new RegExp(`${flowTag}HdrWbs:\\n[\\s\\S]*websocket:`));
42
+ }
43
+ });
44
+
45
+ test('removes CreateTargetRole handler when RBAC is removed', async () => {
46
+ const rootPath = await createProject(true);
47
+ const objectPath = join(rootPath, 'app/src/schemas/ObjectSchemas/User.js');
48
+ await generateCreateTargetRoleHandler(rootPath);
49
+ await writeFile(objectPath, "export default { objectType: 'user', addOnDataStructure: [] };\n");
50
+
51
+ assert.deepEqual((await generateCreateTargetRoleHandler(rootPath)).files, []);
52
+ await assert.rejects(readFile(join(rootPath, 'app/src/generatedCode/FlowRbac/CreateTargetRole/source/ProcessCreateTargetRole_Main.js')));
53
+ await assert.rejects(readFile(join(rootPath, 'app/src/generatedCode/FlowRbac/CreateTargetRole/source/CreateTargetRole_HdrWbs.js')));
54
+ await assert.rejects(readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/flow-rbac.yml')));
55
+ });
56
+
57
+ async function createProject(hasRbac) {
58
+ const rootPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-rbac-handler-'));
59
+ roots.add(rootPath);
60
+ const directory = join(rootPath, 'app/src/schemas/ObjectSchemas');
61
+ const addOns = hasRbac ? "[{ type: 'rbac' }]" : '[]';
62
+ await mkdir(directory, { recursive: true });
63
+ await writeFile(
64
+ join(directory, 'User.js'),
65
+ `export default { objectType: 'user', addOnDataStructure: ${addOns} };\n`
66
+ );
67
+ return rootPath;
68
+ }
@@ -0,0 +1,107 @@
1
+ import assert from 'node:assert/strict';
2
+ import { execFileSync } from 'node:child_process';
3
+ import { mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
4
+ import { tmpdir } from 'node:os';
5
+ import { join } from 'node:path';
6
+ import test, { after } from 'node:test';
7
+
8
+ import { generateCrudApplicationArtifacts } from '../src/emit/crud/generateCrudApplicationArtifacts.js';
9
+
10
+ const roots = new Set();
11
+ after(() => Promise.all([...roots].map(root => rm(root, { recursive: true, force: true }))));
12
+
13
+ test('emits CRUD handlers and function YAML from schema data without reading generated output', async () => {
14
+ const rootPath = await createProject(true);
15
+ const result = await generateCrudApplicationArtifacts(rootPath, { serviceTag: 'orders' });
16
+
17
+ assert.equal(result.files.length, 26);
18
+ assert.ok(result.files.every(file => !file.path.includes('/Process')));
19
+ assert.match(
20
+ await readFile(join(rootPath, 'app/src/generatedCode/FlowObjects/Get/source/Get_Main.js'), 'utf8'),
21
+ /dataFromGraphV2/
22
+ );
23
+ assert.match(
24
+ await readFile(join(rootPath, 'app/src/generatedCode/FlowObjects/Create/source/Create_Main.js'), 'utf8'),
25
+ /beforeLogical_order/
26
+ );
27
+ const yaml = await readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/flow-objects.yml'), 'utf8');
28
+ assert.match(yaml, /CreateHdrWbs:/);
29
+ assert.ok(yaml.indexOf('CreateHdrWbs:') < yaml.indexOf('CreateHdrSqs:'));
30
+ assert.doesNotMatch(yaml, /handler: .*\/Process/);
31
+ assert.match(yaml, /path: \/orders\/order\/get/);
32
+ assert.match(yaml, /GetHdrInv:/);
33
+ assert.match(yaml, /CreateCompleteHdrSqs:/);
34
+ assert.match(yaml, /#<#CreateCompleteHdrSqsFunctionSetting#>/);
35
+ assert.match(yaml, /filterPatterns:[\s\S]*CreateCompleteHdrSqs/);
36
+ assert.match(
37
+ await readFile(join(rootPath, 'app/src/generatedCode/FlowObjects/Create/source/CreateComplete_Main.js'), 'utf8'),
38
+ /checkAllAwaitingStepsFinishedWithReturnParams/
39
+ );
40
+ assert.doesNotMatch(
41
+ await readFile(join(rootPath, 'app/src/generatedCode/FlowObjects/Create/source/Create_WbsMain.js'), 'utf8'),
42
+ /from '@izara_project\/izara-core-generate-service-code'/
43
+ );
44
+ await assert.rejects(readFile(join(rootPath, 'app/src/generatedCode/FlowObjects/Create/source/ProcessCreate_Main.js')));
45
+ for (const action of ['Create', 'Update', 'Delete']) {
46
+ execFileSync(process.execPath, ['--check', join(rootPath, `app/src/generatedCode/FlowObjects/${action}/source/${action}Complete_Main.js`)], { stdio: 'inherit' });
47
+ execFileSync(process.execPath, ['--check', join(rootPath, `app/src/generatedCode/FlowObjects/${action}/source/${action}Complete_HdrSqs.js`)], { stdio: 'inherit' });
48
+ }
49
+ });
50
+
51
+ test('preserves function-setting hooks across CRUD regeneration', async () => {
52
+ const rootPath = await createProject(true);
53
+ const hookPath = join(rootPath, 'app/sls_yaml/generatedCode/hook/flow-objects.yml');
54
+ await mkdir(join(rootPath, 'app/sls_yaml/generatedCode/hook'), { recursive: true });
55
+ await writeFile(
56
+ hookPath,
57
+ ' #<#CreateCompleteHdrSqsFunctionSetting#>\n memorySize: 512\n #<#/CreateCompleteHdrSqsFunctionSetting#>\n'
58
+ );
59
+
60
+ await generateCrudApplicationArtifacts(rootPath, { serviceTag: 'orders' });
61
+ await generateCrudApplicationArtifacts(rootPath, { serviceTag: 'orders' });
62
+
63
+ const yamlPath = join(rootPath, 'app/sls_yaml/generatedCode/source/flow-objects.yml');
64
+ const yaml = await readFile(yamlPath, 'utf8');
65
+ assert.match(yaml, /#<#CreateCompleteHdrSqsFunctionSetting#>\n memorySize: 512\n #<#\/CreateCompleteHdrSqsFunctionSetting#>/);
66
+
67
+ const conflictPath = join(rootPath, 'app/src/generatedCode/FlowObjects/Create/source/Create_Main.js');
68
+ await rm(conflictPath);
69
+ await mkdir(conflictPath);
70
+
71
+ await assert.rejects(generateCrudApplicationArtifacts(rootPath, { serviceTag: 'orders' }), /not a file/);
72
+ assert.equal(await readFile(yamlPath, 'utf8'), yaml);
73
+ assert.equal(
74
+ await readFile(hookPath, 'utf8'),
75
+ ' #<#CreateCompleteHdrSqsFunctionSetting#>\n memorySize: 512\n #<#/CreateCompleteHdrSqsFunctionSetting#>\n'
76
+ );
77
+ });
78
+
79
+ test('removes managed CRUD artifacts when no applicable object remains', async () => {
80
+ const rootPath = await createProject(true);
81
+ await generateCrudApplicationArtifacts(rootPath, { serviceTag: 'orders' });
82
+ await writeFile(join(rootPath, 'app/src/schemas/ObjectSchemas/Order.js'), "export default { objectType: 'order' };\n");
83
+
84
+ assert.deepEqual((await generateCrudApplicationArtifacts(rootPath)).files, []);
85
+ await assert.rejects(readFile(join(rootPath, 'app/src/generatedCode/FlowObjects/Create/source/Create_Main.js')));
86
+ await assert.rejects(readFile(join(rootPath, 'app/src/generatedCode/FlowObjects/Create/source/CreateComplete_Main.js')));
87
+ await assert.rejects(readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/flow-objects.yml')));
88
+ });
89
+
90
+ async function createProject(withCrudObject) {
91
+ const rootPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-crud-application-'));
92
+ roots.add(rootPath);
93
+ const schemaRoot = join(rootPath, 'app/src/schemas');
94
+ await mkdir(join(schemaRoot, 'ObjectSchemas'), { recursive: true });
95
+ await mkdir(join(schemaRoot, 'FlowSchemas'), { recursive: true });
96
+ await writeFile(
97
+ join(schemaRoot, 'ObjectSchemas/Order.js'),
98
+ withCrudObject
99
+ ? "export default { objectType: 'order', generatedBy: 'userGenerated' };\n"
100
+ : "export default { objectType: 'order' };\n"
101
+ );
102
+ await writeFile(
103
+ join(schemaRoot, 'FlowSchemas/OrderBeforeLogical.js'),
104
+ "export default { flowTag: 'orderHook', event: ['ownTopic'], generatedCodeConfig: { generatedCodeTag: 'create', codeHookTag: 'beforeLogical', invocationType: 'ownTopic', objType: { objectType: 'order' } } };\n"
105
+ );
106
+ return rootPath;
107
+ }