@bigmi/client
Version:
Reactive primitives for Bitcoin apps.
51 lines (43 loc) • 1.24 kB
text/typescript
import type { QueryKey } from '@tanstack/query-core'
export function hashFn(queryKey: QueryKey): string {
return JSON.stringify(queryKey, (_, value) => {
if (isPlainObject(value)) {
return Object.keys(value)
.sort()
.reduce((result, key) => {
result[key] = value[key]
return result
}, {} as any)
}
if (typeof value === 'bigint') {
return value.toString()
}
return value
})
}
// biome-ignore lint/complexity/noBannedTypes: typeguard
function isPlainObject(value: any): value is Object {
if (!hasObjectPrototype(value)) {
return false
}
// If has modified constructor
const ctor = value.constructor
if (typeof ctor === 'undefined') {
return true
}
// If has modified prototype
const prot = ctor.prototype
if (!hasObjectPrototype(prot)) {
return false
}
// If constructor does not have an Object-specific method
// biome-ignore lint/suspicious/noPrototypeBuiltins: part of the typeguard
if (!prot.hasOwnProperty('isPrototypeOf')) {
return false
}
// Most likely a plain Object
return true
}
function hasObjectPrototype(o: any): boolean {
return Object.prototype.toString.call(o) === '[object Object]'
}