UNPKG

resig.js

Version:

Universal reactive signal library with complete platform features: signals, animations, CRDTs, scheduling, DOM integration. Works identically across React, SolidJS, Svelte, Vue, and Qwik.

305 lines 25.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.useAsyncComputedSignal = exports.useAsyncComputed = exports.useAsyncSignal = exports.usePersistentSignal = exports.useDebouncedSignal = exports.useValidatedSignal = exports.useDerived = exports.useFetch = exports.useMachine = exports.useEffect = exports.useComputed = exports.useSignal = void 0; const react_1 = require("react"); const signal_1 = require("../core/signal"); const effect_1 = require("../core/effect"); const state_1 = require("../algebras/state"); const fetch_1 = require("../algebras/fetch"); /** * React Hooks for Signal-Σ - NO dependency arrays needed! * All hooks use useSyncExternalStore for automatic re-renders */ // Hook for basic signals - replaces useState completely function useSignal(initialValue) { const sigRef = (0, react_1.useRef)(); if (!sigRef.current) { sigRef.current = (0, signal_1.signal)(initialValue); } const value = (0, react_1.useSyncExternalStore)(sigRef.current.subscribe, sigRef.current.value); return [value, sigRef.current._set]; } exports.useSignal = useSignal; // Hook for computed signals - NO dependency arrays! // React's re-rendering handles the reactivity automatically function useComputed(compute) { return compute(); } exports.useComputed = useComputed; // Hook for effects - monadic composition function useEffect(initialValue) { const effRef = (0, react_1.useRef)(); if (!effRef.current) { effRef.current = (0, effect_1.effect)(initialValue); } const value = (0, react_1.useSyncExternalStore)(effRef.current.subscribe, effRef.current.value); return [value, effRef.current._set, effRef.current]; } exports.useEffect = useEffect; // Hook for state machines - replaces complex useState patterns function useMachine(initialState, reducer) { const machineRef = (0, react_1.useRef)(); if (!machineRef.current) { machineRef.current = (0, state_1.machine)(initialState, reducer); } const state = (0, react_1.useSyncExternalStore)(machineRef.current.subscribe, () => machineRef.current.state); return [state, machineRef.current.send]; } exports.useMachine = useMachine; // Hook for async data fetching - replaces React Query function useFetch(fetcher) { const fetchRef = (0, react_1.useRef)(); if (!fetchRef.current) { fetchRef.current = (0, fetch_1.fetch)(fetcher); } const state = (0, react_1.useSyncExternalStore)(fetchRef.current.subscribe, fetchRef.current.value); return [ state, fetchRef.current.refetch, (n) => { const retryFetch = fetchRef.current.retry(n); // Subscribe to retry results retryFetch.subscribe((retryState) => { fetchRef.current._set(retryState); }); } ]; } exports.useFetch = useFetch; // Hook for derived/computed values from multiple signals // React's re-rendering handles the reactivity automatically function useDerived(derive) { return derive(); } exports.useDerived = useDerived; // Hook for signal with validation function useValidatedSignal(initialValue, validator, onError) { const sigRef = (0, react_1.useRef)(); const isValidRef = (0, react_1.useRef)(); if (!sigRef.current) { sigRef.current = (0, signal_1.signal)(initialValue); } if (!isValidRef.current) { isValidRef.current = (0, signal_1.signal)(validator(initialValue)); } const setValue = (value) => { const valid = validator(value); if (valid) { sigRef.current._set(value); isValidRef.current._set(true); } else { isValidRef.current._set(false); onError?.(value); } }; const value = (0, react_1.useSyncExternalStore)(sigRef.current.subscribe, sigRef.current.value); const valid = (0, react_1.useSyncExternalStore)(isValidRef.current.subscribe, isValidRef.current.value); return [value, setValue, valid]; } exports.useValidatedSignal = useValidatedSignal; // Hook for debounced signals function useDebouncedSignal(initialValue, delay) { const immediateRef = (0, react_1.useRef)(); const debouncedRef = (0, react_1.useRef)(); const timeoutRef = (0, react_1.useRef)(); if (!immediateRef.current) { immediateRef.current = (0, signal_1.signal)(initialValue); } if (!debouncedRef.current) { debouncedRef.current = (0, signal_1.signal)(initialValue); } const setValue = (value) => { immediateRef.current._set(value); clearTimeout(timeoutRef.current); timeoutRef.current = setTimeout(() => { debouncedRef.current._set(value); }, delay); }; const immediateValue = (0, react_1.useSyncExternalStore)(immediateRef.current.subscribe, immediateRef.current.value); const debouncedValue = (0, react_1.useSyncExternalStore)(debouncedRef.current.subscribe, debouncedRef.current.value); return [immediateValue, setValue, debouncedValue]; } exports.useDebouncedSignal = useDebouncedSignal; // Hook for persistent signals (localStorage) function usePersistentSignal(key, initialValue) { const sigRef = (0, react_1.useRef)(); if (!sigRef.current) { // Try to load from localStorage let storedValue = initialValue; try { const stored = localStorage.getItem(key); if (stored) { storedValue = JSON.parse(stored); } } catch (e) { // Use initial value if parsing fails } sigRef.current = (0, signal_1.signal)(storedValue); // Subscribe to changes and persist them sigRef.current.subscribe(() => { try { localStorage.setItem(key, JSON.stringify(sigRef.current.value())); } catch (e) { // Ignore storage errors } }); } const value = (0, react_1.useSyncExternalStore)(sigRef.current.subscribe, sigRef.current.value); return [value, sigRef.current._set]; } exports.usePersistentSignal = usePersistentSignal; // Hook for async signals - handles Promise-based values function useAsyncSignal(asyncFn, initialValue) { const stateRef = (0, react_1.useRef)(); const abortControllerRef = (0, react_1.useRef)(); if (!stateRef.current) { stateRef.current = (0, signal_1.signal)({ data: initialValue, loading: false, error: undefined, }); } const refetch = () => { // Cancel previous request if (abortControllerRef.current) { abortControllerRef.current.abort(); } abortControllerRef.current = new AbortController(); stateRef.current._set({ data: stateRef.current.value().data, loading: true, error: undefined, }); asyncFn() .then((data) => { if (!abortControllerRef.current?.signal.aborted) { stateRef.current._set({ data, loading: false, error: undefined }); } }) .catch((error) => { if (!abortControllerRef.current?.signal.aborted) { stateRef.current._set({ data: stateRef.current.value().data, loading: false, error: error instanceof Error ? error : new Error(String(error)), }); } }); }; const setValue = (value) => { stateRef.current._set({ data: value, loading: false, error: undefined }); }; const state = (0, react_1.useSyncExternalStore)(stateRef.current.subscribe, stateRef.current.value); return [state, refetch, setValue]; } exports.useAsyncSignal = useAsyncSignal; // Hook for async computed values - Simplified approach to avoid infinite loops // Use manual trigger pattern for now until we can implement proper dependency tracking function useAsyncComputed(asyncCompute, deps = []) { const stateRef = (0, react_1.useRef)(); const abortControllerRef = (0, react_1.useRef)(); const lastDepsRef = (0, react_1.useRef)([]); const isInitializedRef = (0, react_1.useRef)(false); if (!stateRef.current) { stateRef.current = (0, signal_1.signal)({ data: undefined, loading: false, error: undefined, }); } // Check if dependencies changed const depsChanged = !isInitializedRef.current || deps.length !== lastDepsRef.current.length || deps.some((dep, index) => dep !== lastDepsRef.current[index]); if (depsChanged) { isInitializedRef.current = true; lastDepsRef.current = [...deps]; // Cancel previous computation if (abortControllerRef.current) { abortControllerRef.current.abort(); } abortControllerRef.current = new AbortController(); // Defer state update to avoid render-time updates setTimeout(() => { stateRef.current._set({ data: stateRef.current.value().data, loading: true, error: undefined, }); asyncCompute() .then((data) => { if (!abortControllerRef.current?.signal.aborted) { stateRef.current._set({ data, loading: false, error: undefined }); } }) .catch((error) => { if (!abortControllerRef.current?.signal.aborted) { stateRef.current._set({ data: stateRef.current.value().data, loading: false, error: error instanceof Error ? error : new Error(String(error)), }); } }); }, 0); } const state = (0, react_1.useSyncExternalStore)(stateRef.current.subscribe, stateRef.current.value); return state; } exports.useAsyncComputed = useAsyncComputed; // Hook for async computed signals - returns a signal that can be used in other computations function useAsyncComputedSignal(asyncCompute, deps = []) { const stateRef = (0, react_1.useRef)(); const abortControllerRef = (0, react_1.useRef)(); const lastDepsRef = (0, react_1.useRef)([]); const isInitializedRef = (0, react_1.useRef)(false); if (!stateRef.current) { stateRef.current = (0, signal_1.signal)({ data: undefined, loading: false, error: undefined, }); } // Check if dependencies changed const depsChanged = !isInitializedRef.current || deps.length !== lastDepsRef.current.length || deps.some((dep, index) => dep !== lastDepsRef.current[index]); if (depsChanged) { isInitializedRef.current = true; lastDepsRef.current = [...deps]; // Cancel previous computation if (abortControllerRef.current) { abortControllerRef.current.abort(); } abortControllerRef.current = new AbortController(); // Defer state update to avoid render-time updates setTimeout(() => { stateRef.current._set({ data: stateRef.current.value().data, loading: true, error: undefined, }); asyncCompute() .then((data) => { if (!abortControllerRef.current?.signal.aborted) { stateRef.current._set({ data, loading: false, error: undefined }); } }) .catch((error) => { if (!abortControllerRef.current?.signal.aborted) { stateRef.current._set({ data: stateRef.current.value().data, loading: false, error: error instanceof Error ? error : new Error(String(error)), }); } }); }, 0); } return stateRef.current; } exports.useAsyncComputedSignal = useAsyncComputedSignal; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhY3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWRhcHRlcnMvcmVhY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaUNBQXFEO0FBQ3JELDJDQUFpRTtBQUNqRSwyQ0FBZ0Q7QUFDaEQsNkNBQTBEO0FBQzFELDZDQUFpRDtBQUNqRDs7O0dBR0c7QUFFSCx3REFBd0Q7QUFDeEQsU0FBZ0IsU0FBUyxDQUFJLFlBQWU7SUFDMUMsTUFBTSxNQUFNLEdBQUcsSUFBQSxjQUFNLEdBQWEsQ0FBQztJQUNuQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3BCLE1BQU0sQ0FBQyxPQUFPLEdBQUcsSUFBQSxlQUFNLEVBQUMsWUFBWSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLElBQUEsNEJBQW9CLEVBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuRixPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxPQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdkMsQ0FBQztBQVJELDhCQVFDO0FBRUQsb0RBQW9EO0FBQ3BELDREQUE0RDtBQUM1RCxTQUFnQixXQUFXLENBQUksT0FBZ0I7SUFDN0MsT0FBTyxPQUFPLEVBQUUsQ0FBQztBQUNuQixDQUFDO0FBRkQsa0NBRUM7QUFFRCx5Q0FBeUM7QUFDekMsU0FBZ0IsU0FBUyxDQUFJLFlBQWU7SUFDMUMsTUFBTSxNQUFNLEdBQUcsSUFBQSxjQUFNLEdBQWEsQ0FBQztJQUNuQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3BCLE1BQU0sQ0FBQyxPQUFPLEdBQUcsSUFBQSxlQUFNLEVBQUMsWUFBWSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLElBQUEsNEJBQW9CLEVBQUMsTUFBTSxD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