UNPKG

@virtualstate/hooks

Version:
60 lines 1.95 kB
import { createNode } from "@virtualstate/fringe"; export async function Hook({ hook, depth, mutate, hookChildren, ...options }, node) { if (!(hook ?? hookChildren)) { throw new Error("Expected hook or hookChildren"); } const [hooked, nextHook, nextChildrenHook] = await getResult(); if (!hooked.children) { return hooked; } else if (mutate) { return { ...hooked, children: { async *[Symbol.asyncIterator]() { yield* hookChildrenGenerator(hooked); } } }; } else { return new Proxy(hooked, { get(target, prop) { if (prop === "children") { return hookChildrenGenerator(target); } return target[prop]; } }); } async function* hookChildrenGenerator(hooked) { const hookedChildren = nextChildrenHook ? nextChildrenHook(hooked) : hooked.children; for await (const children of hookedChildren) { yield children.map(child => (createNode(Hook({ hook: nextHook, hookChildren: nextChildrenHook, depth: (depth || 0) + 1, mutate }, child)))); } } async function getResult() { const result = hook ? await hook(node) : node; if (isHookTriple(result)) { return result; } else if (isHookPair(result)) { return [...result, hookChildren]; } else { return [result, hook, hookChildren]; } function isHookPair(value) { return value === result && Array.isArray(value) && value.length === 2; } function isHookTriple(value) { return value === result && Array.isArray(value) && value.length === 3; } } } //# sourceMappingURL=index.js.map