import {ChunkType} from "../chunks/types/ChunkType"; import {NodeImplChunk} from "../chunks/types/NodeImplChunk"; import {dependenciesChunkToDependencyDef} from "./dependenciesChunkToDependencyDef"; import {dependencyChunkToDependencyDef} from "./dependencyChunkToDependencyDef"; import {CodeNodeDef} from "./types/CodeNodeDef"; import {DependencyDef} from "./types/DependencyDef"; import {InputHandlers} from "./types/InputHandlers"; import {getCodeFromNodeCodeChunk} from "./utils/getCodeFromNodeCodeChunk"; import {getCodeNameFromNodeCodeChunk} from "./utils/getCodeNameFromNodeCodeChunk"; import {getSpreadOpFromNodeCodeChunk} from "./utils/getSpreadOpFromNodeCodeChunk"; // TODO: Wrap handler function bodies export function nodeImplChunkToCodeNodeDef( nodeImplChunk: NodeImplChunk ): Partial> { let initHandler: string | undefined = undefined; let cleanupHandler: string | undefined = undefined; const dependencies = [] as Array; const inputHandlers = {} as InputHandlers; const spreadInputHandlers = [] as Array; const {children = []} = nodeImplChunk; for (const chunk of children) { switch (chunk.type) { case ChunkType.Dependency: const dependency = dependencyChunkToDependencyDef(chunk); dependencies.push(dependency); break; case ChunkType.Dependencies: const dependencyGroup = dependenciesChunkToDependencyDef(chunk); for (const dependency of dependencyGroup) { dependencies.push(dependency); } break; case ChunkType.NodeCode: const spreadOp = getSpreadOpFromNodeCodeChunk(chunk); if (spreadOp) { spreadInputHandlers.push(getCodeFromNodeCodeChunk(chunk) || ""); } else { const codeName = getCodeNameFromNodeCodeChunk(chunk) || ""; switch (codeName) { case "init": initHandler = getCodeFromNodeCodeChunk(chunk) || ""; break; case "cleanup": cleanupHandler = getCodeFromNodeCodeChunk(chunk) || ""; break; default: if (codeName) { inputHandlers[codeName] = getCodeFromNodeCodeChunk(chunk) || ""; } break; } } break; } } return { cleanupHandler, dependencies, initHandler, inputHandlers, spreadInputHandlers }; }