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.
290 lines • 24.4 kB
JavaScript
import { useSyncExternalStore, useRef } from 'react';
import { signal } from '../core/signal';
import { effect } from '../core/effect';
import { machine } from '../algebras/state';
import { fetch } from '../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
export function useSignal(initialValue) {
const sigRef = useRef();
if (!sigRef.current) {
sigRef.current = signal(initialValue);
}
const value = useSyncExternalStore(sigRef.current.subscribe, sigRef.current.value);
return [value, sigRef.current._set];
}
// Hook for computed signals - NO dependency arrays!
// React's re-rendering handles the reactivity automatically
export function useComputed(compute) {
return compute();
}
// Hook for effects - monadic composition
export function useEffect(initialValue) {
const effRef = useRef();
if (!effRef.current) {
effRef.current = effect(initialValue);
}
const value = useSyncExternalStore(effRef.current.subscribe, effRef.current.value);
return [value, effRef.current._set, effRef.current];
}
// Hook for state machines - replaces complex useState patterns
export function useMachine(initialState, reducer) {
const machineRef = useRef();
if (!machineRef.current) {
machineRef.current = machine(initialState, reducer);
}
const state = useSyncExternalStore(machineRef.current.subscribe, () => machineRef.current.state);
return [state, machineRef.current.send];
}
// Hook for async data fetching - replaces React Query
export function useFetch(fetcher) {
const fetchRef = useRef();
if (!fetchRef.current) {
fetchRef.current = fetch(fetcher);
}
const state = 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);
});
}
];
}
// Hook for derived/computed values from multiple signals
// React's re-rendering handles the reactivity automatically
export function useDerived(derive) {
return derive();
}
// Hook for signal with validation
export function useValidatedSignal(initialValue, validator, onError) {
const sigRef = useRef();
const isValidRef = useRef();
if (!sigRef.current) {
sigRef.current = signal(initialValue);
}
if (!isValidRef.current) {
isValidRef.current = 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 = useSyncExternalStore(sigRef.current.subscribe, sigRef.current.value);
const valid = useSyncExternalStore(isValidRef.current.subscribe, isValidRef.current.value);
return [value, setValue, valid];
}
// Hook for debounced signals
export function useDebouncedSignal(initialValue, delay) {
const immediateRef = useRef();
const debouncedRef = useRef();
const timeoutRef = useRef();
if (!immediateRef.current) {
immediateRef.current = signal(initialValue);
}
if (!debouncedRef.current) {
debouncedRef.current = signal(initialValue);
}
const setValue = (value) => {
immediateRef.current._set(value);
clearTimeout(timeoutRef.current);
timeoutRef.current = setTimeout(() => {
debouncedRef.current._set(value);
}, delay);
};
const immediateValue = useSyncExternalStore(immediateRef.current.subscribe, immediateRef.current.value);
const debouncedValue = useSyncExternalStore(debouncedRef.current.subscribe, debouncedRef.current.value);
return [immediateValue, setValue, debouncedValue];
}
// Hook for persistent signals (localStorage)
export function usePersistentSignal(key, initialValue) {
const sigRef = 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 = 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 = useSyncExternalStore(sigRef.current.subscribe, sigRef.current.value);
return [value, sigRef.current._set];
}
// Hook for async signals - handles Promise-based values
export function useAsyncSignal(asyncFn, initialValue) {
const stateRef = useRef();
const abortControllerRef = useRef();
if (!stateRef.current) {
stateRef.current = 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 = useSyncExternalStore(stateRef.current.subscribe, stateRef.current.value);
return [state, refetch, setValue];
}
// Hook for async computed values - Simplified approach to avoid infinite loops
// Use manual trigger pattern for now until we can implement proper dependency tracking
export function useAsyncComputed(asyncCompute, deps = []) {
const stateRef = useRef();
const abortControllerRef = useRef();
const lastDepsRef = useRef([]);
const isInitializedRef = useRef(false);
if (!stateRef.current) {
stateRef.current = 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 = useSyncExternalStore(stateRef.current.subscribe, stateRef.current.value);
return state;
}
// Hook for async computed signals - returns a signal that can be used in other computations
export function useAsyncComputedSignal(asyncCompute, deps = []) {
const stateRef = useRef();
const abortControllerRef = useRef();
const lastDepsRef = useRef([]);
const isInitializedRef = useRef(false);
if (!stateRef.current) {
stateRef.current = 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;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhY3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWRhcHRlcnMvcmVhY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUNyRCxPQUFPLEVBQTJCLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pFLE9BQU8sRUFBVSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRCxPQUFPLEVBQWdCLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzFELE9BQU8sRUFBUyxLQUFLLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRDs7O0dBR0c7QUFFSCx3REFBd0Q7QUFDeEQsTUFBTSxVQUFVLFNBQVMsQ0FBSSxZQUFlO0lBQzFDLE1BQU0sTUFBTSxHQUFHLE1BQU0sRUFBYSxDQUFDO0lBQ25DLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDcEIsTUFBTSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkYsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsT0FBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3ZDLENBQUM7QUFFRCxvREFBb0Q7QUFDcEQsNERBQTREO0FBQzVELE1BQU0sVUFBVSxXQUFXLENBQUksT0FBZ0I7SUFDN0MsT0FBTyxPQUFPLEVBQUUsQ0FBQztBQUNuQixDQUFDO0FBRUQseUNBQXlDO0FBQ3pDLE1BQU0sVUFBVSxTQUFTLENBQUksWUFBZTtJQUMxQyxNQUFNLE1BQU0sR0FBRyxNQUFNLEVBQWEsQ0FBQztJQUNuQyxJQUFJLENBQUMsTUFBTSxD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