flowie
Version:
Library for creating, and working with flows
104 lines • 4.77 kB
JavaScript
;
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