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
JavaScript
;
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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