@virtualstate/hooks
Version:
60 lines • 1.95 kB
JavaScript
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