import type { AsyncDataOptions, useAsyncData, useFetch, UseFetchOptions, useLazyAsyncData, useLazyFetch, } from 'nuxt/app'; import type { Ref } from 'vue'; import type { Auth } from '../core/auth'; import type { QuerySerializerOptions } from '../core/bodySerializer'; import type { ServerSentEventsOptions, ServerSentEventsResult, } from '../core/serverSentEvents'; import type { Client as CoreClient, Config as CoreConfig, } from '../core/types'; export type ArraySeparatorStyle = ArrayStyle | MatrixStyle; type ArrayStyle = 'form' | 'spaceDelimited' | 'pipeDelimited'; type MatrixStyle = 'label' | 'matrix' | 'simple'; export type ObjectSeparatorStyle = ObjectStyle | MatrixStyle; type ObjectStyle = 'form' | 'deepObject'; export type QuerySerializer = ( query: Parameters[0]['query'], ) => string; type WithRefs = { [K in keyof TData]: NonNullable extends object ? WithRefs> | Ref> : NonNullable | Ref>; }; // copied from Nuxt export type KeysOf = Array< T extends T ? (keyof T extends string ? keyof T : never) : never >; export interface Config extends Omit< FetchOptions, 'baseURL' | 'body' | 'headers' | 'method' | 'query' >, WithRefs, 'query'>>, Omit { /** * Base URL for all requests made by this client. */ baseURL?: T['baseURL']; /** * A function for serializing request query parameters. By default, arrays * will be exploded in form style, objects will be exploded in deepObject * style, and reserved characters are percent-encoded. * * {@link https://swagger.io/docs/specification/serialization/#query View examples} */ querySerializer?: QuerySerializer | QuerySerializerOptions; } export interface RequestOptions< TComposable extends Composable = '$fetch', ResT = unknown, DefaultT = undefined, Url extends string = string, > extends Config, WithRefs<{ /** * Any body that you want to add to your request. * * {@link https://developer.mozilla.org/docs/Web/API/fetch#body} */ body?: unknown; path?: FetchOptions['query']; query?: FetchOptions['query']; rawBody?: unknown; }>, Pick< ServerSentEventsOptions, | 'onSseError' | 'onSseEvent' | 'sseDefaultRetryDelay' | 'sseMaxRetryAttempts' | 'sseMaxRetryDelay' > { asyncDataOptions?: AsyncDataOptions, DefaultT>; composable?: TComposable; key?: string; /** * Security mechanism(s) to use for the request. */ security?: ReadonlyArray; url: Url; } export type RequestResult< TComposable extends Composable, ResT, TError, > = TComposable extends '$fetch' ? ReturnType> : TComposable extends 'useAsyncData' ? ReturnType> : TComposable extends 'useFetch' ? ReturnType> : TComposable extends 'useLazyAsyncData' ? ReturnType> : TComposable extends 'useLazyFetch' ? ReturnType> : never; export interface ClientOptions { baseURL?: string; } type MethodFn = < TComposable extends Composable = '$fetch', ResT = unknown, TError = unknown, DefaultT = undefined, >( options: Omit, 'method'>, ) => RequestResult; type SseFn = < TComposable extends Composable = '$fetch', ResT = unknown, TError = unknown, DefaultT = undefined, >( options: Omit, 'method'>, ) => Promise>>; type RequestFn = < TComposable extends Composable = '$fetch', ResT = unknown, TError = unknown, DefaultT = undefined, >( options: Omit, 'method'> & Pick>, 'method'>, ) => RequestResult; /** * The `createClientConfig()` function will be called on client initialization * and the returned object will become the client's initial configuration. * * You may want to initialize your client this way instead of calling * `setConfig()`. This is useful for example if you're using Next.js * to ensure your client always has the correct values. */ export type CreateClientConfig = ( override?: Config, ) => Config & T>; export interface TDataShape { body?: unknown; headers?: unknown; path?: FetchOptions['query']; query?: FetchOptions['query']; url: string; } export type BuildUrlOptions< TData extends Omit = Omit, > = Pick, 'path' | 'query'> & Pick & Pick, 'baseURL' | 'querySerializer'>; type BuildUrlFn = >( options: BuildUrlOptions, ) => string; export type Client = CoreClient; type OmitKeys = Pick>; export type Options< TComposable extends Composable = '$fetch', TData extends TDataShape = TDataShape, ResT = unknown, DefaultT = undefined, > = OmitKeys< RequestOptions, 'body' | 'path' | 'query' | 'url' > & ([TData] extends [never] ? unknown : WithRefs>); type FetchOptions = Omit< UseFetchOptions, keyof AsyncDataOptions >; export type Composable = | '$fetch' | 'useAsyncData' | 'useFetch' | 'useLazyAsyncData' | 'useLazyFetch';