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.

400 lines (340 loc) 12.5 kB
/** * Svelte 4 Adapter for Signal-Σ - Uses traditional Svelte stores * Compatible with Svelte 4.x and earlier versions * * NOTE: This adapter is disabled because Svelte is not installed. * To enable, install Svelte and uncomment the code below. */ // Disabled - requires Svelte to be installed export const SVELTE4_ADAPTER_DISABLED = true; /* // Note: Svelte 4 adapter requires Svelte to be installed // import { writable, derived, readable } from 'svelte/store'; // import { onMount, onDestroy } from 'svelte'; import { fetch } from '../algebras/fetch'; import { machine } from '../algebras/state'; import { Effect, effect } from '../core/effect'; import { Signal, signal } from '../core/signal'; // Svelte 4 Signal adapter - uses writable stores */ // Placeholder exports to avoid module errors export const useSignal = () => { throw new Error('Svelte4 adapter is disabled'); }; export const useComputed = () => { throw new Error('Svelte4 adapter is disabled'); }; export const useMachine = () => { throw new Error('Svelte4 adapter is disabled'); }; export const useFetch = () => { throw new Error('Svelte4 adapter is disabled'); }; export const useAsyncSignal = () => { throw new Error('Svelte4 adapter is disabled'); }; export const useAsyncResource = () => { throw new Error('Svelte4 adapter is disabled'); }; export const usePersistentSignal = () => { throw new Error('Svelte4 adapter is disabled'); }; export const useDebouncedSignal = () => { throw new Error('Svelte4 adapter is disabled'); }; export const useValidatedSignal = () => { throw new Error('Svelte4 adapter is disabled'); }; /* // Original code commented out - requires Svelte to be installed export function useSignal<T>(initialValue: T): [() => T, (value: T) => void] { const store = writable(initialValue); let currentValue = initialValue; // Subscribe to store changes to keep track of current value const unsubscribe = store.subscribe(value => { currentValue = value; }); // Clean up subscription on component destroy onDestroy(() => { unsubscribe(); }); const getValue = () => currentValue; const setValue = (value: T) => { store.set(value); }; return [getValue, setValue]; } // Svelte 4 Computed adapter - uses derived stores export function useComputed<T>(compute: () => T): () => T { let _currentValue = compute(); // For now, return a simple function that computes the value // In a real implementation, this would track dependencies return () => compute(); } // Svelte 4 Effect adapter export function useEffect<T>( initialValue: T, ): [() => T, (value: T) => void, Effect<T>] { const store = writable(initialValue); const effectInstance = effect(initialValue); let currentValue = initialValue; // Subscribe to store changes const unsubscribe = store.subscribe(value => { currentValue = value; effectInstance._set(value); }); // Clean up on destroy onDestroy(() => { unsubscribe(); }); const getValue = () => currentValue; const setValue = (value: T) => { store.set(value); }; return [getValue, setValue, effectInstance]; } // Svelte 4 State Machine adapter export function useMachine<S, A>( initialState: S, reducer: (state: S, action: A) => S, ): [() => S, (action: A) => void] { const machineInstance = machine(initialState, reducer); const store = writable(machineInstance.state); let currentState = machineInstance.state; // Subscribe to machine state changes const machineUnsubscribe = machineInstance.subscribe((newState) => { currentState = newState; store.set(newState); }); // Subscribe to store changes const storeUnsubscribe = store.subscribe(state => { currentState = state; }); // Clean up on destroy onDestroy(() => { machineUnsubscribe(); storeUnsubscribe(); }); const getState = () => currentState; const send = (action: A) => machineInstance.send(action); return [getState, send]; } // Svelte 4 Fetch adapter export function useFetch<T>( fetcher: () => Promise<T>, ): [() => { data?: T; loading: boolean; error?: Error }, () => void, (n: number) => void] { const fetchInstance = fetch(fetcher); const store = writable(fetchInstance.value()); let currentState = fetchInstance.value(); // Subscribe to fetch state changes const fetchUnsubscribe = fetchInstance.subscribe((newState) => { currentState = newState; store.set(newState); }); // Subscribe to store changes const storeUnsubscribe = store.subscribe(state => { currentState = state; }); // Clean up on destroy onDestroy(() => { fetchUnsubscribe(); storeUnsubscribe(); }); const getState = () => currentState; const refetch = () => { const newFetch = fetch(fetcher); newFetch.subscribe((newState) => { currentState = newState; store.set(newState); }); return newFetch; }; const retry = (n: number) => { const retryFetch = fetchInstance.retry(n); retryFetch.subscribe((newState) => { currentState = newState; store.set(newState); }); return retryFetch; }; return [getState, refetch, retry]; } // Svelte 4 Async Signal adapter export function useAsyncSignal<T>( asyncFn: () => Promise<T>, initialValue?: T, ): [() => { data?: T; loading: boolean; error?: Error }, () => void, (value: T) => void] { const initialState = { data: initialValue, loading: false, error: undefined, }; const store = writable<{ data?: T; loading: boolean; error?: Error }>(initialState); let currentState = initialState; // Subscribe to store changes const unsubscribe = store.subscribe(state => { currentState = state; }); // Clean up on destroy onDestroy(() => { unsubscribe(); }); const getState = () => currentState; const refetch = async () => { store.update(state => ({ ...state, loading: true, error: undefined })); try { const data = await asyncFn(); store.set({ data, loading: false, error: undefined }); } catch (error) { store.update(state => ({ ...state, loading: false, error: error instanceof Error ? error : new Error(String(error)), })); } }; const setValue = (value: T) => { store.set({ data: value, loading: false, error: undefined }); }; return [getState, refetch, setValue]; } // Svelte 4 Async Computed adapter export function useAsyncComputed<T>( asyncCompute: () => Promise<T>, _deps: () => unknown[] = () => [], ): () => { data?: T; loading: boolean; error?: Error } { const initialState = { data: undefined, loading: false, error: undefined, }; const store = writable<{ data?: T; loading: boolean; error?: Error }>(initialState); let currentState = initialState; // Subscribe to store changes const unsubscribe = store.subscribe(state => { currentState = state; }); // Clean up on destroy onDestroy(() => { unsubscribe(); }); // Trigger computation on mount onMount(async () => { store.update(state => ({ ...state, loading: true, error: undefined })); try { const data = await asyncCompute(); store.set({ data, loading: false, error: undefined }); } catch (error) { store.update(state => ({ ...state, loading: false, error: error instanceof Error ? error : new Error(String(error)), })); } }); const getState = () => currentState; return getState; } // Svelte 4 Persistent Signal adapter export function usePersistentSignal<T>( key: string, initialValue: T, ): [() => T, (value: T) => void] { // 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 } } const store = writable(storedValue); let currentValue = storedValue; // Subscribe to store changes and persist to localStorage const unsubscribe = store.subscribe(value => { currentValue = value; if (typeof window !== 'undefined') { try { localStorage.setItem(key, JSON.stringify(value)); } catch (e) { // Ignore storage errors } } }); // Clean up on destroy onDestroy(() => { unsubscribe(); }); const getValue = () => currentValue; const setValue = (value: T) => { store.set(value); }; return [getValue, setValue]; } // Svelte 4 Debounced Signal adapter export function useDebouncedSignal<T>( initialValue: T, delay: number, ): [() => T, (value: T) => void, () => T] { const immediateStore = writable(initialValue); const debouncedStore = writable(initialValue); let immediateValue = initialValue; let debouncedValue = initialValue; let timeoutId: NodeJS.Timeout; // Subscribe to immediate store changes const immediateUnsubscribe = immediateStore.subscribe(value => { immediateValue = value; // Clear existing timeout clearTimeout(timeoutId); // Set new timeout for debounced value timeoutId = setTimeout(() => { debouncedStore.set(value); }, delay); }); // Subscribe to debounced store changes const debouncedUnsubscribe = debouncedStore.subscribe(value => { debouncedValue = value; }); // Clean up on destroy onDestroy(() => { clearTimeout(timeoutId); immediateUnsubscribe(); debouncedUnsubscribe(); }); const getImmediate = () => immediateValue; const setImmediate = (value: T) => { immediateStore.set(value); }; const getDebounced = () => debouncedValue; return [getImmediate, setImmediate, getDebounced]; } // Svelte 4 Validated Signal adapter export function useValidatedSignal<T>( initialValue: T, validator: (value: T) => boolean, ): [() => T, (value: T) => void, () => boolean] { const store = writable(initialValue); let currentValue = initialValue; let isValid = validator(initialValue); // Subscribe to store changes const unsubscribe = store.subscribe(value => { currentValue = value; isValid = validator(value); }); // Clean up on destroy onDestroy(() => { unsubscribe(); }); const getValue = () => currentValue; const setValue = (value: T) => { store.set(value); }; const getIsValid = () => isValid; return [getValue, setValue, getIsValid]; } */ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ZlbHRlNC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hZGFwdGVycy9zdmVsdGU0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILDZDQUE2QztBQUM3QyxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLENBQUM7QUFFN0M7Ozs7Ozs7Ozs7RUFVRTtBQUVGLDZDQUE2QztBQUM3QyxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsR0FBRyxFQUFFO0lBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztBQUNqRCxDQUFDLENBQUM7QUFDRixNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsR0FBRyxFQUFFO0lBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztBQUNqRCxDQUFDLENBQUM7QUFDRixNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsR0FBRyxFQUFFO0lBQzdCLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztBQUNqRCxDQUFDLENBQUM7QUFDRixNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsR0FBRyxFQUFFO0lBQzNCLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztBQUNqRCxDQUFDLENBQUM7QUFDRixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsR0FBRyxFQUFFO0lBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztBQUNqRCxDQUFDLENBQUM7QUFDRixNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLEVBQUU7SUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0FBQ2pELENBQUMsQ0FBQztBQUNGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLEdBQUcsRUFBRTtJQUN0QyxNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUM7QUFDakQsQ0FBQyxDQUFDO0FBQ0YsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxFQUFFO0lBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztBQUNqRCxDQUFDLENBQUM7QUFDRixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLEVBQUU7SUFDckMsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0FBQ2pELENBQUMsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQThWRSJ9