UNPKG

flowie

Version:

Library for creating, and working with flows

104 lines 4.77 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); function createFlowDeclarationManager(flowDeclarationOrFunctionList, previousDeclaration) { const flowDeclaration = addNextItemToFlowDeclaration(previousDeclaration, flowDeclarationOrFunctionList); return createFlowieDeclarationManagerRuntime(flowDeclaration); } exports.default = createFlowDeclarationManager; function createFlowieDeclarationManagerRuntime(flowDeclaration) { return Object.freeze({ ...flowDeclaration, pipe(flowFunctionDetailsOrflowieExecuteDeclaration) { const nextFlowieExecuteDeclaration = flowFunctionDetailsOrflowieExecuteDeclaration; if (isFlowieExecutionDeclaration(nextFlowieExecuteDeclaration)) { const nextFlowDeclaration = mergeDeclarations(flowDeclaration, nextFlowieExecuteDeclaration); return createFlowieDeclarationManagerRuntime(nextFlowDeclaration); } const flowFunctionDetails = flowFunctionDetailsOrflowieExecuteDeclaration; return createFlowDeclarationManager([flowFunctionDetails], flowDeclaration); }, split(declarationManagerOrFunctionDetailsList) { return createFlowDeclarationManager(declarationManagerOrFunctionDetailsList, flowDeclaration); } }); } function isFlowieExecutionDeclaration(flowieExecutionDeclarationCandidate) { return typeof flowieExecutionDeclarationCandidate.isAsync === 'boolean' && Array.isArray(flowieExecutionDeclarationCandidate.flows) && flowieExecutionDeclarationCandidate.allFunctionsNames instanceof Set; } exports.isFlowieExecutionDeclaration = isFlowieExecutionDeclaration; function mergeDeclarations(previousDeclaration, nextDeclaration) { return { isAsync: previousDeclaration.isAsync || nextDeclaration.isAsync, allFunctionsNames: new Set([...previousDeclaration.allFunctionsNames, ...nextDeclaration.allFunctionsNames]), flows: previousDeclaration.flows.concat({ flows: nextDeclaration.flows }) }; } function addNextItemToFlowDeclaration(previousDeclaration, flowDeclarationOrFunctionList) { const { isAsync, allFunctionsNames, flowElements } = flowDeclarationOrFunctionList.reduce(mergeFlowDeclarationAttributes, { isAsync: false, flowElements: [], allFunctionsNames: new Set() }); if (!previousDeclaration) { return { isAsync: isAsync, allFunctionsNames: allFunctionsNames, flows: [createFlowElementFromElements(flowElements)] }; } return { isAsync: previousDeclaration.isAsync || isAsync, allFunctionsNames: new Set([...previousDeclaration.allFunctionsNames, ...allFunctionsNames]), flows: previousDeclaration.flows.concat(createFlowElementFromElements(flowElements)) }; } function mergeFlowDeclarationAttributes(flowDeclarationAttributes, declarationManagerOrFunctionDetails) { return { isAsync: flowDeclarationAttributes.isAsync || declarationManagerOrFunctionDetails.isAsync, allFunctionsNames: new Set([ ...flowDeclarationAttributes.allFunctionsNames, ...getFunctionNames(declarationManagerOrFunctionDetails) ]), flowElements: flowDeclarationAttributes.flowElements.concat(getFlowElement(declarationManagerOrFunctionDetails)) }; } function createFlowElementFromElements(flowElements) { if (flowElements.length === 1) { const [firstFlowElement] = flowElements; const flowieDeclaration = firstFlowElement; if (flowieDeclaration.flows) { return flowieDeclaration; } return { pipe: firstFlowElement.name }; } return { split: flowElements.map(getNameOrFlowieDeclaration) }; } function getFunctionNames(declarationManagerOrFunctionDetails) { const flowDeclaration = declarationManagerOrFunctionDetails; if (isFlowieExecutionDeclaration(flowDeclaration)) { return Array.from(flowDeclaration.allFunctionsNames); } const flowFunctionDetails = declarationManagerOrFunctionDetails; return [flowFunctionDetails.name]; } function getFlowElement(declarationManagerOrFunctionDetails) { const flowDeclaration = declarationManagerOrFunctionDetails; if (isFlowieExecutionDeclaration(flowDeclaration)) { return { flows: flowDeclaration.flows, name: flowDeclaration.name }; } return declarationManagerOrFunctionDetails; } function getNameOrFlowieDeclaration(flowElement) { const flowieDeclaration = flowElement; if (flowieDeclaration.flows) { return flowieDeclaration; } return flowElement.name; } //# sourceMappingURL=createFlowDeclarationManager.js.map