UNPKG

rvx

Version:

A signal based rendering library

68 lines 1.59 kB
import { NOOP } from "./internals/noop.js"; import { TEARDOWN_STACK } from "./internals/teardown-stack.js"; import { useStack } from "./internals/use-stack.js"; function dispose(hooks) { for (let i = hooks.length - 1; i >= 0; i--) { hooks[i](); } } export function onLeak(hook) { if (TEARDOWN_STACK.length > 0) { throw new Error("G4"); } TEARDOWN_STACK.push({ push: hook }); } export function capture(fn) { const hooks = []; try { useStack(TEARDOWN_STACK, hooks, fn); } catch (error) { dispose(hooks); throw error; } const length = hooks.length; return length === 1 ? hooks[0] : (length === 0 ? NOOP : () => dispose(hooks)); } export function captureSelf(fn) { let disposed = false; let dispose = NOOP; let value; dispose = capture(() => { value = fn(() => { disposed = true; dispose(); }); }); if (disposed) { dispose(); } return value; } export function uncapture(fn) { return useStack(TEARDOWN_STACK, undefined, fn); } const NOCAPTURE = { push() { throw new Error("G0"); }, }; export function nocapture(fn) { return useStack(TEARDOWN_STACK, NOCAPTURE, fn); } export function teardownOnError(fn) { let value; teardown(capture(() => { value = fn(); })); return value; } export function teardown(hook) { const length = TEARDOWN_STACK.length; if (length > 0) { TEARDOWN_STACK[length - 1]?.push(hook); } } //# sourceMappingURL=lifecycle.js.map