|
1 | 1 | import type {Buffer} from 'node:buffer';
|
| 2 | +import type {Spread} from 'type-fest'; |
2 | 3 | import type {CancelableRequest} from './as-promise/types.js';
|
3 | 4 | import type {Response} from './core/response.js';
|
4 | 5 | import type Options from './core/options.js';
|
@@ -69,14 +70,8 @@ export type ExtendOptions = {
|
69 | 70 | mutableDefaults?: boolean;
|
70 | 71 | } & OptionsInit;
|
71 | 72 |
|
72 |
| -export type OptionsOfTextResponseBody = Merge<OptionsInit, {isStream?: false; resolveBodyOnly?: false; responseType?: 'text'}>; |
73 |
| -// eslint-disable-next-line @typescript-eslint/naming-convention |
74 |
| -export type OptionsOfJSONResponseBody = Merge<OptionsInit, {isStream?: false; resolveBodyOnly?: false; responseType?: 'json'}>; |
75 |
| -export type OptionsOfBufferResponseBody = Merge<OptionsInit, {isStream?: false; resolveBodyOnly?: false; responseType: 'buffer'}>; |
76 |
| -export type OptionsOfUnknownResponseBody = Merge<OptionsInit, {isStream?: false; resolveBodyOnly?: false}>; |
77 | 73 | export type StrictOptions = Except<OptionsInit, 'isStream' | 'responseType' | 'resolveBodyOnly'>;
|
78 | 74 | export type StreamOptions = Merge<OptionsInit, {isStream?: true}>;
|
79 |
| -type ResponseBodyOnly = {resolveBodyOnly: true}; |
80 | 75 |
|
81 | 76 | export type OptionsWithPagination<T = unknown, R = unknown> = Merge<OptionsInit, {pagination?: PaginationOptions<T, R>}>;
|
82 | 77 |
|
@@ -142,26 +137,53 @@ export type GotPaginate = {
|
142 | 137 | & (<T, R = unknown>(options?: OptionsWithPagination<T, R>) => Promise<T[]>);
|
143 | 138 | };
|
144 | 139 |
|
145 |
| -export type GotRequestFunction = { |
146 |
| - // `asPromise` usage |
147 |
| - (url: string | URL, options?: OptionsOfTextResponseBody): CancelableRequest<Response<string>>; |
148 |
| - <T>(url: string | URL, options?: OptionsOfJSONResponseBody): CancelableRequest<Response<T>>; |
149 |
| - (url: string | URL, options?: OptionsOfBufferResponseBody): CancelableRequest<Response<Buffer>>; |
150 |
| - (url: string | URL, options?: OptionsOfUnknownResponseBody): CancelableRequest<Response>; |
| 140 | +export type OptionsOfTextResponseBody = Merge<StrictOptions, {isStream?: false; responseType?: 'text'}>; |
| 141 | +export type OptionsOfTextResponseBodyOnly = Merge<StrictOptions, {isStream?: false; resolveBodyOnly: true; responseType?: 'text'}>; |
| 142 | +export type OptionsOfTextResponseBodyWrapped = Merge<StrictOptions, {isStream?: false; resolveBodyOnly: false; responseType?: 'text'}>; |
151 | 143 |
|
152 |
| - (options: OptionsOfTextResponseBody): CancelableRequest<Response<string>>; |
153 |
| - <T>(options: OptionsOfJSONResponseBody): CancelableRequest<Response<T>>; |
154 |
| - (options: OptionsOfBufferResponseBody): CancelableRequest<Response<Buffer>>; |
155 |
| - (options: OptionsOfUnknownResponseBody): CancelableRequest<Response>; |
| 144 | +export type OptionsOfJSONResponseBody = Merge<StrictOptions, {isStream?: false; responseType?: 'json'}>; // eslint-disable-line @typescript-eslint/naming-convention |
| 145 | +export type OptionsOfJSONResponseBodyOnly = Merge<StrictOptions, {isStream?: false; resolveBodyOnly: true; responseType?: 'json'}>; // eslint-disable-line @typescript-eslint/naming-convention |
| 146 | +export type OptionsOfJSONResponseBodyWrapped = Merge<StrictOptions, {isStream?: false; resolveBodyOnly: false; responseType?: 'json'}>; // eslint-disable-line @typescript-eslint/naming-convention |
156 | 147 |
|
157 |
| - // `resolveBodyOnly` usage |
158 |
| - (url: string | URL, options?: (Merge<OptionsOfTextResponseBody, ResponseBodyOnly>)): CancelableRequest<string>; |
159 |
| - <T>(url: string | URL, options?: (Merge<OptionsOfJSONResponseBody, ResponseBodyOnly>)): CancelableRequest<T>; |
160 |
| - (url: string | URL, options?: (Merge<OptionsOfBufferResponseBody, ResponseBodyOnly>)): CancelableRequest<Buffer>; |
| 148 | +export type OptionsOfBufferResponseBody = Merge<StrictOptions, {isStream?: false; responseType?: 'buffer'}>; |
| 149 | +export type OptionsOfBufferResponseBodyOnly = Merge<StrictOptions, {isStream?: false; resolveBodyOnly: true; responseType?: 'buffer'}>; |
| 150 | +export type OptionsOfBufferResponseBodyWrapped = Merge<StrictOptions, {isStream?: false; resolveBodyOnly: false; responseType?: 'buffer'}>; |
161 | 151 |
|
162 |
| - (options: (Merge<OptionsOfTextResponseBody, ResponseBodyOnly>)): CancelableRequest<string>; |
163 |
| - <T>(options: (Merge<OptionsOfJSONResponseBody, ResponseBodyOnly>)): CancelableRequest<T>; |
164 |
| - (options: (Merge<OptionsOfBufferResponseBody, ResponseBodyOnly>)): CancelableRequest<Buffer>; |
| 152 | +export type OptionsOfUnknownResponseBody = Merge<StrictOptions, {isStream?: false}>; |
| 153 | +export type OptionsOfUnknownResponseBodyOnly = Merge<StrictOptions, {isStream?: false; resolveBodyOnly: true}>; |
| 154 | +export type OptionsOfUnknownResponseBodyWrapped = Merge<StrictOptions, {isStream?: false; resolveBodyOnly: false}>; |
| 155 | + |
| 156 | +export type GotRequestFunction<U extends ExtendOptions = Record<string, unknown>> = { |
| 157 | + // `asPromise` usage |
| 158 | + (url: string | URL, options?: OptionsOfTextResponseBody): U['resolveBodyOnly'] extends true ? CancelableRequest<string> : CancelableRequest<Response<string>>; |
| 159 | + <T>(url: string | URL, options?: OptionsOfJSONResponseBody): U['resolveBodyOnly'] extends true ? CancelableRequest<T> : CancelableRequest<Response<T>>; |
| 160 | + (url: string | URL, options?: OptionsOfBufferResponseBody): U['resolveBodyOnly'] extends true ? CancelableRequest<Buffer> : CancelableRequest<Response<Buffer>>; |
| 161 | + (url: string | URL, options?: OptionsOfUnknownResponseBody): U['resolveBodyOnly'] extends true ? CancelableRequest : CancelableRequest<Response>; |
| 162 | + |
| 163 | + (url: string | URL, options?: OptionsOfTextResponseBodyWrapped): CancelableRequest<Response<string>>; |
| 164 | + <T>(url: string | URL, options?: OptionsOfJSONResponseBodyWrapped): CancelableRequest<Response<T>>; |
| 165 | + (url: string | URL, options?: OptionsOfBufferResponseBodyWrapped): CancelableRequest<Response<Buffer>>; |
| 166 | + (url: string | URL, options?: OptionsOfUnknownResponseBodyWrapped): CancelableRequest<Response>; |
| 167 | + |
| 168 | + (url: string | URL, options?: OptionsOfTextResponseBodyOnly): CancelableRequest<string>; |
| 169 | + <T>(url: string | URL, options?: OptionsOfJSONResponseBodyOnly): CancelableRequest<T>; |
| 170 | + (url: string | URL, options?: OptionsOfBufferResponseBodyOnly): CancelableRequest<Buffer>; |
| 171 | + (url: string | URL, options?: OptionsOfUnknownResponseBodyOnly): CancelableRequest; |
| 172 | + |
| 173 | + (options: OptionsOfTextResponseBody): U['resolveBodyOnly'] extends true ? CancelableRequest<string> : CancelableRequest<Response<string>>; |
| 174 | + <T>(options: OptionsOfJSONResponseBody): U['resolveBodyOnly'] extends true ? CancelableRequest<T> : CancelableRequest<Response<T>>; |
| 175 | + (options: OptionsOfBufferResponseBody): U['resolveBodyOnly'] extends true ? CancelableRequest<Buffer> : CancelableRequest<Response<Buffer>>; |
| 176 | + (options: OptionsOfUnknownResponseBody): U['resolveBodyOnly'] extends true ? CancelableRequest : CancelableRequest<Response>; |
| 177 | + |
| 178 | + (options: OptionsOfTextResponseBodyWrapped): CancelableRequest<Response<string>>; |
| 179 | + <T>(options: OptionsOfJSONResponseBodyWrapped): CancelableRequest<Response<T>>; |
| 180 | + (options: OptionsOfBufferResponseBodyWrapped): CancelableRequest<Response<Buffer>>; |
| 181 | + (options: OptionsOfUnknownResponseBodyWrapped): CancelableRequest<Response>; |
| 182 | + |
| 183 | + (options: OptionsOfTextResponseBodyOnly): CancelableRequest<string>; |
| 184 | + <T>(options: OptionsOfJSONResponseBodyOnly): CancelableRequest<T>; |
| 185 | + (options: OptionsOfBufferResponseBodyOnly): CancelableRequest<Buffer>; |
| 186 | + (options: OptionsOfUnknownResponseBodyOnly): CancelableRequest; |
165 | 187 |
|
166 | 188 | // `asStream` usage
|
167 | 189 | (url: string | URL, options?: Merge<OptionsInit, {isStream: true}>): Request;
|
@@ -201,7 +223,7 @@ export type GotStream = GotStreamFunction & Record<HTTPAlias, GotStreamFunction>
|
201 | 223 | /**
|
202 | 224 | An instance of `got`.
|
203 | 225 | */
|
204 |
| -export type Got = { |
| 226 | +export type Got<GotOptions extends ExtendOptions = ExtendOptions> = { |
205 | 227 | /**
|
206 | 228 | Sets `options.isStream` to `true`.
|
207 | 229 |
|
@@ -274,5 +296,37 @@ export type Got = {
|
274 | 296 | // x-unicorn: rainbow
|
275 | 297 | ```
|
276 | 298 | */
|
277 |
| - extend: (...instancesOrOptions: Array<Got | ExtendOptions>) => Got; |
278 |
| -} & Record<HTTPAlias, GotRequestFunction> & GotRequestFunction; |
| 299 | + extend<T extends Array<Got | ExtendOptions>>(...instancesOrOptions: T): Got<MergeExtendsConfig<T>>; |
| 300 | +} |
| 301 | +& Record<HTTPAlias, GotRequestFunction<GotOptions>> |
| 302 | +& GotRequestFunction<GotOptions>; |
| 303 | + |
| 304 | +export type ExtractExtendOptions<T> = T extends Got<infer GotOptions> |
| 305 | + ? GotOptions |
| 306 | + : T; |
| 307 | + |
| 308 | +/** |
| 309 | +Merges the options of multiple Got instances. |
| 310 | +*/ |
| 311 | +export type MergeExtendsConfig<Value extends Array<Got | ExtendOptions>> = |
| 312 | +Value extends readonly [Value[0], ...infer NextValue] |
| 313 | + ? NextValue[0] extends undefined |
| 314 | + ? Value[0] extends infer OnlyValue |
| 315 | + ? OnlyValue extends ExtendOptions |
| 316 | + ? OnlyValue |
| 317 | + : OnlyValue extends Got<infer GotOptions> |
| 318 | + ? GotOptions |
| 319 | + : OnlyValue |
| 320 | + : never |
| 321 | + : ExtractExtendOptions<Value[0]> extends infer FirstArg extends ExtendOptions |
| 322 | + ? ExtractExtendOptions<NextValue[0] extends ExtendOptions | Got ? NextValue[0] : never> extends infer NextArg extends ExtendOptions |
| 323 | + ? Spread<FirstArg, NextArg> extends infer Merged extends ExtendOptions |
| 324 | + ? NextValue extends [NextValue[0], ...infer NextRest] |
| 325 | + ? NextRest extends Array<Got | ExtendOptions> |
| 326 | + ? MergeExtendsConfig<[Merged, ...NextRest]> |
| 327 | + : never |
| 328 | + : never |
| 329 | + : never |
| 330 | + : never |
| 331 | + : never |
| 332 | + : never; |
0 commit comments