You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

64 lines
2.6 KiB

import type { AsyncData, UseFetchOptions } from '#app'
import type { KeysOf, PickFrom } from '#app/composables/asyncData'
import type { NitroFetchRequest, TypedInternalResponse, AvailableRouterMethod } from 'nitropack/types'
import type { FetchError } from 'ofetch'
import type { Ref } from 'vue'
import { _useHttpFetch, _useLazyHttpFetch, type UnwrapApiResponse } from './http/factory'
type DefaultMethod<ReqT extends NitroFetchRequest> = 'get' extends AvailableRouterMethod<ReqT>
? 'get'
: AvailableRouterMethod<ReqT>
type HttpFetchOptions<
_ResT,
DataT,
PickKeys extends KeysOf<DataT>,
DefaultT,
ReqT extends NitroFetchRequest,
Method extends AvailableRouterMethod<ReqT>,
> = Omit<UseFetchOptions<_ResT, DataT, PickKeys, DefaultT, ReqT, Method>, 'transform'>
/**
* 带项目默认选项的 `useFetch`,并在类型上将 `data` 视为接口 `{ code, data, message }` 中的内层 `data`。
*
* 说明:Nuxt的 `createUseFetch` 在类型上不会把工厂里的 `transform` 的出参当作 `AsyncData['data']`,
* 因此这里用薄包装修正 `DataT`(见 `UnwrapApiResponse`)。
*/
export function useHttpFetch<
ResT = void,
ErrorT = FetchError,
ReqT extends NitroFetchRequest = NitroFetchRequest,
Method extends AvailableRouterMethod<ReqT> = ResT extends void
? DefaultMethod<ReqT>
: AvailableRouterMethod<ReqT>,
_ResT = ResT extends void ? TypedInternalResponse<ReqT, unknown, Lowercase<Method>> : ResT,
DataT = UnwrapApiResponse<_ResT>,
PickKeys extends KeysOf<DataT> = KeysOf<DataT>,
DefaultT = undefined,
>(
url: ReqT | Ref<ReqT, ReqT> | (() => ReqT),
opts?: HttpFetchOptions<_ResT, DataT, PickKeys, DefaultT, ReqT, Method>,
): AsyncData<DefaultT | PickFrom<DataT, PickKeys>, ErrorT | undefined> {
return _useHttpFetch(url, opts) as AsyncData<DefaultT | PickFrom<DataT, PickKeys>, ErrorT | undefined>
}
export function useLazyHttpFetch<
ResT = void,
ErrorT = FetchError,
ReqT extends NitroFetchRequest = NitroFetchRequest,
Method extends AvailableRouterMethod<ReqT> = ResT extends void
? DefaultMethod<ReqT>
: AvailableRouterMethod<ReqT>,
_ResT = ResT extends void ? TypedInternalResponse<ReqT, unknown, Lowercase<Method>> : ResT,
DataT = UnwrapApiResponse<_ResT>,
PickKeys extends KeysOf<DataT> = KeysOf<DataT>,
DefaultT = undefined,
>(
url: ReqT | Ref<ReqT, ReqT> | (() => ReqT),
opts?: HttpFetchOptions<_ResT, DataT, PickKeys, DefaultT, ReqT, Method>,
): AsyncData<DefaultT | PickFrom<DataT, PickKeys>, ErrorT | undefined> {
return _useLazyHttpFetch(url, opts) as AsyncData<
DefaultT | PickFrom<DataT, PickKeys>,
ErrorT | undefined
>
}