@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,29 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { mkdtemp, mkdir, rm, writeFile } from 'node:fs/promises';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import test from 'node:test';
|
|
6
|
+
|
|
7
|
+
import {
|
|
8
|
+
generateIntTest,
|
|
9
|
+
generateResourceIntTest
|
|
10
|
+
} from '../index.js';
|
|
11
|
+
|
|
12
|
+
test('exports IntTest generators and requires a service tag', async () => {
|
|
13
|
+
const rootPath = await mkdtemp(path.join(os.tmpdir(), 'generate-service-code-inttest-'));
|
|
14
|
+
await mkdir(path.join(rootPath, 'config'));
|
|
15
|
+
await writeFile(path.join(rootPath, 'config', 'serverless.config.yml'), 'main_config: {}\n');
|
|
16
|
+
|
|
17
|
+
try {
|
|
18
|
+
await assert.rejects(
|
|
19
|
+
generateIntTest(rootPath),
|
|
20
|
+
/Missing iz_serviceTag/
|
|
21
|
+
);
|
|
22
|
+
await assert.rejects(
|
|
23
|
+
generateResourceIntTest(rootPath),
|
|
24
|
+
/Missing iz_serviceTag/
|
|
25
|
+
);
|
|
26
|
+
} finally {
|
|
27
|
+
await rm(rootPath, { recursive: true, force: true });
|
|
28
|
+
}
|
|
29
|
+
});
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { execFileSync } from 'node:child_process';
|
|
3
|
+
import { mkdir, mkdtemp, readFile, writeFile } from 'node:fs/promises';
|
|
4
|
+
import { tmpdir } from 'node:os';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import test from 'node:test';
|
|
7
|
+
|
|
8
|
+
import * as publicApi from '../index.js';
|
|
9
|
+
|
|
10
|
+
const { generate } = publicApi;
|
|
11
|
+
|
|
12
|
+
test('public package surface exposes generation and IntTest APIs', () => {
|
|
13
|
+
assert.deepEqual(Object.keys(publicApi), [
|
|
14
|
+
'generate',
|
|
15
|
+
'generateIntTest',
|
|
16
|
+
'generateResourceIntTest'
|
|
17
|
+
]);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
test('generate commits schemas, application artifacts, and resources in one public result', async () => {
|
|
21
|
+
const rootPath = await createCrudProject();
|
|
22
|
+
const result = await generate(rootPath);
|
|
23
|
+
|
|
24
|
+
assert.strictEqual(result.files.length, 38);
|
|
25
|
+
assert.equal(result.project.rootPath, rootPath);
|
|
26
|
+
assert.match(
|
|
27
|
+
await readFile(join(rootPath, 'app/src/generatedCode/FlowObjects/Create/source/Create_Main.js'), 'utf8'),
|
|
28
|
+
/CreateMainLogical/
|
|
29
|
+
);
|
|
30
|
+
assert.match(
|
|
31
|
+
await readFile(join(rootPath, 'resource/sls_yaml/generatedCode/source/generated-dynamoDB-table.yml'), 'utf8'),
|
|
32
|
+
/Resources:/
|
|
33
|
+
);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
test('generate logs its lifecycle through the supplied logger', async () => {
|
|
37
|
+
const rootPath = await createCrudProject();
|
|
38
|
+
const messages = [];
|
|
39
|
+
const logger = Object.fromEntries(['info', 'debug', 'error'].map(level => [level, message => messages.push(message)]));
|
|
40
|
+
|
|
41
|
+
await generate(rootPath, { logger });
|
|
42
|
+
|
|
43
|
+
assert.match(messages[0], /STATUS=STARTED/);
|
|
44
|
+
assert.ok(messages.some(message => /STATUS=SCHEMAS_LOADED/.test(message)));
|
|
45
|
+
assert.ok(messages.some(message => /STATUS=ARTIFACTS_EMITTED/.test(message)));
|
|
46
|
+
assert.match(messages.at(-1), /STATUS=FINISHED/);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
test('generate commits RBAC WebSocket entries for own-topic mutation flows', async () => {
|
|
50
|
+
const rootPath = await createRbacProject();
|
|
51
|
+
|
|
52
|
+
const result = await generate(rootPath, { serviceTag: 'UserAccount' });
|
|
53
|
+
|
|
54
|
+
assert.ok(result.files.some(file => file.path === 'app/src/generatedCode/FlowRbac/CreateTargetRole/source/CreateTargetRole_HdrWbs.js'));
|
|
55
|
+
assert.match(
|
|
56
|
+
await readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/flow-rbac.yml'), 'utf8'),
|
|
57
|
+
/CreateTargetRoleHdrWbs:\n[\s\S]*websocket:/
|
|
58
|
+
);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
test('generate commits the system WebSocket completion path for own-topic flows', async () => {
|
|
62
|
+
const rootPath = await createOwnTopicProject();
|
|
63
|
+
const result = await generate(rootPath);
|
|
64
|
+
|
|
65
|
+
assert.ok(result.files.some(file => file.path === 'app/src/generatedCode/SystemFlowSchemas/WebSocketMain/source/WebSocketComplete_HdrSqs.js'));
|
|
66
|
+
assert.ok(result.files.some(file => file.path === 'app/src/generatedCode/FlowSchemas/Track/source/Track_HdrWbs.js'));
|
|
67
|
+
assert.match(
|
|
68
|
+
await readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/flow-schema.yml'), 'utf8'),
|
|
69
|
+
/WebSocketConnect:[\s\S]*route: \$connect[\s\S]*WebSocketCompleteHdrSqs:/
|
|
70
|
+
);
|
|
71
|
+
assert.match(
|
|
72
|
+
await readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/flow-schema.yml'), 'utf8'),
|
|
73
|
+
/filterPatterns:[\s\S]*WebSocketCompleteHdrSqs/
|
|
74
|
+
);
|
|
75
|
+
assert.match(
|
|
76
|
+
await readFile(join(rootPath, 'resource/sls_yaml/generatedCode/source/generated-sns-in-sqs.yml'), 'utf8'),
|
|
77
|
+
/WebSocketCompleteHdrSqs:[\s\S]*SubscriptionToOutTrackWebSocketComplete:/
|
|
78
|
+
);
|
|
79
|
+
assert.match(
|
|
80
|
+
await readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/generate-shared-resource.yml'), 'utf8'),
|
|
81
|
+
/WebSocketMainRole:/
|
|
82
|
+
);
|
|
83
|
+
for (const path of [
|
|
84
|
+
'app/src/generatedCode/SystemFlowSchemas/WebSocketMain/source/WebSocketConnect.js',
|
|
85
|
+
'app/src/generatedCode/SystemFlowSchemas/WebSocketMain/source/WebSocketComplete_Main.js',
|
|
86
|
+
'app/src/generatedCode/SystemFlowSchemas/WebSocketMain/source/WebSocketComplete_HdrSqs.js',
|
|
87
|
+
'app/src/generatedCode/FlowSchemas/Track/source/Track_Main.js',
|
|
88
|
+
'app/src/generatedCode/FlowSchemas/Track/source/Track_HdrSqs.js',
|
|
89
|
+
'app/src/generatedCode/FlowSchemas/Track/source/Track_WbsMain.js',
|
|
90
|
+
'app/src/generatedCode/FlowSchemas/Track/source/Track_HdrWbs.js'
|
|
91
|
+
]) {
|
|
92
|
+
execFileSync(process.execPath, ['--check', join(rootPath, path)], { stdio: 'inherit' });
|
|
93
|
+
}
|
|
94
|
+
const webSocketComplete = await readFile(join(rootPath, 'app/src/generatedCode/SystemFlowSchemas/WebSocketMain/source/WebSocketComplete_Main.js'), 'utf8');
|
|
95
|
+
assert.match(webSocketComplete, /\(\<createIdentifiersFlow\>\)/);
|
|
96
|
+
assert.match(webSocketComplete, /\(\<beforePostMessage\>\)/);
|
|
97
|
+
const webSocketHandler = await readFile(join(rootPath, 'app/src/generatedCode/SystemFlowSchemas/WebSocketMain/source/WebSocketComplete_HdrSqs.js'), 'utf8');
|
|
98
|
+
assert.match(webSocketHandler, /record\.body\.TopicArn/);
|
|
99
|
+
assert.match(webSocketHandler, /addCallingFlowToPassOnProperties/);
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
test('generate commits the legacy trigger-cache suite with its queues', async () => {
|
|
103
|
+
const rootPath = await createTriggerCacheProject();
|
|
104
|
+
const result = await generate(rootPath);
|
|
105
|
+
|
|
106
|
+
for (const path of [
|
|
107
|
+
'app/src/generatedCode/FlowSchemas/Cart/source/CartCheckTriggerCacheCartComplete_HdrSqs.js',
|
|
108
|
+
'app/src/generatedCode/FlowSchemas/Cart/source/CartCheckTriggerCacheCartComplete_Main.js',
|
|
109
|
+
'app/src/generatedCode/FlowSchemas/Cart/source/CartTriggerCacheCartComplete_HdrSqs.js',
|
|
110
|
+
'app/src/generatedCode/FlowSchemas/Cart/source/CartTriggerCacheCartComplete_Main.js'
|
|
111
|
+
]) assert.ok(result.files.some(file => file.path === path));
|
|
112
|
+
assert.match(
|
|
113
|
+
await readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/flow-schema.yml'), 'utf8'),
|
|
114
|
+
/CartCheckTriggerCacheCartCompleteHdrSqs:[\s\S]*CartTriggerCacheCartCompleteHdrSqs:/
|
|
115
|
+
);
|
|
116
|
+
assert.match(
|
|
117
|
+
await readFile(join(rootPath, 'resource/sls_yaml/generatedCode/source/generated-sns-in-sqs.yml'), 'utf8'),
|
|
118
|
+
/CartCheckTriggerCacheCartCompleteHdrSqs:[\s\S]*CartTriggerCacheCartCompleteHdrSqs/
|
|
119
|
+
);
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
test('generate removes the system WebSocket path when the last own-topic flow is removed', async () => {
|
|
123
|
+
const rootPath = await createOwnTopicProject();
|
|
124
|
+
await generate(rootPath);
|
|
125
|
+
await writeFile(join(rootPath, 'app/src/schemas/FlowSchemas/Track.js'), "export default { flowTag: 'track', event: ['dsq'] };\n");
|
|
126
|
+
|
|
127
|
+
await generate(rootPath);
|
|
128
|
+
|
|
129
|
+
await assert.rejects(readFile(join(rootPath, 'app/src/generatedCode/SystemFlowSchemas/WebSocketMain/source/WebSocketComplete_HdrSqs.js')));
|
|
130
|
+
await assert.rejects(readFile(join(rootPath, 'app/src/generatedCode/FlowSchemas/Track/source/Track_HdrWbs.js')));
|
|
131
|
+
assert.doesNotMatch(
|
|
132
|
+
await readFile(join(rootPath, 'resource/sls_yaml/generatedCode/source/generated-sns-in-sqs.yml'), 'utf8'),
|
|
133
|
+
/WebSocketCompleteHdrSqs/
|
|
134
|
+
);
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
test('generate rolls back every slice when one output target conflicts', async () => {
|
|
138
|
+
const rootPath = await createCrudProject();
|
|
139
|
+
await mkdir(join(rootPath, 'app/sls_yaml/generatedCode/source/flow-objects.yml'), { recursive: true });
|
|
140
|
+
|
|
141
|
+
await assert.rejects(
|
|
142
|
+
generate(rootPath),
|
|
143
|
+
/not a file/
|
|
144
|
+
);
|
|
145
|
+
await assert.rejects(readFile(join(rootPath, 'app/src/schemas/FlowSchemas/generateCode/Create.js')));
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
test('generate removes stale CRUD schemas and application artifacts', async () => {
|
|
149
|
+
const rootPath = await createCrudProject();
|
|
150
|
+
await generate(rootPath);
|
|
151
|
+
await writeFile(
|
|
152
|
+
join(rootPath, 'app/src/schemas/ObjectSchemas/Order.js'),
|
|
153
|
+
"export default { objectType: 'order', generatedBy: 'external' };\n"
|
|
154
|
+
);
|
|
155
|
+
|
|
156
|
+
const result = await generate(rootPath);
|
|
157
|
+
|
|
158
|
+
assert.equal(result.files.length, 10);
|
|
159
|
+
await assert.rejects(readFile(join(rootPath, 'app/src/schemas/FlowSchemas/generateCode/Create.js')));
|
|
160
|
+
await assert.rejects(readFile(join(rootPath, 'app/src/generatedCode/FlowObjects/Create/source/Create_Main.js')));
|
|
161
|
+
assert.match(
|
|
162
|
+
await readFile(join(rootPath, 'resource/sls_yaml/generatedCode/source/generated-dynamoDB-table.yml'), 'utf8'),
|
|
163
|
+
/WebSocketTask/
|
|
164
|
+
);
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
async function createCrudProject() {
|
|
168
|
+
const rootPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-public-'));
|
|
169
|
+
const objectDirectory = join(rootPath, 'app/src/schemas/ObjectSchemas');
|
|
170
|
+
await mkdir(objectDirectory, { recursive: true });
|
|
171
|
+
await writeFile(
|
|
172
|
+
join(objectDirectory, 'Order.js'),
|
|
173
|
+
"export default { objectType: 'order', generatedBy: 'userGenerated' };\n"
|
|
174
|
+
);
|
|
175
|
+
return rootPath;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
async function createRbacProject() {
|
|
179
|
+
const rootPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-public-rbac-'));
|
|
180
|
+
const objectDirectory = join(rootPath, 'app/src/schemas/ObjectSchemas');
|
|
181
|
+
await mkdir(objectDirectory, { recursive: true });
|
|
182
|
+
await writeFile(
|
|
183
|
+
join(objectDirectory, 'User.js'),
|
|
184
|
+
"export default { objectType: 'user', addOnDataStructure: [{ type: 'rbac' }] };\n"
|
|
185
|
+
);
|
|
186
|
+
return rootPath;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
async function createOwnTopicProject() {
|
|
190
|
+
const rootPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-public-websocket-'));
|
|
191
|
+
const flowDirectory = join(rootPath, 'app/src/schemas/FlowSchemas');
|
|
192
|
+
await mkdir(flowDirectory, { recursive: true });
|
|
193
|
+
await writeFile(
|
|
194
|
+
join(flowDirectory, 'Track.js'),
|
|
195
|
+
"export default { flowTag: 'track', event: ['ownTopic'], initiateBy: 'user', outputTopic: true, statusType: 'none', generatedCodeConfig: { generatedCodeTag: 'create', codeHookTag: 'beforeLogical', invocationType: 'ownTopic' } };\n"
|
|
196
|
+
);
|
|
197
|
+
return rootPath;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
async function createTriggerCacheProject() {
|
|
201
|
+
const rootPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-public-trigger-cache-'));
|
|
202
|
+
const flowDirectory = join(rootPath, 'app/src/schemas/FlowSchemas');
|
|
203
|
+
await mkdir(flowDirectory, { recursive: true });
|
|
204
|
+
await writeFile(
|
|
205
|
+
join(flowDirectory, 'Cart.js'),
|
|
206
|
+
"export default { flowTag: 'cart', event: ['ownTopic'], statusType: 'triggerCache', objType: { serviceTag: 'Order' }, flowSteps: [{ stepName: 'CheckTriggerCacheCartComplete', event: ['extTopic'], checkTriggerType: 'flowType' }, { stepName: 'TriggerCacheCartComplete', event: ['extTopic'], checkTriggerType: 'complete' }] };\n"
|
|
207
|
+
);
|
|
208
|
+
return rootPath;
|
|
209
|
+
}
|
|
@@ -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 { generateRelationshipApplicationArtifacts } from '../src/emit/relationship/generateRelationshipApplicationArtifacts.js';
|
|
8
|
+
|
|
9
|
+
const roots = new Set();
|
|
10
|
+
after(() => Promise.all([...roots].map(root => rm(root, { recursive: true, force: true }))));
|
|
11
|
+
|
|
12
|
+
test('emits relationship action and complete handlers with data-first function YAML', async () => {
|
|
13
|
+
const rootPath = await createProject(true);
|
|
14
|
+
const result = await generateRelationshipApplicationArtifacts(rootPath, { serviceTag: 'orders' });
|
|
15
|
+
|
|
16
|
+
assert.equal(result.files.length, 40);
|
|
17
|
+
assert.ok(result.files.every(file => !file.path.includes('/Process')));
|
|
18
|
+
assert.match(
|
|
19
|
+
await readFile(join(rootPath, 'app/src/generatedCode/FlowRelationships/GetRelationship/source/GetRelationship_HdrDsq.js'), 'utf8'),
|
|
20
|
+
/import GetRelationship/
|
|
21
|
+
);
|
|
22
|
+
assert.match(
|
|
23
|
+
await readFile(join(rootPath, 'app/src/generatedCode/FlowRelationships/CreateRelationship/source/CreateRelationshipComplete_HdrSqs.js'), 'utf8'),
|
|
24
|
+
/import CreateRelationshipComplete/
|
|
25
|
+
);
|
|
26
|
+
const yaml = await readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/flow-relationships.yml'), 'utf8');
|
|
27
|
+
assert.match(yaml, /GetRelHdrApi:/);
|
|
28
|
+
assert.doesNotMatch(yaml, /handler: .*\/Process/);
|
|
29
|
+
assert.match(yaml, /CreateRelHdrSqs:[\s\S]*?iz_resourcePrefix}CreateRelationshipHdrSqs\n/);
|
|
30
|
+
assert.doesNotMatch(yaml, /Process(?:Create|Update|Delete|Get|Change|Move)Relationship/);
|
|
31
|
+
assert.match(yaml, /path: \/orders\/orderCustomer\/get/);
|
|
32
|
+
assert.match(yaml, /CreateRelationshipHdrWbs:[\s\S]*websocket:/);
|
|
33
|
+
assert.ok(yaml.indexOf('CreateRelationshipHdrWbs:') < yaml.indexOf('CreateRelHdrSqs:'));
|
|
34
|
+
assert.match(
|
|
35
|
+
await readFile(join(rootPath, 'app/src/generatedCode/FlowRelationships/CreateRelationship/source/CreateRelationship_HdrWbs.js'), 'utf8'),
|
|
36
|
+
/import CreateRelationship from '\.\/CreateRelationship_WbsMain\.js'/
|
|
37
|
+
);
|
|
38
|
+
await assert.rejects(readFile(join(rootPath, 'app/src/generatedCode/FlowRelationships/CreateRelationship/source/ProcessCreateRelationship_Main.js')));
|
|
39
|
+
assert.match(
|
|
40
|
+
await readFile(join(rootPath, 'app/src/generatedCode/FlowRelationships/CreateRelationship/source/CreateRelationship_Main.js'), 'utf8'),
|
|
41
|
+
/export default async function createRelationship/
|
|
42
|
+
);
|
|
43
|
+
assert.match(yaml, /CreateRelationshipCompleteHdrSqs:/);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
test('removes managed relationship artifacts after relationships are removed', async () => {
|
|
47
|
+
const rootPath = await createProject(true);
|
|
48
|
+
await generateRelationshipApplicationArtifacts(rootPath, { serviceTag: 'orders' });
|
|
49
|
+
await rm(join(rootPath, 'app/src/schemas/RelationshipSchemas/OrderCustomer.js'));
|
|
50
|
+
|
|
51
|
+
assert.deepEqual((await generateRelationshipApplicationArtifacts(rootPath)).files, []);
|
|
52
|
+
await assert.rejects(readFile(join(rootPath, 'app/src/generatedCode/FlowRelationships/CreateRelationship/source/CreateRelationship_Main.js')));
|
|
53
|
+
await assert.rejects(readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/flow-relationships.yml')));
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
async function createProject(withRelationship) {
|
|
57
|
+
const rootPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-relationship-application-'));
|
|
58
|
+
roots.add(rootPath);
|
|
59
|
+
const relationshipDirectory = join(rootPath, 'app/src/schemas/RelationshipSchemas');
|
|
60
|
+
await mkdir(relationshipDirectory, { recursive: true });
|
|
61
|
+
if (withRelationship) {
|
|
62
|
+
await writeFile(
|
|
63
|
+
join(relationshipDirectory, 'OrderCustomer.js'),
|
|
64
|
+
"export default { relationshipTag: 'orderCustomer', links: [] };\n"
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
return rootPath;
|
|
68
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
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 { generateResourceArtifacts } from '../src/emit/resource/generateResourceArtifacts.js';
|
|
8
|
+
|
|
9
|
+
const roots = new Set();
|
|
10
|
+
after(() => Promise.all([...roots].map(root => rm(root, { recursive: true, force: true }))));
|
|
11
|
+
|
|
12
|
+
test('emits queues, topics, tables, and IAM roles from schema data', async () => {
|
|
13
|
+
const rootPath = await createProject();
|
|
14
|
+
const result = await generateResourceArtifacts(rootPath);
|
|
15
|
+
|
|
16
|
+
assert.equal(result.files.length, 4);
|
|
17
|
+
const resources = await readFile(join(rootPath, 'resource/sls_yaml/generatedCode/source/generated-sns-in-sqs.yml'), 'utf8');
|
|
18
|
+
assert.match(resources, /InCreate:/);
|
|
19
|
+
for (const queueName of ['FindDataHdrSqs', 'ProcessLogicalHdrSqs', 'PaginateProcessLogicalHdrDsq', 'PaginateProcessLogicalHdrSqs']) {
|
|
20
|
+
assert.match(resources, new RegExp(`^ ${queueName}:`, 'm'));
|
|
21
|
+
}
|
|
22
|
+
assert.match(
|
|
23
|
+
await readFile(join(rootPath, 'resource/sls_yaml/generatedCode/source/generated-dynamoDB-table.yml'), 'utf8'),
|
|
24
|
+
/OrdersTable:/
|
|
25
|
+
);
|
|
26
|
+
const iam = await readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/generate-shared-resource.yml'), 'utf8');
|
|
27
|
+
assert.match(iam, /FlowObjectsRole:/);
|
|
28
|
+
assert.match(iam, /FlowRelationshipRole:/);
|
|
29
|
+
assert.match(iam, /FlowRbacRole:/);
|
|
30
|
+
assert.match(iam, /sqs:ReceiveMessage/);
|
|
31
|
+
assert.match(iam, /sns:Publish/);
|
|
32
|
+
assert.doesNotMatch(roleBlock(iam, 'WebSocketMainRole'), /Orders|RolePermissions|CreateHdrSqs/);
|
|
33
|
+
assert.match(roleBlock(iam, 'WebSocketMainRole'), /UserUploadRecords|WebSocketTask|WebSocketCompleteHdrSqs/);
|
|
34
|
+
assert.doesNotMatch(roleBlock(iam, 'FlowRbacRole'), /Orders|ProcessCreateRelationshipHdrSqs/);
|
|
35
|
+
assert.match(roleBlock(iam, 'FlowRbacRole'), /RolePermissions|ProcessCreateTargetRoleHdrSqs/);
|
|
36
|
+
assert.match(resources, /^ CreateRelationshipHdrSqs:/m);
|
|
37
|
+
assert.equal((resources.match(/^ CreateRelationshipHdrSqs:/gm) ?? []).length, 1);
|
|
38
|
+
assert.match(resources, /^ CreateRelationshipCompleteHdrSqs:/m);
|
|
39
|
+
assert.match(resources, /^ GetRelationshipHdrDsq:/m);
|
|
40
|
+
assert.doesNotMatch(resources, /Process(?:Create|Update|Delete|Get|Change|Move)Relationship/);
|
|
41
|
+
const relationshipRole = roleBlock(iam, 'FlowRelationshipRole');
|
|
42
|
+
assert.match(relationshipRole, /CreateRelationshipHdrSqs/);
|
|
43
|
+
assert.match(relationshipRole, /CreateRelationshipCompleteHdrSqs/);
|
|
44
|
+
assert.match(relationshipRole, /GetRelationshipHdrDsq/);
|
|
45
|
+
assert.doesNotMatch(relationshipRole, /Process(?:Create|Update|Delete|Get|Change|Move)Relationship/);
|
|
46
|
+
assert.match(roleBlock(iam, 'RegisterRole'), /s3:GetObject/);
|
|
47
|
+
assert.doesNotMatch(roleBlock(iam, 'RegisterRole'), /dynamodb:|sqs:|sns:/);
|
|
48
|
+
assert.doesNotMatch(iam, /s3:GetObjectVersion|s3:ListBucket|sqs:DeleteMessageBatch|sqs:GetQueueUrl/);
|
|
49
|
+
assert.match(iam, /#<#\/\w+StatementHookCode#>\n\n \w+Role:/);
|
|
50
|
+
for (const filePath of [
|
|
51
|
+
'resource/sls_yaml/generatedCode/source/generated-sns-in-sqs.yml',
|
|
52
|
+
'resource/sls_yaml/generatedCode/source/generated-sns-out.yml',
|
|
53
|
+
'resource/sls_yaml/generatedCode/source/generated-dynamoDB-table.yml',
|
|
54
|
+
'app/sls_yaml/generatedCode/source/generate-shared-resource.yml'
|
|
55
|
+
]) {
|
|
56
|
+
assert.doesNotMatch(await readFile(join(rootPath, filePath), 'utf8'), /\n\n$/);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
test('emits one before-logical queue for flows that share an action', async () => {
|
|
61
|
+
const rootPath = await createProject();
|
|
62
|
+
const flowDirectory = join(rootPath, 'app/src/schemas/FlowSchemas');
|
|
63
|
+
await writeFile(
|
|
64
|
+
join(flowDirectory, 'BeforeLogical.js'),
|
|
65
|
+
"export default [{ flowTag: 'first', event: ['ownTopic'], generatedCodeConfig: { generatedCodeTag: 'create', codeHookTag: 'beforeLogical' } }, { flowTag: 'second', event: ['extTopic'], generatedCodeConfig: { generatedCodeTag: 'create', codeHookTag: 'beforeLogical' } }];\n"
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
await generateResourceArtifacts(rootPath);
|
|
69
|
+
|
|
70
|
+
const resources = await readFile(join(rootPath, 'resource/sls_yaml/generatedCode/source/generated-sns-in-sqs.yml'), 'utf8');
|
|
71
|
+
assert.equal((resources.match(/^ CreateBeforeLogicalHdrSqs:/gm) ?? []).length, 1);
|
|
72
|
+
assert.match(resources, /SubscriptionOutFirstToCreateBeforeLogical:/);
|
|
73
|
+
assert.match(resources, /SubscriptionOutSecondToCreateBeforeLogical:/);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
test('emits the shared WebSocket completion queue and output-topic subscriptions', async () => {
|
|
77
|
+
const rootPath = await createProject();
|
|
78
|
+
await generateResourceArtifacts(rootPath);
|
|
79
|
+
|
|
80
|
+
const resources = await readFile(join(rootPath, 'resource/sls_yaml/generatedCode/source/generated-sns-in-sqs.yml'), 'utf8');
|
|
81
|
+
assert.match(resources, /^ WebSocketCompleteHdrSqs:/m);
|
|
82
|
+
assert.match(resources, /SubscriptionToOutCustomWebSocketComplete:/);
|
|
83
|
+
const iam = await readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/generate-shared-resource.yml'), 'utf8');
|
|
84
|
+
for (const roleName of ['WebSocketMainRole', 'FlowObjectsRole', 'FlowRelationshipRole', 'FlowRbacRole', 'CustomRole', 'UploadRole']) {
|
|
85
|
+
const role = roleBlock(iam, roleName);
|
|
86
|
+
assert.match(role, /execute-api:ManageConnections/);
|
|
87
|
+
assert.match(role, /arn:aws:execute-api:\$\{self:custom\.iz_region\}:\$\{self:custom\.iz_accountId\}:\*\/\*/);
|
|
88
|
+
}
|
|
89
|
+
assert.match(resources, /SubscriptionToOutCreateRelationshipWebSocketComplete:/);
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
test('scopes stored-cache permissions to the flow object table', async () => {
|
|
93
|
+
const rootPath = await createProject();
|
|
94
|
+
await writeFile(join(rootPath, 'app/src/schemas/ObjectSchemas/Cache.js'), "export default { objectType: 'cache', storageResources: { main: { storageType: 'dynamoDB', tableName: 'CurrentData' } } };\n");
|
|
95
|
+
await writeFile(join(rootPath, 'app/src/schemas/FlowSchemas/Cache.js'), "export default { flowTag: 'cacheFlow', event: ['lambdaSyncApi'], statusType: 'storedCache', objType: { objectType: 'cache' } };\n");
|
|
96
|
+
|
|
97
|
+
await generateResourceArtifacts(rootPath);
|
|
98
|
+
|
|
99
|
+
const iam = await readFile(join(rootPath, 'app/sls_yaml/generatedCode/source/generate-shared-resource.yml'), 'utf8');
|
|
100
|
+
const role = roleBlock(iam, 'CacheFlowRole');
|
|
101
|
+
assert.match(role, /CurrentData/);
|
|
102
|
+
assert.doesNotMatch(role, /Orders|WebSocketTask/);
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
function roleBlock(iam, roleName) {
|
|
106
|
+
const match = iam.match(new RegExp(`^ ${roleName}:\\n(?:(?!^ [A-Za-z][A-Za-z0-9]*Role:\\n)[\\s\\S])*`, 'm'));
|
|
107
|
+
assert.ok(match, `Missing ${roleName} in generated IAM`);
|
|
108
|
+
return match[0];
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
async function createProject() {
|
|
112
|
+
const rootPath = await mkdtemp(join(tmpdir(), 'generate-service-code-v2-resource-'));
|
|
113
|
+
roots.add(rootPath);
|
|
114
|
+
const schemas = join(rootPath, 'app/src/schemas');
|
|
115
|
+
await Promise.all(['ObjectSchemas', 'RelationshipSchemas', 'FlowSchemas'].map(directory => mkdir(join(schemas, directory), { recursive: true })));
|
|
116
|
+
await writeFile(join(schemas, 'ObjectSchemas/Order.js'), "export default { objectType: 'order', generatedBy: 'userGenerated', addOnDataStructure: [{ type: 'rbac' }], identifiers: [{ type: 'partitionKey', fieldName: 'orderId' }], storageResources: { main: { storageType: 'dynamoDB', tableName: 'Orders' } } };\n");
|
|
117
|
+
await writeFile(join(schemas, 'RelationshipSchemas/OrderCustomer.js'), "export default { relationshipTag: 'orderCustomer', links: [] };\n");
|
|
118
|
+
await writeFile(join(schemas, 'FlowSchemas/Custom.js'), "export default { flowTag: 'custom', event: ['ownTopic'], outputTopic: true };\n");
|
|
119
|
+
await writeFile(join(schemas, 'FlowSchemas/Upload.js'), "export default { flowTag: 'upload', event: ['s3'] };\n");
|
|
120
|
+
return rootPath;
|
|
121
|
+
}
|
package/jsconfig.json
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, jest, beforeEach, afterEach } from '@jest/globals';
|
|
2
|
-
import path from 'path';
|
|
3
|
-
import fs from 'fs';
|
|
4
|
-
import os from 'os';
|
|
5
|
-
import libs from '../generateResources/IntTest/libs/libs.js';
|
|
6
|
-
import { getObjectSchema } from '@izara_project/izara-core-library-service-schemas';
|
|
7
|
-
|
|
8
|
-
const { getIntTestConfig } = libs;
|
|
9
|
-
|
|
10
|
-
describe('getIntTestConfig path resolution', () => {
|
|
11
|
-
let originalGetDataFromPath;
|
|
12
|
-
let passedArgs;
|
|
13
|
-
|
|
14
|
-
beforeEach(() => {
|
|
15
|
-
originalGetDataFromPath = getObjectSchema.getDataFromPath;
|
|
16
|
-
passedArgs = null;
|
|
17
|
-
getObjectSchema.getDataFromPath = async (_izContext, folderName, rootFolderPath, options) => {
|
|
18
|
-
passedArgs = { folderName, rootFolderPath, options };
|
|
19
|
-
return [];
|
|
20
|
-
};
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
afterEach(() => {
|
|
24
|
-
getObjectSchema.getDataFromPath = originalGetDataFromPath;
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
it('Case 1: should resolve correctly when rootPath includes generateIntegrationTest', async () => {
|
|
28
|
-
const rootPath = '/home/ironfist/Pong/Izara Project/Izara-Market-Product/izara-market-products-sell-offer-price-pong/app/src/generateIntegrationTest/';
|
|
29
|
-
await getIntTestConfig({ logger: console }, 'generateIntegrationTest/libs/', rootPath);
|
|
30
|
-
|
|
31
|
-
expect(passedArgs).not.toBeNull();
|
|
32
|
-
expect(passedArgs.folderName).toBe('libs');
|
|
33
|
-
expect(passedArgs.rootFolderPath).toBe('/home/ironfist/Pong/Izara Project/Izara-Market-Product/izara-market-products-sell-offer-price-pong/app/src/generateIntegrationTest');
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
it('Case 2: should resolve correctly when rootPath is repo root with app/src/... structure', async () => {
|
|
37
|
-
const tmpDir = path.join(os.tmpdir(), 'get-int-test-config-scratch');
|
|
38
|
-
fs.mkdirSync(tmpDir, { recursive: true });
|
|
39
|
-
fs.mkdirSync(path.join(tmpDir, 'app', 'src', 'generateIntegrationTest', 'libs'), { recursive: true });
|
|
40
|
-
|
|
41
|
-
try {
|
|
42
|
-
await getIntTestConfig({ logger: console }, 'generateIntegrationTest/libs/', tmpDir);
|
|
43
|
-
|
|
44
|
-
expect(passedArgs).not.toBeNull();
|
|
45
|
-
expect(passedArgs.folderName).toBe('libs');
|
|
46
|
-
expect(passedArgs.rootFolderPath).toBe(path.join(tmpDir, 'app', 'src', 'generateIntegrationTest'));
|
|
47
|
-
} finally {
|
|
48
|
-
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
49
|
-
}
|
|
50
|
-
});
|
|
51
|
-
});
|
|
@@ -1,169 +0,0 @@
|
|
|
1
|
-
const fs = require('fs');
|
|
2
|
-
const os = require('os');
|
|
3
|
-
const path = require('path');
|
|
4
|
-
|
|
5
|
-
let getIntTestOutputPath;
|
|
6
|
-
let runTemplateItems;
|
|
7
|
-
|
|
8
|
-
const tempDirs = [];
|
|
9
|
-
|
|
10
|
-
beforeAll(async () => {
|
|
11
|
-
({ getIntTestOutputPath, runTemplateItems } =
|
|
12
|
-
await import('../intTestGeneratorShared.js'));
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
afterEach(() => {
|
|
16
|
-
for (const dir of tempDirs.splice(0)) {
|
|
17
|
-
fs.rmSync(dir, { recursive: true, force: true });
|
|
18
|
-
}
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
describe('getIntTestOutputPath', () => {
|
|
22
|
-
it('uses app/src when app directory exists', () => {
|
|
23
|
-
const rootPath = fs.mkdtempSync(
|
|
24
|
-
path.join(os.tmpdir(), 'int-test-output-app-')
|
|
25
|
-
);
|
|
26
|
-
tempDirs.push(rootPath);
|
|
27
|
-
fs.mkdirSync(path.join(rootPath, 'app'));
|
|
28
|
-
|
|
29
|
-
expect(getIntTestOutputPath(rootPath)).toBe(
|
|
30
|
-
path.join(rootPath, 'app', 'src', 'generateIntegrationTest')
|
|
31
|
-
);
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
it('falls back to src when app directory is missing', () => {
|
|
35
|
-
const rootPath = fs.mkdtempSync(
|
|
36
|
-
path.join(os.tmpdir(), 'int-test-output-src-')
|
|
37
|
-
);
|
|
38
|
-
tempDirs.push(rootPath);
|
|
39
|
-
|
|
40
|
-
expect(getIntTestOutputPath(rootPath)).toBe(
|
|
41
|
-
path.join(rootPath, 'src', 'generateIntegrationTest')
|
|
42
|
-
);
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
it('detects app from project root even when output path is different', () => {
|
|
46
|
-
const projectRootPath = fs.mkdtempSync(
|
|
47
|
-
path.join(os.tmpdir(), 'int-test-output-project-root-')
|
|
48
|
-
);
|
|
49
|
-
const outputPath = fs.mkdtempSync(
|
|
50
|
-
path.join(os.tmpdir(), 'int-test-output-custom-')
|
|
51
|
-
);
|
|
52
|
-
tempDirs.push(projectRootPath, outputPath);
|
|
53
|
-
fs.mkdirSync(path.join(projectRootPath, 'app'));
|
|
54
|
-
|
|
55
|
-
expect(getIntTestOutputPath(outputPath, projectRootPath)).toBe(
|
|
56
|
-
path.join(outputPath, 'app', 'src', 'generateIntegrationTest')
|
|
57
|
-
);
|
|
58
|
-
});
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
describe('runTemplateItems', () => {
|
|
62
|
-
it('skips empty array items', async () => {
|
|
63
|
-
const writeSource = jest.fn();
|
|
64
|
-
|
|
65
|
-
await runTemplateItems([[]], {
|
|
66
|
-
writeSource,
|
|
67
|
-
errorPrefix: 'IntTest resource'
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
expect(writeSource).not.toHaveBeenCalled();
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
it('validates items before writing', async () => {
|
|
74
|
-
const writeSource = jest.fn()
|
|
75
|
-
.mockResolvedValueOnce([true, {}])
|
|
76
|
-
.mockResolvedValueOnce([true, {}]);
|
|
77
|
-
|
|
78
|
-
await runTemplateItems([
|
|
79
|
-
{
|
|
80
|
-
templatePath: '/tmp/template.ejs',
|
|
81
|
-
templateData: { ok: true },
|
|
82
|
-
setting: { savePath: '/tmp/out' }
|
|
83
|
-
}
|
|
84
|
-
], {
|
|
85
|
-
writeSource,
|
|
86
|
-
errorPrefix: 'IntTest resource'
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
expect(writeSource).toHaveBeenNthCalledWith(1, expect.any(Object), {
|
|
90
|
-
checkCreateSourcePass: true
|
|
91
|
-
});
|
|
92
|
-
expect(writeSource).toHaveBeenNthCalledWith(2, expect.any(Object), {
|
|
93
|
-
checkCreateSourcePass: false
|
|
94
|
-
});
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
it('preserves configured files when clearing a save path', async () => {
|
|
98
|
-
const savePath = fs.mkdtempSync(
|
|
99
|
-
path.join(os.tmpdir(), 'int-test-preserve-save-path-')
|
|
100
|
-
);
|
|
101
|
-
tempDirs.push(savePath);
|
|
102
|
-
fs.writeFileSync(path.join(savePath, 'saveConfig.js'), 'keep');
|
|
103
|
-
fs.writeFileSync(path.join(savePath, 'old.js'), 'remove');
|
|
104
|
-
fs.mkdirSync(path.join(savePath, 'nested'));
|
|
105
|
-
fs.writeFileSync(path.join(savePath, 'nested', 'stale.json'), '{}');
|
|
106
|
-
|
|
107
|
-
const writeSource = jest.fn()
|
|
108
|
-
.mockResolvedValueOnce([true, {}])
|
|
109
|
-
.mockImplementationOnce(async ({ setting }) => {
|
|
110
|
-
fs.writeFileSync(path.join(setting.savePath, 'IntTestPath.js'), 'new');
|
|
111
|
-
return [true, {}];
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
await runTemplateItems([
|
|
115
|
-
{
|
|
116
|
-
templatePath: '/tmp/template.ejs',
|
|
117
|
-
templateData: { ok: true },
|
|
118
|
-
setting: {
|
|
119
|
-
savePath,
|
|
120
|
-
preserveFileNames: ['saveConfig.js']
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
], {
|
|
124
|
-
writeSource,
|
|
125
|
-
errorPrefix: 'IntTest resource'
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
expect(fs.existsSync(path.join(savePath, 'saveConfig.js'))).toBe(true);
|
|
129
|
-
expect(fs.readFileSync(path.join(savePath, 'saveConfig.js'), 'utf8')).toBe('keep');
|
|
130
|
-
expect(fs.existsSync(path.join(savePath, 'old.js'))).toBe(false);
|
|
131
|
-
expect(fs.existsSync(path.join(savePath, 'nested'))).toBe(false);
|
|
132
|
-
expect(fs.existsSync(path.join(savePath, 'IntTestPath.js'))).toBe(true);
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
it('does not clear save path when cleanSavePath is false', async () => {
|
|
136
|
-
const savePath = fs.mkdtempSync(
|
|
137
|
-
path.join(os.tmpdir(), 'int-test-no-clean-save-path-')
|
|
138
|
-
);
|
|
139
|
-
tempDirs.push(savePath);
|
|
140
|
-
fs.writeFileSync(path.join(savePath, 'config.json'), 'keep');
|
|
141
|
-
fs.mkdirSync(path.join(savePath, 'nested-dir'));
|
|
142
|
-
fs.writeFileSync(path.join(savePath, 'nested-dir', 'file.json'), '{}');
|
|
143
|
-
|
|
144
|
-
const writeSource = jest.fn()
|
|
145
|
-
.mockResolvedValueOnce([true, {}])
|
|
146
|
-
.mockImplementationOnce(async ({ setting }) => {
|
|
147
|
-
fs.writeFileSync(path.join(setting.savePath, 'IntTestPath.js'), 'new');
|
|
148
|
-
return [true, {}];
|
|
149
|
-
});
|
|
150
|
-
|
|
151
|
-
await runTemplateItems([
|
|
152
|
-
{
|
|
153
|
-
templatePath: '/tmp/template.ejs',
|
|
154
|
-
templateData: { ok: true },
|
|
155
|
-
setting: {
|
|
156
|
-
savePath,
|
|
157
|
-
cleanSavePath: false
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
], {
|
|
161
|
-
writeSource,
|
|
162
|
-
errorPrefix: 'IntTest resource'
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
expect(fs.existsSync(path.join(savePath, 'config.json'))).toBe(true);
|
|
166
|
-
expect(fs.existsSync(path.join(savePath, 'nested-dir'))).toBe(true);
|
|
167
|
-
expect(fs.existsSync(path.join(savePath, 'IntTestPath.js'))).toBe(true);
|
|
168
|
-
});
|
|
169
|
-
});
|