@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.
- package/README.md +73 -11
- package/docs/TriggeredCache Flow.drawio +193 -0
- package/docs/test.mmd +47 -0
- package/docs/test.png +0 -0
- package/index.js +0 -5
- package/package.json +7 -6
- package/src/compile/compileProject.js +26 -0
- package/src/compile/loadSchemas.js +50 -0
- package/src/emit/crud/dynamicCrudFlowSchemaTemplate.js +11 -0
- package/src/emit/crud/emitCrudApplicationArtifacts.js +161 -0
- package/src/emit/crud/emitDynamicCrudFlowSchemas.js +84 -0
- package/src/emit/crud/generateCrudApplicationArtifacts.js +16 -0
- package/src/emit/crud/generateDynamicCrudFlowSchemas.js +21 -0
- package/src/emit/crud/loadLocalSchemaArrays.js +8 -0
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowObjects/templates/crud → emit/crud/templates}/CreateEndpoint_Main.ejs +6 -6
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowObjects/templates/crud → emit/crud/templates}/DeleteEndpoint_Main.ejs +6 -6
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowObjects/templates/step → emit/crud/templates}/FlowEndpointBeforeLogical_Main.ejs +2 -2
- package/src/emit/crud/templates/FlowEndpointComplete_Main.ejs +96 -0
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/endpoint → emit/crud/templates}/FlowEndpoint_HdrWbs.ejs +1 -1
- package/src/emit/crud/templates/FlowHandler_HdrApi.ejs +69 -0
- package/src/{codeGenerators/app/src/generatedCode/ProcessLogical/templates/ProcessLogical_HdrSqs.ejs → emit/crud/templates/FlowHandler_HdrSqs.ejs} +52 -56
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/endpoint → emit/crud/templates}/FlowMain_Wbs.ejs +1 -3
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowObjects/templates/crud → emit/crud/templates}/GetEndpoint_Main.ejs +2 -2
- package/src/emit/crud/templates/GetRangeEndpoint_Main.ejs +127 -0
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowObjects/templates/crud → emit/crud/templates}/UpdateEndpoint_Main.ejs +11 -9
- package/src/emit/custom/customFlows.js +121 -0
- package/src/emit/custom/emitCustomFlowApplicationArtifacts.js +325 -0
- package/src/emit/custom/generateCustomFlowApplicationArtifacts.js +22 -0
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/endpoint → emit/custom/templates}/FlowEndpoint_Main.ejs +5 -5
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step → emit/custom/templates}/FlowStep_Main.ejs +1 -1
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/ConfirmReserved_Main.ejs +5 -5
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/CreateObject_HdrWbs.ejs +1 -1
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/CreateObject_Main.ejs +3 -3
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/CreatePreSignUrl_Main.ejs +4 -5
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/FlowHandler_HdrS3.ejs +2 -8
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/ProcessS3File_Main.ejs +1 -1
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/ReservedLimit_Main.ejs +5 -6
- package/src/emit/custom/templates/triggerCache/CheckTriggerCache_HdrSqs.ejs +32 -0
- package/src/emit/custom/templates/triggerCache/CheckTriggerCache_Main.ejs +63 -0
- package/src/emit/custom/templates/triggerCache/TriggerCacheComplete_Main.ejs +35 -0
- package/src/emit/custom/templates/triggerCache/TriggerCache_Main.ejs +16 -0
- package/src/emit/function/functionYamlArtifact.js +125 -0
- package/src/emit/rbac/emitDynamicRbacFlowSchemas.js +117 -0
- package/src/emit/rbac/emitRbacApplicationArtifacts.js +270 -0
- package/src/emit/rbac/generateCreateTargetRoleHandler.js +19 -0
- package/src/emit/rbac/generateDynamicRbacFlowSchemas.js +21 -0
- package/src/emit/rbac/rbacFlowTag.js +7 -0
- package/src/emit/rbac/templates/CreateTargetRole_HdrSqs.ejs +24 -0
- package/src/emit/rbac/templates/CreateTargetRole_Main.ejs +25 -0
- package/src/emit/rbac/templates/DynamicRbacFlowSchema.ejs +5 -0
- package/src/emit/rbac/templates/ListRbac_HdrApi.ejs +17 -0
- package/src/emit/rbac/templates/ListRbac_HdrSqs.ejs +13 -0
- package/src/emit/rbac/templates/ListRbac_Main.ejs +29 -0
- package/src/emit/rbac/templates/RbacMutation_Main.ejs +22 -0
- package/src/emit/rbac/templates/UserRbacFlow_HdrInv.ejs +10 -0
- package/src/emit/rbac/templates/UserRbacFlow_Main.ejs +44 -0
- package/src/emit/rbac/templates/UserRoleMutation_Main.ejs +33 -0
- package/src/emit/relationship/dynamicRelationshipFlowSchemaTemplate.js +11 -0
- package/src/emit/relationship/emitDynamicRelationshipFlowSchemas.js +66 -0
- package/src/emit/relationship/emitRelationshipApplicationArtifacts.js +148 -0
- package/src/emit/relationship/generateDynamicRelationshipFlowSchemas.js +23 -0
- package/src/emit/relationship/generateRelationshipApplicationArtifacts.js +22 -0
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessChangeRelationshipComplete_Main.ejs → emit/relationship/templates/ChangeRelationshipComplete_Main.ejs} +1 -1
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessChangeRelationship_Main.ejs → emit/relationship/templates/ChangeRelationship_Main.ejs} +12 -4
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessCreateRelationshipComplete_Main.ejs → emit/relationship/templates/CreateRelationshipComplete_Main.ejs} +1 -1
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessCreateRelationship_Main.ejs → emit/relationship/templates/CreateRelationship_Main.ejs} +1 -1
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessDeleteRelationshipComplete_Main.ejs → emit/relationship/templates/DeleteRelationshipComplete_Main.ejs} +1 -1
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessDeleteRelationship_Main.ejs → emit/relationship/templates/DeleteRelationship_Main.ejs} +1 -1
- package/src/{codeGenerators/app/src/generatedCode/Flow/_shared/handlers → emit/relationship/templates}/FlowHandler_HdrDsq.ejs +1 -1
- package/src/emit/relationship/templates/FlowHandler_HdrInv.ejs +45 -0
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessGetRelationshipComplete_Main.ejs → emit/relationship/templates/GetRelationshipComplete_Main.ejs} +1 -1
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessGetRelationship_Main.ejs → emit/relationship/templates/GetRelationship_Main.ejs} +1 -1
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessMoveRelationship_Main.ejs → emit/relationship/templates/MoveRelationship_Main.ejs} +9 -1
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessUpdateRelationshipComplete_Main.ejs → emit/relationship/templates/UpdateRelationshipComplete_Main.ejs} +1 -1
- package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessUpdateRelationship_Main.ejs → emit/relationship/templates/UpdateRelationship_Main.ejs} +1 -1
- package/src/emit/resource/emitResourceArtifacts.js +595 -0
- package/src/emit/resource/generateResourceArtifacts.js +20 -0
- package/src/{codeGenerators/resource/sls_yaml/templates/crud → emit/resource/templates}/ResourceBeforeLogicalYaml.ejs +1 -1
- package/src/{codeGenerators/resource/sls_yaml/templates/crud → emit/resource/templates}/ResourceSqsYaml.ejs +6 -6
- package/src/{codeGenerators/app/sls_yaml → emit/resource}/templates/SharedResource_Yaml.ejs +8 -8
- package/src/emit/system/emitSystemWebSocketArtifacts.js +183 -0
- package/src/generate.js +60 -126
- package/src/output/commitArtifacts.js +213 -0
- package/src/output/mergeHooks.js +55 -0
- package/src/output/validateArtifacts.js +62 -0
- package/src/plan/buildGenerationPlan.js +50 -0
- package/test/core.test.js +159 -0
- package/test/createTargetRoleHandler.test.js +68 -0
- package/test/crudApplicationArtifacts.test.js +107 -0
- package/test/customFlowApplicationArtifacts.test.js +297 -0
- package/test/dynamicCrudFlowSchemas.test.js +136 -0
- package/test/dynamicRbacFlowSchemas.test.js +101 -0
- package/test/dynamicRelationshipFlowSchemas.test.js +99 -0
- package/test/functionYamlArtifact.test.js +34 -0
- package/test/intTestApi.test.js +29 -0
- package/test/publicApi.test.js +209 -0
- package/test/relationshipApplicationArtifacts.test.js +68 -0
- package/test/resourceArtifacts.test.js +121 -0
- package/jsconfig.json +0 -9
- package/src/__tests__/getIntTestConfig.test.js +0 -51
- package/src/__tests__/intTestGeneratorShared.test.cjs +0 -169
- package/src/__tests__/pathIntTest.test.js +0 -103
- package/src/codeGenerators/app/initial_setup/InitialSetupGenerator.js +0 -199
- package/src/codeGenerators/app/initial_setup/templates/InitialSetup_LambdaRole.ejs +0 -50
- package/src/codeGenerators/app/initial_setup/templates/InitialSetup_SnsService.ejs +0 -15
- package/src/codeGenerators/app/initial_setup/templates/InitialSetup_TableName.ejs +0 -9
- package/src/codeGenerators/app/sls_yaml/FindDataYamlGenerator.js +0 -23
- package/src/codeGenerators/app/sls_yaml/FunctionYamlGenerator.js +0 -332
- package/src/codeGenerators/app/sls_yaml/ProcessLogicalYamlGenerator.js +0 -21
- package/src/codeGenerators/app/sls_yaml/RoleNameConfigGenerator.js +0 -48
- package/src/codeGenerators/app/sls_yaml/SharedResourceYamlGenerator.js +0 -503
- package/src/codeGenerators/app/sls_yaml/__tests__/SharedResourceYamlGenerator.test.js +0 -235
- package/src/codeGenerators/app/sls_yaml/_policy/PolicyRegistry.js +0 -56
- package/src/codeGenerators/app/sls_yaml/_policy/__tests__/PolicyRegistry.test.js +0 -33
- package/src/codeGenerators/app/sls_yaml/renderYamlTemplate.js +0 -13
- package/src/codeGenerators/app/sls_yaml/templates/FindData_Yaml.ejs +0 -10
- package/src/codeGenerators/app/sls_yaml/templates/FunctionYaml_Api.ejs +0 -21
- package/src/codeGenerators/app/sls_yaml/templates/FunctionYaml_EventBridge.ejs +0 -14
- package/src/codeGenerators/app/sls_yaml/templates/FunctionYaml_Inv.ejs +0 -6
- package/src/codeGenerators/app/sls_yaml/templates/FunctionYaml_Sqs.ejs +0 -11
- package/src/codeGenerators/app/sls_yaml/templates/FunctionYaml_Wbs.ejs +0 -11
- package/src/codeGenerators/app/sls_yaml/templates/ProcessLogical_Yaml.ejs +0 -32
- package/src/codeGenerators/app/sls_yaml/templates/RoleNameConfig_Yaml.ejs +0 -5
- package/src/codeGenerators/app/src/generatedCode/FindData/FindDataGenerator.js +0 -238
- package/src/codeGenerators/app/src/generatedCode/FindData/templates/FindData_HdrSqs.ejs +0 -87
- package/src/codeGenerators/app/src/generatedCode/FindData/templates/FindData_Main.ejs +0 -108
- package/src/codeGenerators/app/src/generatedCode/FindData/templates/GetByStorage/getByDynamo.ejs +0 -32
- package/src/codeGenerators/app/src/generatedCode/FindData/templates/GetByStorage/getByGraph.ejs +0 -87
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowObjects/.gitkeep +0 -0
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowObjects/EndpointsGenerator.js +0 -120
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowObjects/templates/step/FlowEndpointComplete_Main.ejs +0 -313
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/RbacFlowGenerator.js +0 -116
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/CreateRolePermissions.ejs +0 -135
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/CreateTargetRole.ejs +0 -131
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/CreateUserRole.ejs +0 -150
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/DeleteRolePermissions.ejs +0 -132
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/DeleteTargetRole.ejs +0 -132
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/DeleteUserFromRole.ejs +0 -150
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/FlowRbac_Main.ejs +0 -252
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/ListRolePermissions.ejs +0 -120
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/ListTargetRole.ejs +0 -122
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowRbac/templates/rbac/ListUserInRoles.ejs +0 -117
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowRelationships/RelationshipFlowGenerator.js +0 -148
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/.gitkeep +0 -0
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/StatusFieldGenerator.js +0 -109
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/WebSocketGenerator.js +0 -122
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/endpoint/FlowEntryPoint_Main.ejs +0 -38
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/statusField/CompleteStatusFieldSns_Yaml.ejs +0 -52
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/statusField/CompleteStatusField_HdrSqs.ejs +0 -84
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/statusField/CompleteStatusField_Main.ejs +0 -78
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/FlowStep_ByConfig_Awaiting_Main.ejs +0 -123
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/FlowStep_ByConfig_Paginated_Main.ejs +0 -59
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/FlowStep_PlugIn_Main.ejs +0 -72
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/FlowStep_RecievePlugIn_Main.ejs +0 -76
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/templateAwaitingStep.ejs +0 -41
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/step/plugIns/templateSendPlugin.ejs +0 -18
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/ProcessWebSocketFlow_Yaml.ejs +0 -26
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/ProcessWebSocketSub_Yaml.ejs +0 -7
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/ProcessWebSocket_HdrSqs.ejs +0 -66
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/ProcessWebSocket_Main.ejs +0 -115
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/ProcessWebSocket_Yaml.ejs +0 -36
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/WebSocketConnect_Main.ejs +0 -52
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/WebSocketConnect_Yaml.ejs +0 -13
- package/src/codeGenerators/app/src/generatedCode/Flow/FlowSchemas/templates/webSocket/WebSocketDynamoDb_Yaml.ejs +0 -28
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/BaseDsqHandler.js +0 -63
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/BaseSqsHandler.js +0 -66
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/__tests__/BaseDsqHandler.test.js +0 -94
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/dsq.js +0 -5
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/eventBridge.js +0 -33
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/extTopic.js +0 -6
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/lambdaSyncApi.js +0 -51
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/lambdaSyncInv.js +0 -51
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/ownTopic.js +0 -54
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/registry.js +0 -17
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3.js +0 -56
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3Components/ConfirmAfterUploadS3Generator.js +0 -46
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3Components/CreateObjectGenerator.js +0 -50
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3Components/CreatePreSignUrlGenerator.js +0 -48
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3Components/ProcessAfterUploadS3Generator.js +0 -49
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/events/s3Components/ReservedLimitGenerator.js +0 -47
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/eventTypes.js +0 -23
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowClassifier.js +0 -50
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowEntryPointBase.js +0 -106
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowMainFunctionBase.js +0 -172
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowNaming.js +0 -37
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowSelection.js +0 -19
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowStepBase.js +0 -235
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowStepNormalizer.js +0 -75
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/flowValidator.js +0 -267
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/propertyNormalizer.js +0 -18
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/registry.js +0 -7
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/roleNameDetection.js +0 -49
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/shared/triggerCacheBase.js +0 -177
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/CheckTriggerCache_HdrSqs.ejs +0 -89
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/CheckTriggerCache_Main.ejs +0 -83
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/ProcessTriggerCache_HdrSqs.ejs +0 -103
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/ProcessTriggerCache_Main.ejs +0 -58
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/TriggerCacheComplete_HdrDsq.ejs +0 -104
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/TriggerCacheComplete_HdrSqs.ejs +0 -88
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/TriggerCacheComplete_Main.ejs +0 -80
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/triggerCache/TriggerCacheQueue_Yaml.ejs +0 -36
- package/src/codeGenerators/app/src/generatedCode/Flow/_shared/yaml/SharedFunctionSqs_Yaml.ejs +0 -13
- package/src/codeGenerators/app/src/generatedCode/ProcessLogical/ProcessLogicalGenerator.js +0 -29
- package/src/codeGenerators/app/src/generatedCode/ProcessLogical/templates/PaginateProcessLogical_HdrDsq.ejs +0 -177
- package/src/codeGenerators/app/src/generatedCode/ProcessLogical/templates/PaginateProcessLogical_HdrSqs.ejs +0 -155
- package/src/codeGenerators/app/src/generatedCode/ProcessLogical/templates/PaginateProcessLogical_Main.ejs +0 -268
- package/src/codeGenerators/app/src/generatedCode/ProcessLogical/templates/ProcessLogical_Main.ejs +0 -450
- package/src/codeGenerators/app/src/generatedCode/SystemFlowSchemas/RegisterGenerator.js +0 -149
- package/src/codeGenerators/app/src/generatedCode/SystemFlowSchemas/templates/register/RegisterComplete_HdrSqs.ejs +0 -85
- package/src/codeGenerators/app/src/generatedCode/SystemFlowSchemas/templates/register/RegisterComplete_Main.ejs +0 -176
- package/src/codeGenerators/app/src/generatedCode/SystemFlowSchemas/templates/register/Register_HdrWbs.ejs +0 -80
- package/src/codeGenerators/app/src/generatedCode/SystemFlowSchemas/templates/register/Register_Main.ejs +0 -164
- package/src/codeGenerators/app/src/generatedCode/libs/ConstsGenerator.js +0 -28
- package/src/codeGenerators/app/src/generatedCode/libs/GenerateCodeLibsGenerator.js +0 -28
- package/src/codeGenerators/app/src/generatedCode/libs/templates/Consts.ejs +0 -448
- package/src/codeGenerators/app/src/generatedCode/libs/templates/GenerateCodeLibs.ejs +0 -124
- package/src/codeGenerators/resource/sls_yaml/DynamoDBGenerator.js +0 -87
- package/src/codeGenerators/resource/sls_yaml/FlowOutGenerator.js +0 -70
- package/src/codeGenerators/resource/sls_yaml/FlowResourceYamlGenerator.js +0 -182
- package/src/core/renderTemplateFile.js +0 -22
- package/src/core/validate.js +0 -165
- package/src/generateCode.js +0 -357
- package/src/generateSchema.js +0 -123
- package/src/parsers/flowSchemaParser.js +0 -112
- package/src/parsers/objectSchemaParser.js +0 -39
- package/src/parsers/relationshipSchemaParser.js +0 -51
- package/src/schemaGenerators/app/src/schemas/FlowSchemas/FlowSchemaGenerator.js +0 -107
- package/src/schemaGenerators/app/src/schemas/FlowSchemas/RbacFlowSchemaGenerator.js +0 -98
- package/src/schemaGenerators/app/src/schemas/FlowSchemas/RelationshipFlowSchemaGenerator.js +0 -89
- package/src/schemaGenerators/app/src/schemas/FlowSchemas/templates/DynamicFlowSchemaTemplate.ejs +0 -41
- package/src/schemaGenerators/app/src/schemas/FlowSchemas/templates/DynamicRbacFlowSchemaTemplate.ejs +0 -20
- package/src/schemaGenerators/app/src/schemas/FlowSchemas/templates/RelationshipFlowSchemaTemplate.ejs +0 -33
- package/src/schemaGenerators/app/src/schemas/FlowSchemas/templates/UserRbacFlowSchemaTemplate.ejs +0 -22
- package/src/schemaGenerators/app/src/schemas/ObjectSchemas/AttributeTreeSchemaGenerator.js +0 -124
- package/src/schemaGenerators/app/src/schemas/ObjectSchemas/PropertyValueSchemaGenerator.js +0 -119
- package/src/schemaGenerators/app/src/schemas/ObjectSchemas/templates/DynamicAttributeTreeManagerSchemaTemplate.ejs +0 -14
- package/src/schemaGenerators/app/src/schemas/ObjectSchemas/templates/DynamicAttributeTreeStandardSchemaTemplate.ejs +0 -13
- package/src/schemaGenerators/app/src/schemas/ObjectSchemas/templates/DynamicPropertyValueSchemaTemplate.ejs +0 -15
- package/src/schemaGenerators/app/src/schemas/RelationshipSchemas/AttributeTreeRelationshipSchemaGenerator.js +0 -109
- package/src/schemaGenerators/app/src/schemas/RelationshipSchemas/PropertyValueRelationshipSchemaGenerator.js +0 -103
- package/src/schemaGenerators/app/src/schemas/RelationshipSchemas/__tests__/relationshipSchemaHelpers.test.js +0 -38
- package/src/schemaGenerators/app/src/schemas/RelationshipSchemas/relationshipSchemaHelpers.js +0 -40
- package/src/schemaGenerators/app/src/schemas/RelationshipSchemas/templates/DynamicAttributeTreeRelationshipSchemaTemplate.ejs +0 -7
- package/src/schemaGenerators/app/src/schemas/RelationshipSchemas/templates/DynamicPropertyValueRelationshipSchemaTemplate.ejs +0 -7
- package/src/schemaGenerators/app/src/schemas/SystemTextSchemas/SystemTextGenerator.js +0 -102
- package/src/schemaGenerators/app/src/schemas/SystemTextSchemas/templates/SystemText_Template.ejs +0 -10
- /package/src/{codeGenerators/app/src/generatedCode/Flow/_shared/handlers → emit/crud/templates}/FlowHandler_HdrInv.ejs +0 -0
- /package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/ConfirmReserved_HdrSqs.ejs +0 -0
- /package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/CreatePreSignUrl_HdrSqs.ejs +0 -0
- /package/src/{codeGenerators/app/src/generatedCode/Flow/FlowSchemas → emit/custom}/templates/s3/ReservedLimit_HdrSqs.ejs +0 -0
- /package/src/{codeGenerators/app/src/generatedCode/Flow/_shared/handlers → emit/relationship/templates}/FlowHandler_HdrApi.ejs +0 -0
- /package/src/{codeGenerators/app/src/generatedCode/Flow/_shared/handlers → emit/relationship/templates}/FlowHandler_HdrSqs.ejs +0 -0
- /package/src/{codeGenerators/app/src/generatedCode/Flow/FlowRelationships/templates/relationship/ProcessMoveRelationshipComplete_Main.ejs → emit/relationship/templates/MoveRelationshipComplete_Main.ejs} +0 -0
- /package/src/{codeGenerators/resource/sls_yaml → emit/resource}/templates/DynamoDBTable_Yaml.ejs +0 -0
- /package/src/{codeGenerators/resource/sls_yaml → emit/resource}/templates/FlowOut_Yaml.ejs +0 -0
- /package/src/{codeGenerators/resource/sls_yaml/templates/crud → emit/resource/templates}/ResourceYaml.ejs +0 -0
- /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
|
+
}
|