import type { QueryCacheKey } from './core/apiState' import type { EndpointDefinition } from './endpointDefinitions' import { isPlainObject } from './core/rtkImports' const cache: WeakMap | undefined = WeakMap ? new WeakMap() : undefined export const defaultSerializeQueryArgs: SerializeQueryArgs = ({ endpointName, queryArgs, }) => { let serialized = '' const cached = cache?.get(queryArgs) if (typeof cached === 'string') { serialized = cached } else { const stringified = JSON.stringify(queryArgs, (key, value) => { // Handle bigints value = typeof value === 'bigint' ? { $bigint: value.toString() } : value // Sort the object keys before stringifying, to prevent useQuery({ a: 1, b: 2 }) having a different cache key than useQuery({ b: 2, a: 1 }) value = isPlainObject(value) ? Object.keys(value) .sort() .reduce((acc, key) => { acc[key] = (value as any)[key] return acc }, {}) : value return value }) if (isPlainObject(queryArgs)) { cache?.set(queryArgs, stringified) } serialized = stringified } return `${endpointName}(${serialized})` } export type SerializeQueryArgs = (_: { queryArgs: QueryArgs endpointDefinition: EndpointDefinition endpointName: string }) => ReturnType export type InternalSerializeQueryArgs = (_: { queryArgs: any endpointDefinition: EndpointDefinition endpointName: string }) => QueryCacheKey