@tanstack/vue-query
Version:
Hooks for managing, caching and syncing asynchronous and remote data in Vue
80 lines (66 loc) • 1.97 kB
text/typescript
import { isRef, unref } from 'vue-demi'
import type { MaybeRefDeep } from './types'
export const VUE_QUERY_CLIENT = 'VUE_QUERY_CLIENT'
export function getClientKey(key?: string) {
const suffix = key ? `:${key}` : ''
return `${VUE_QUERY_CLIENT}${suffix}`
}
export function updateState(
state: Record<string, unknown>,
update: Record<string, any>,
): void {
Object.keys(state).forEach((key) => {
state[key] = update[key]
})
}
export function cloneDeep<T>(
value: MaybeRefDeep<T>,
customizer?: (val: MaybeRefDeep<T>) => T | undefined,
): T {
if (customizer) {
const result = customizer(value)
// If it's a ref of undefined, return undefined
if (result === undefined && isRef(value)) {
return result as T
}
if (result !== undefined) {
return result
}
}
if (Array.isArray(value)) {
return value.map((val) => cloneDeep(val, customizer)) as unknown as T
}
if (typeof value === 'object' && isPlainObject(value)) {
const entries = Object.entries(value).map(([key, val]) => [
key,
cloneDeep(val, customizer),
])
return Object.fromEntries(entries)
}
return value as T
}
export function cloneDeepUnref<T>(obj: MaybeRefDeep<T>): T {
return cloneDeep(obj, (val) => {
if (isRef(val)) {
return cloneDeepUnref(unref(val))
}
return undefined
})
}
function isPlainObject(value: unknown): value is Object {
if (Object.prototype.toString.call(value) !== '[object Object]') {
return false
}
const prototype = Object.getPrototypeOf(value)
return prototype === null || prototype === Object.prototype
}
export function shouldThrowError<T extends (...args: Array<any>) => boolean>(
throwOnError: boolean | T | undefined,
params: Parameters<T>,
): boolean {
// Allow throwOnError function to override throwing behavior on a per-error basis
if (typeof throwOnError === 'function') {
return throwOnError(...params)
}
return !!throwOnError
}