import { dequal } from 'dequal/lite'; import { getMutation, MutationListener, MutationResult, setMutation, subscribeMutation, } from './cache/mutation-cache'; import { setRevalidation, } from './cache/revalidation-cache'; export function trigger( key: string, shouldRevalidate = true, ): void { setRevalidation(key, shouldRevalidate); } export function mutate( key: string, data: MutationResult, shouldRevalidate = true, compare: (a: T, b: T) => boolean = dequal, ): void { setRevalidation(key, shouldRevalidate); const current = getMutation(key); if ( current && current.result.status === 'success' && data.status === 'success' && compare(current.result.data, data.data) ) { current.timestamp = Date.now(); return; } setMutation(key, { result: data, timestamp: Date.now(), isValidating: false, }); } export function subscribe( key: string, listener: MutationListener, ): () => void { const wrappedListener: MutationListener = (value) => { listener(value); }; return subscribeMutation(key, wrappedListener); }