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
JavaScript
/**
* 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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