Core
type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE'
interface FetcherOptions {
method: string
url: string
body?: any
}
type Fetcher = (options: FetcherOptions) => Promise<Response>
ValidationError
Thrown when request params fail TypeBox schema validation (before any network call).class ValidationError extends Error {
errors: Array<{ path: string; message: string }>
}
Endpoint
interface Endpoint<
TParams extends TSchema = TSchema,
TResponse extends TSchema = TSchema
> {
method: HttpMethod
path: string
params: TParams
response: TResponse
}
type InferParams<T extends Endpoint> = Static<T['params']>
type InferResponse<T extends Endpoint> = Static<T['response']>
KweriOptions
interface KweriOptions {
baseURL: string
fetcher?: Fetcher
staleTime?: number
cacheTime?: number
maxRetries?: number
gcInterval?: number
persistence?: PersistenceAdapter
enableDevTools?: boolean
devtools?: MountKweriDevToolsOptions
}
MutationOptions
interface MutationOptions<TParams = unknown, TResponse = unknown, TContext = unknown> {
onMutate?: (params: TParams) => TContext | Promise<TContext>
onSuccess?: (data: TResponse, params: TParams, context: TContext) => void
onError?: (error: Error, params: TParams, context: TContext) => void
onSettled?: (
data: TResponse | undefined,
error: Error | undefined,
params: TParams,
context: TContext
) => void
invalidates?: Endpoint[]
}
React adapter
interface UseSyncExternalStore {
<Snapshot>(
subscribe: (onStoreChange: () => void) => () => void,
getSnapshot: () => Snapshot
): Snapshot
}
interface ReactQueryOptions {
enabled?: boolean
}
interface ReactQueryResult<TData = unknown, TError = unknown> {
data: TData | undefined
status: CacheEntryStatus
error: TError | undefined
refetch: () => Promise<void>
isFetching: boolean
isLoading: boolean
isSuccess: boolean
isError: boolean
}
interface ReactMutationResult<TData = unknown, TError = unknown> {
mutate: (vars?: unknown) => void
mutateAsync: (vars?: unknown) => Promise<TData>
status: CacheEntryStatus
error: TError | undefined
reset: () => void
isLoading: boolean
isSuccess: boolean
isError: boolean
}
Vue adapter
interface Ref<T> {
value: T
}
interface VueEffectAPI {
ref<T>(value: T): Ref<T>
watch<T>(
source: T | (() => T) | Ref<T>,
cb: (value: T, oldValue?: T) => void,
options?: { immediate?: boolean }
): () => void
onUnmounted(cb: () => void): void
}
interface VueQueryOptions {
enabled?: boolean | Ref<boolean>
}
interface VueQueryResult<TData = unknown, TError = unknown> {
data: Ref<TData | undefined>
status: Ref<CacheEntryStatus>
error: Ref<TError | undefined>
refetch: () => Promise<void>
isLoading: Ref<boolean>
isSuccess: Ref<boolean>
isError: Ref<boolean>
}
interface VueMutationResult<TData = unknown, TError = unknown> {
mutate: (vars?: unknown) => void
mutateAsync: (vars?: unknown) => Promise<TData>
status: Ref<CacheEntryStatus>
error: Ref<TError | undefined>
reset: () => void
isLoading: Ref<boolean>
isSuccess: Ref<boolean>
isError: Ref<boolean>
}
Persistence
interface SerializedCache {
version: number
entries: Array<[string, CacheEntry]>
}
interface PersistenceAdapter {
save(data: SerializedCache): Promise<void>
restore(): Promise<SerializedCache | null>
clear(): Promise<void>
}
const CACHE_VERSION: number // currently 1
Eviction
interface TimerAdapter {
setInterval(fn: () => void, ms: number): number | NodeJS.Timeout
clearInterval(handle: number | NodeJS.Timeout): void
setTimeout(fn: () => void, ms: number): number | NodeJS.Timeout
clearTimeout(handle: number | NodeJS.Timeout): void
}
DevTools
interface MountKweriDevToolsOptions {
position?: 'bottom-right' | 'bottom-left'
}
interface KweriDevToolsSnapshot {
cache: Array<{ key: string; entry: CacheEntry }>
observers: Array<{ key: string; count: number }>
inFlight: string[]
}