UNPKG

flowie

Version:

Library for creating, and working with flows

122 lines 6.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const functionConstructors_1 = require("../functionConstructors"); const flowieContainerSignature = Symbol('flowieContainerSignature'); function createFlowieContainer() { const flowieContainer = { [flowieContainerSignature]: flowieContainerSignature, latestDetailsAdded: [], allFunctionsNames: new Set(), functionsContainer: Object.freeze({}), register(...possibleFunctionRegister) { return registerFlowFunctionsList({}, ...possibleFunctionRegister); }, merge(...containersOrFunctions) { return mergeWithOtherContainerAndFunctions(createFlowieContainer(), ...containersOrFunctions); }, getFunctionDetails() { return null; }, isAsyncFunction() { return false; } }; return Object.freeze(flowieContainer); } exports.default = createFlowieContainer; function isFlowieContainer(possibleFlowieContainer) { return Boolean(possibleFlowieContainer) && flowieContainerSignature in possibleFlowieContainer; } exports.isFlowieContainer = isFlowieContainer; function registerFlowFunctionsList(previousFunctionsContainer, ...possibleFunctionRegister) { const initialFunctionRegister = { functions: new Map(Object.values(previousFunctionsContainer).map(getFunctionAsKey)), functionsDetailsList: [] }; const { functionsDetailsList, functions } = possibleFunctionRegister .reduce(getUniqueFunctionDetails, initialFunctionRegister); const newFunctionsContainer = Object .fromEntries(functionsDetailsList.map(getNameAsKey)); const container = { ...previousFunctionsContainer, ...newFunctionsContainer }; const latestDetailsAdded = possibleFunctionRegister.map(getFunctionDetail, { functions, container }); return createContainer(container, latestDetailsAdded); } function mergeWithOtherContainerAndFunctions(previousFunctionsContainer, ...containersOrFunctions) { return containersOrFunctions.reduce(mergeWithOtherContainerOrRegisterFunctions, previousFunctionsContainer); } function getUniqueFunctionDetails(uniqueFunctionsDetails, possibleFunctionRegister) { if (Array.isArray(possibleFunctionRegister)) { const [name, flowFunction] = possibleFunctionRegister; return getFlowFunctionDetailsForTuple(name, flowFunction, uniqueFunctionsDetails); } if (typeof possibleFunctionRegister === 'function' && !uniqueFunctionsDetails.functions.has(possibleFunctionRegister)) { return getFlowFunctionDetailsForFlowFunction(possibleFunctionRegister, uniqueFunctionsDetails); } return uniqueFunctionsDetails; } function getFlowFunctionDetailsForFlowFunction(flowFunction, uniqueFunctionDetails) { const name = getNameForFunction(flowFunction); const flowFunctionDetailsList = { name, flowFunction, isAsync: functionConstructors_1.isAsyncFunction(flowFunction) }; return incrementUniqueFunctionDetails(uniqueFunctionDetails, [flowFunction, name], flowFunctionDetailsList); } function getFlowFunctionDetailsForTuple(name, flowFunction, uniqueFunctions) { const isSaved = uniqueFunctions.functions.has(flowFunction); const newName = isSaved ? uniqueFunctions.functions.get(flowFunction) : name; const flowFunctionDetails = { name, flowFunction, isAsync: functionConstructors_1.isAsyncFunction(flowFunction) }; return incrementUniqueFunctionDetails(uniqueFunctions, [flowFunction, newName], flowFunctionDetails); } function incrementUniqueFunctionDetails(uniqueFunctionDetails, [flowFunction, name], functionsDetails) { return { functions: new Map([...uniqueFunctionDetails.functions.entries(), [flowFunction, name]]), functionsDetailsList: uniqueFunctionDetails.functionsDetailsList.concat(functionsDetails) }; } function mergeWithOtherContainerOrRegisterFunctions(mergedContainer, flowieContainerOrFunction) { const flowieContainer = flowieContainerOrFunction; if (!isFlowieContainer(flowieContainer)) { return mergedContainer.register(flowieContainerOrFunction); } const container = { ...mergedContainer.functionsContainer, ...flowieContainer.functionsContainer }; const latestDetailsAdded = mergedContainer.latestDetailsAdded.concat(flowieContainer.latestDetailsAdded); return createContainer(container, latestDetailsAdded); } function createContainer(functionsContainer, flowFunctionDetailsList) { const newFlowieContainer = { [flowieContainerSignature]: flowieContainerSignature, latestDetailsAdded: flowFunctionDetailsList, allFunctionsNames: new Set(Object.keys(functionsContainer)), functionsContainer: Object.freeze(functionsContainer), register: registerFlowFunctionsList.bind(null, functionsContainer), isAsyncFunction(functionName) { return functionsContainer[functionName].isAsync; }, getFunctionDetails(functionToFind) { return Object.values(functionsContainer).find(matchFlowFunction, { functionToFind }); } }; const finalContainer = Object.assign({ merge: mergeWithOtherContainerAndFunctions.bind(null, newFlowieContainer) }, newFlowieContainer); return Object.freeze(finalContainer); } function getNameAsKey(functionDetails) { return [functionDetails.name, functionDetails]; } function getFunctionAsKey(functionDetails) { return [functionDetails.flowFunction, functionDetails.name]; } function getNameForFunction(flowFunction) { const randomValue = Math.random().toString(36).slice(2); const name = flowFunction.name; return name || `anoymous_${randomValue}`; } function getFunctionDetail(possibleFunctionRegister) { if (Array.isArray(possibleFunctionRegister)) { const [, flowFunction] = possibleFunctionRegister; return this.container[this.functions.get(flowFunction)]; } return this.container[this.functions.get(possibleFunctionRegister)]; } function matchFlowFunction(flowFunctionDetailsWithItem) { return flowFunctionDetailsWithItem.flowFunction === this.functionToFind; } //# sourceMappingURL=createFlowieContainer.js.map