import { type GetCapabilitiesErrorType, type GetCapabilitiesParameters, type GetCapabilitiesReturnType, getCapabilities, } from '../actions/getCapabilities.js' import type { Config } from '../createConfig.js' import { filterQueryOptions } from '../query/utils.js' import type { ScopeKeyParameter } from '../types/properties.js' import type { QueryOptions, QueryParameter } from '../types/query.js' import type { Compute, ExactPartial } from '../types/utils.js' export type GetCapabilitiesOptions< config extends Config = Config, chainId extends config['chains'][number]['id'] | undefined = undefined, selectData = GetCapabilitiesData, > = Compute< ExactPartial> & ScopeKeyParameter > & QueryParameter< GetCapabilitiesQueryFnData, GetCapabilitiesErrorType, selectData, GetCapabilitiesQueryKey > export function getCapabilitiesQueryOptions< config extends Config, chainId extends config['chains'][number]['id'] | undefined = undefined, selectData = GetCapabilitiesData, >( config: config, options: GetCapabilitiesOptions = {}, ): GetCapabilitiesQueryOptions { return { ...options.query, enabled: Boolean( options.connector?.getProvider && (options.query?.enabled ?? true), ), queryFn: async (context) => { if (!options.connector?.getProvider) throw new Error('connector is required') const [, { connectorUid: _, scopeKey: __, ...parameters }] = context.queryKey const capabilities = await getCapabilities(config, parameters) return capabilities }, queryKey: getCapabilitiesQueryKey(options), } } export type GetCapabilitiesQueryFnData< config extends Config = Config, chainId extends config['chains'][number]['id'] | undefined = undefined, > = GetCapabilitiesReturnType export type GetCapabilitiesData< config extends Config = Config, chainId extends config['chains'][number]['id'] | undefined = undefined, > = GetCapabilitiesQueryFnData export function getCapabilitiesQueryKey< config extends Config, chainId extends config['chains'][number]['id'] | undefined = undefined, >( options: Compute< ExactPartial> & ScopeKeyParameter > = {}, ) { return ['capabilities', filterQueryOptions(options)] as const } export type GetCapabilitiesQueryKey< config extends Config, chainId extends config['chains'][number]['id'] | undefined = undefined, > = ReturnType> export type GetCapabilitiesQueryOptions< config extends Config, chainId extends config['chains'][number]['id'] | undefined = undefined, selectData = GetCapabilitiesData, > = QueryOptions< GetCapabilitiesQueryFnData, GetCapabilitiesErrorType, selectData, GetCapabilitiesQueryKey >