-
Notifications
You must be signed in to change notification settings - Fork 1
/
types.ts
161 lines (141 loc) · 4.75 KB
/
types.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
import { DistributiveOmit, MaybePromise } from './utils'
export type JsonifiableObject =
| {
[Key in string]?: JsonPrimitive | JsonifiableObject | JsonifiableArray
}
| {
toJSON: () => JsonPrimitive | JsonifiableObject | JsonifiableArray
}
export type JsonifiableArray = readonly (
| JsonPrimitive
| JsonifiableObject
| JsonifiableArray
)[]
type JsonPrimitive = string | number | boolean | null | undefined
type Interceptor =
| keyof DefaultOptions<any>
| keyof FetcherOptions<any> extends infer U
? U extends `on${infer V}`
? `on${V}`
: never
: never
type TupleToUnion<U extends string, R extends any[] = []> = {
[S in U]: Exclude<U, S> extends never
? [...R, S]
: TupleToUnion<Exclude<U, S>, [...R, S]>
}[U]
export type Interceptors = TupleToUnion<Interceptor>
export type BaseFetchFn = (input: any, options?: any, ctx?: any) => Promise<any>
export type BaseOptions<TFetch extends BaseFetchFn> = DistributiveOmit<
NonNullable<Parameters<TFetch>[1]>,
'body' | 'headers' | 'method'
> & {
baseUrl?: string
method?:
| 'GET'
| 'POST'
| 'PUT'
| 'DELETE'
| 'PATCH'
| 'CONNECT'
| 'OPTIONS'
| 'TRACE'
| 'HEAD'
| (string & {})
}
export type ParseResponse<TFetchFn extends BaseFetchFn, TParsedData> = (
response: Response,
options: ComputedOptions<TFetchFn>,
) => MaybePromise<TParsedData>
export type ParseResponseError<TFetchFn extends BaseFetchFn, TError> = (
res: Response,
options: ComputedOptions<TFetchFn>,
) => MaybePromise<TError>
export type SerializeBody = (
body: Exclude<RawBody, BodyInit | null>,
) => BodyInit | null | undefined
export type Transform<TFetchFn extends BaseFetchFn, TData, TParsedData> = (
parsedData: TParsedData,
options: ComputedOptions<TFetchFn>,
) => MaybePromise<TData>
export type SerializeParams = (params: Params) => string
export type Params = Record<string, any>
type RawBody = BodyInit | JsonifiableObject | JsonifiableArray | null
export type RawHeaders =
| HeadersInit
| Record<string, string | number | null | undefined>
export type ComputedOptions<
TFetchFn extends BaseFetchFn,
TData = any,
TError = any,
TParsedData = any,
> = BaseOptions<TFetchFn> & {
readonly body?: BodyInit | null
headers: Record<string, string>
readonly input: Request | string
params: Params
parseResponse: ParseResponse<TFetchFn, TParsedData>
parseResponseError: ParseResponseError<TFetchFn, TError>
rawBody?: RawBody
serializeBody: SerializeBody
serializeParams: SerializeParams
transform: Transform<TFetchFn, TData, TParsedData>
throwResponseErrorWhen: (response: Response) => MaybePromise<boolean>
}
export type DefaultOptions<
TFetchFn extends BaseFetchFn,
TError = any,
> = BaseOptions<TFetchFn> & {
headers?: RawHeaders
onBeforeFetch?: (options: ComputedOptions<TFetchFn>) => void
onParsingError?: (error: any, options: ComputedOptions<TFetchFn>) => void
onResponseError?: (error: any, options: ComputedOptions<TFetchFn>) => void
onRequestError?: (error: Error, options: ComputedOptions<TFetchFn>) => void
onSuccess?: (data: any, options: ComputedOptions<TFetchFn>) => void
onTransformError?: (error: Error, options: ComputedOptions<TFetchFn>) => void
params?: Params
parseResponse?: ParseResponse<TFetchFn, any>
parseResponseError?: ParseResponseError<TFetchFn, TError>
serializeBody?: SerializeBody
serializeParams?: SerializeParams
throwResponseErrorWhen?: (response: Response) => MaybePromise<boolean>
}
export type FetcherOptions<
TFetchFn extends BaseFetchFn,
TData = any,
TError = any,
TParsedData = any,
> = BaseOptions<TFetchFn> & {
body?: RawBody
headers?: RawHeaders
onBeforeFetch?: (
options: ComputedOptions<TFetchFn, TData, TError, TParsedData>,
) => void
onParsingError?: (
error: any,
options: ComputedOptions<TFetchFn, TData, TError, TParsedData>,
) => void
onResponseError?: (
error: TError,
options: ComputedOptions<TFetchFn, TData, TError, TParsedData>,
) => void
onRequestError?: (
error: Error,
options: ComputedOptions<TFetchFn, TData, TError, TParsedData>,
) => void
onSuccess?: (
data: TData,
options: ComputedOptions<TFetchFn, TData, TError, TParsedData>,
) => void
onTransformError?: (
error: Error,
options: ComputedOptions<TFetchFn, TData, TError, TParsedData>,
) => void
params?: Params
parseResponse?: ParseResponse<TFetchFn, TParsedData>
parseResponseError?: ParseResponseError<TFetchFn, TError>
serializeBody?: SerializeBody
serializeParams?: SerializeParams
transform?: Transform<TFetchFn, TData, TParsedData>
throwResponseErrorWhen?: (response: Response) => MaybePromise<boolean>
}