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.

247 lines 17.6 kB
/** * Signal-Σ Universal Plugin Adapter for Svelte 5 * Provides the EXACT same API as React, SolidJS, Vue, Qwik * * This file uses Svelte stores for proven reactivity */ import { signal } from '../core/signal'; import { machine } from '../algebras/state'; /** * Universal useSignal - adapted for Svelte 5 reactivity * @param {any} initialValue - Initial value for the signal * @param {Function} plugins - Optional composed plugins to apply * @returns {[any, Function]} - [reactiveValue, setValue] tuple */ export function useSignal(initialValue, plugins = null) { const coreSignal = plugins ? plugins(signal(initialValue)) : signal(initialValue); let state = $state(coreSignal.value()); $effect(() => { const unsubscribe = coreSignal.subscribe((newValue) => { state = newValue; }); return unsubscribe; }); const setValue = (value) => { // Handle functional updates like React const newValue = typeof value === 'function' ? value(state) : value; console.log('setValue called with:', value, 'resolved to:', newValue); // Update both the local state and the core signal state = newValue; coreSignal._set(newValue); }; // Return a getter function that properly accesses the reactive state // The key is to access state inside the closure, as Svelte suggested const getValue = () => { console.log('useSignal getValue called, state:', state); return state; }; return [getValue, setValue]; } /** * Universal useComputed - same API across all frameworks! * @param {Function} compute - Computation function * @param {Function} plugins - Optional composed plugins to apply * @returns {Function} - getValue function */ export function useComputed(compute, _plugins = null) { // For now, keep it simple - just use Svelte's $derived const computedValue = $derived(compute()); return () => computedValue; } /** * Universal useEffect - same API across all frameworks! * @param {Function} effect - Effect function that may return cleanup * @param {Array} deps - Optional dependency array */ export function useEffect(effect, deps = null) { if (deps === null) { // No dependencies - run on every change $effect(() => { const cleanup = effect(); return cleanup; }); } else { // With dependencies - track specific values $effect(() => { // Access all dependencies to track them deps.forEach((dep) => { if (typeof dep === 'function') { // This is likely a signal, call it to track it dep(); } else { // Static value, just access it dep; } }); const cleanup = effect(); return cleanup; }); } } /** * Universal useMachine - same API across all frameworks! * @param {any} initialState - Initial state * @param {Function} reducer - State reducer function * @param {Function} plugins - Optional composed plugins to apply * @returns {[Function, Function]} - [getState, send] */ export function useMachine(initialState, reducer, plugins = null) { const coreMachine = plugins ? plugins(machine(initialState, reducer)) : machine(initialState, reducer); let state = $state(coreMachine.state); $effect(() => { const unsubscribe = coreMachine.subscribe((newState) => { state = newState; }); return unsubscribe; }); const getState = () => state; const send = (action) => coreMachine.send(action); return [getState, send]; } /** * Universal useFetch - same API across all frameworks! * @param {Function} fetcher - Async function to fetch data * @param {Function} plugins - Optional composed plugins to apply * @returns {[Function, Function, Function]} - [getState, refetch, retry] */ export function useFetch(fetcher, _plugins = null) { const initialState = { data: undefined, loading: false, error: undefined }; let state = $state(initialState); const getState = () => state; const refetch = async () => { state = { ...state, loading: true, error: undefined }; try { const data = await fetcher(); state = { data, loading: false, error: undefined }; } catch (error) { state = { ...state, loading: false, error: error }; } }; const retry = (times) => { for (let i = 0; i < times; i++) { refetch(); } }; return [getState, refetch, retry]; } /** * Universal useAsyncSignal - same API across all frameworks! * @param {Function} asyncFn - Async function * @param {any} initialValue - Initial value * @param {Function} plugins - Optional composed plugins to apply * @returns {[Function, Function, Function]} - [getState, refetch, setValue] */ export function useAsyncSignal(asyncFn, initialValue = undefined, _plugins = null) { const initialState = { data: initialValue, loading: false, error: undefined }; let state = $state(initialState); const getState = () => state; const refetch = async () => { state = { ...state, loading: true, error: undefined }; try { const data = await asyncFn(); state = { data, loading: false, error: undefined }; } catch (error) { state = { ...state, loading: false, error: error }; } }; const setValue = (value) => { state = { data: value, loading: false, error: undefined }; }; return [getState, refetch, setValue]; } /** * Universal usePersistentSignal - same API across all frameworks! * @param {string} key - Storage key * @param {any} initialValue - Initial value * @param {Function} plugins - Optional composed plugins to apply * @returns {[Function, Function]} - [getValue, setValue] */ export function usePersistentSignal(key, initialValue, _plugins = null) { // Try to load from localStorage let storedValue = initialValue; if (typeof window !== 'undefined') { try { const stored = localStorage.getItem(key); if (stored) { storedValue = JSON.parse(stored); } } catch (e) { // Use initial value if parsing fails } } let state = $state(storedValue); // Persist to localStorage when state changes $effect(() => { if (typeof window !== 'undefined') { try { localStorage.setItem(key, JSON.stringify(state)); } catch (e) { // Ignore storage errors } } }); const setValue = (value) => { // Handle functional updates like React const newValue = typeof value === 'function' ? value(state) : value; state = newValue; }; // Return a getter function that properly accesses the reactive state const getValue = () => { console.log('usePersistentSignal getValue called, state:', state); return state; }; return [getValue, setValue]; } /** * Universal useDebouncedSignal - same API across all frameworks! * @param {any} initialValue - Initial value * @param {number} delay - Debounce delay in ms * @param {Function} plugins - Optional composed plugins to apply * @returns {[Function, Function, Function]} - [getImmediate, setImmediate, getDebounced] */ export function useDebouncedSignal(initialValue, delay, _plugins = null) { let [immediateState, setImmediateState] = useSignal(initialValue); let [debouncedState, setDebouncedState] = useSignal(initialValue); let timeoutId; // Update debounced value when immediate value changes useEffect(() => { clearTimeout(timeoutId); timeoutId = setTimeout(() => { setDebouncedState(immediateState()); }, delay); return () => clearTimeout(timeoutId); }); const getImmediate = () => immediateState(); const setImmediate = (value) => { setImmediateState(value); }; const getDebounced = () => debouncedState(); return [getImmediate, setImmediate, getDebounced]; } /** * Universal useValidatedSignal - same API across all frameworks! * @param {any} initialValue - Initial value * @param {Function} validator - Validation function * @param {Function} plugins - Optional composed plugins to apply * @returns {[Function, Function, Function]} - [getValue, setValue, getIsValid] */ export function useValidatedSignal(initialValue, validator, _plugins = null) { let state = $state(initialValue); const getValue = () => state; const setValue = (value) => { state = value; }; const getIsValid = () => validator(state); return [getValue, setValue, getIsValid]; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJhbWV3b3JrLnN2ZWx0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hZGFwdGVycy9mcmFtZXdvcmsuc3ZlbHRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQVM1Qzs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsWUFBaUIsRUFBRSxVQUFlLElBQUk7SUFDOUQsTUFBTSxVQUFVLEdBQUcsT0FBTztRQUN4QixDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMvQixDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3pCLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUV2QyxPQUFPLENBQUMsR0FBRyxFQUFFO1FBQ1gsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQWEsRUFBRSxFQUFFO1lBQ3pELEtBQUssR0FBRyxRQUFRLENBQUM7UUFDbkIsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDLENBQUMsQ0FBQztJQUVILE1BQU0sUUFBUSxHQUFHLENBQUMsS0FBVSxFQUFFLEVBQUU7UUFDOUIsdUNBQXVDO1FBQ3ZDLE1BQU0sUUFBUSxHQUFHLE9BQU8sS0FBSyxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDcEUsT0FBTyxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3RFLGtEQUFrRDtRQUNsRCxLQUFL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