openapi-fetch
Advanced tools
Comparing version 0.0.7 to 0.0.8
# openapi-fetch | ||
## 0.0.8 | ||
### Patch Changes | ||
- 8e7cb46: Fix TypeScript lib error, simplify generated types | ||
## 0.0.7 | ||
@@ -4,0 +10,0 @@ |
@@ -10,4 +10,32 @@ /** options for each client instance */ | ||
} | ||
export declare const methods: readonly ["get", "put", "post", "delete", "options", "head", "patch", "trace"]; | ||
export type Method = (typeof methods)[number]; | ||
export type Method = 'get' | 'put' | 'post' | 'delete' | 'options' | 'head' | 'patch' | 'trace'; | ||
/** Gets a union of paths which have method */ | ||
type PathsWith<T, M extends Method> = { | ||
[Path in keyof T]: T[Path] extends { | ||
[K in M]: unknown; | ||
} ? Path : never; | ||
}[keyof T]; | ||
type PathParams<T> = T extends { | ||
parameters: any; | ||
} ? { | ||
params: T['parameters']; | ||
} : { | ||
params?: BaseParams; | ||
}; | ||
type MethodParams<T> = T extends { | ||
parameters: any; | ||
} ? { | ||
params: T['parameters']; | ||
} : { | ||
params?: BaseParams; | ||
}; | ||
type Params<T> = PathParams<T> & MethodParams<T>; | ||
type RequestBody<T> = T extends { | ||
requestBody: any; | ||
} ? { | ||
body: Unwrap<T['requestBody']>; | ||
} : { | ||
body?: never; | ||
}; | ||
type FetchOptions<T> = Params<T> & RequestBody<T> & Omit<RequestInit, 'body'>; | ||
type TruncatedResponse = Omit<Response, 'arrayBuffer' | 'blob' | 'body' | 'clone' | 'formData' | 'json' | 'text'>; | ||
@@ -28,676 +56,85 @@ /** Infer request/response from content type */ | ||
} ? T['content']['*/*'] : T; | ||
export default function createClient<T>(defaultOptions?: ClientOptions): { | ||
type Success<T> = T extends { | ||
200: any; | ||
} ? T[200] : T extends { | ||
201: any; | ||
} ? T[201] : T extends { | ||
202: any; | ||
} ? T[202] : T extends { | ||
default: any; | ||
} ? T['default'] : unknown; | ||
type Error<T> = T extends { | ||
500: any; | ||
} ? T[500] : T extends { | ||
404: any; | ||
} ? T[404] : T extends { | ||
402: any; | ||
} ? T[402] : T extends { | ||
401: any; | ||
} ? T[401] : T extends { | ||
400: any; | ||
} ? T[400] : T extends { | ||
422: any; | ||
} ? T[422] : T extends { | ||
418: any; | ||
} ? T[418] : T extends { | ||
417: any; | ||
} ? T[417] : T extends { | ||
416: any; | ||
} ? T[416] : T extends { | ||
415: any; | ||
} ? T[415] : T extends { | ||
414: any; | ||
} ? T[414] : T extends { | ||
413: any; | ||
} ? T[413] : T extends { | ||
412: any; | ||
} ? T[412] : T extends { | ||
411: any; | ||
} ? T[411] : T extends { | ||
410: any; | ||
} ? T[410] : T extends { | ||
409: any; | ||
} ? T[409] : T extends { | ||
408: any; | ||
} ? T[408] : T extends { | ||
407: any; | ||
} ? T[407] : T extends { | ||
406: any; | ||
} ? T[406] : T extends { | ||
405: any; | ||
} ? T[405] : T extends { | ||
default: any; | ||
} ? T['default'] : unknown; | ||
type FetchResponse<T> = { | ||
data: T extends { | ||
responses: any; | ||
} ? NonNullable<Unwrap<Success<T['responses']>>> : unknown; | ||
error?: never; | ||
response: TruncatedResponse; | ||
} | { | ||
data?: never; | ||
error: T extends { | ||
responses: any; | ||
} ? NonNullable<Unwrap<Error<T['responses']>>> : unknown; | ||
response: TruncatedResponse; | ||
}; | ||
export default function createClient<T>(options?: ClientOptions): { | ||
/** Call a GET endpoint */ | ||
get<U extends { [Path in keyof T]: T[Path] extends { | ||
get: unknown; | ||
} ? Path : never; }[keyof T], M extends keyof T[U]>(url: U, options: (T[U][M] extends infer T ? T extends T[U][M] ? T extends { | ||
parameters: any; | ||
} ? { | ||
params: T["parameters"]; | ||
} : { | ||
params?: BaseParams | undefined; | ||
} : never : never) & (T[U][M] extends infer T_1 ? T_1 extends T[U][M] ? T_1 extends { | ||
parameters: any; | ||
} ? { | ||
params: T_1["parameters"]; | ||
} : { | ||
params?: BaseParams | undefined; | ||
} : never : never) & (T[U][M] extends infer T_2 ? T_2 extends T[U][M] ? T_2 extends { | ||
requestBody: any; | ||
} ? { | ||
body: Unwrap<T_2["requestBody"]>; | ||
} : { | ||
body?: undefined; | ||
} : never : never) & Omit<RequestInit, "body">): Promise<{ | ||
data: T[U][keyof T[U]] extends infer T_3 ? T_3 extends T[U][keyof T[U]] ? T_3 extends { | ||
responses: any; | ||
} ? NonNullable<Unwrap<T_3["responses"] extends infer T_4 ? T_4 extends T_3["responses"] ? T_4 extends { | ||
200: any; | ||
} ? T_4[200] : T_4 extends { | ||
201: any; | ||
} ? T_4[201] : T_4 extends { | ||
202: any; | ||
} ? T_4[202] : T_4 extends { | ||
default: any; | ||
} ? T_4["default"] : unknown : never : never>> : unknown : never : never; | ||
error?: undefined; | ||
response: TruncatedResponse; | ||
} | { | ||
data?: undefined; | ||
error: T[U][keyof T[U]] extends infer T_5 ? T_5 extends T[U][keyof T[U]] ? T_5 extends { | ||
responses: any; | ||
} ? NonNullable<Unwrap<T_5["responses"] extends infer T_6 ? T_6 extends T_5["responses"] ? T_6 extends { | ||
500: any; | ||
} ? T_6[500] : T_6 extends { | ||
404: any; | ||
} ? T_6[404] : T_6 extends { | ||
402: any; | ||
} ? T_6[402] : T_6 extends { | ||
401: any; | ||
} ? T_6[401] : T_6 extends { | ||
400: any; | ||
} ? T_6[400] : T_6 extends { | ||
422: any; | ||
} ? T_6[422] : T_6 extends { | ||
418: any; | ||
} ? T_6[418] : T_6 extends { | ||
417: any; | ||
} ? T_6[417] : T_6 extends { | ||
416: any; | ||
} ? T_6[416] : T_6 extends { | ||
415: any; | ||
} ? T_6[415] : T_6 extends { | ||
414: any; | ||
} ? T_6[414] : T_6 extends { | ||
413: any; | ||
} ? T_6[413] : T_6 extends { | ||
412: any; | ||
} ? T_6[412] : T_6 extends { | ||
411: any; | ||
} ? T_6[411] : T_6 extends { | ||
410: any; | ||
} ? T_6[410] : T_6 extends { | ||
409: any; | ||
} ? T_6[409] : T_6 extends { | ||
408: any; | ||
} ? T_6[408] : T_6 extends { | ||
407: any; | ||
} ? T_6[407] : T_6 extends { | ||
406: any; | ||
} ? T_6[406] : T_6 extends { | ||
405: any; | ||
} ? T_6[405] : T_6 extends { | ||
default: any; | ||
} ? T_6["default"] : unknown : never : never>> : unknown : never : never; | ||
response: TruncatedResponse; | ||
}>; | ||
get<U extends PathsWith<T, "get">, M extends keyof T[U]>(url: U, init: FetchOptions<T[U][M]>): Promise<FetchResponse<T[U][keyof T[U]]>>; | ||
/** Call a PUT endpoint */ | ||
put<U_1 extends { [Path_1 in keyof T]: T[Path_1] extends { | ||
put: unknown; | ||
} ? Path_1 : never; }[keyof T], M_1 extends keyof T[U_1]>(url: U_1, options: (T[U_1][M_1] extends infer T_7 ? T_7 extends T[U_1][M_1] ? T_7 extends { | ||
parameters: any; | ||
} ? { | ||
params: T_7["parameters"]; | ||
} : { | ||
params?: BaseParams | undefined; | ||
} : never : never) & (T[U_1][M_1] extends infer T_8 ? T_8 extends T[U_1][M_1] ? T_8 extends { | ||
parameters: any; | ||
} ? { | ||
params: T_8["parameters"]; | ||
} : { | ||
params?: BaseParams | undefined; | ||
} : never : never) & (T[U_1][M_1] extends infer T_9 ? T_9 extends T[U_1][M_1] ? T_9 extends { | ||
requestBody: any; | ||
} ? { | ||
body: Unwrap<T_9["requestBody"]>; | ||
} : { | ||
body?: undefined; | ||
} : never : never) & Omit<RequestInit, "body">): Promise<{ | ||
data: T[U_1][keyof T[U_1]] extends infer T_10 ? T_10 extends T[U_1][keyof T[U_1]] ? T_10 extends { | ||
responses: any; | ||
} ? NonNullable<Unwrap<T_10["responses"] extends infer T_11 ? T_11 extends T_10["responses"] ? T_11 extends { | ||
200: any; | ||
} ? T_11[200] : T_11 extends { | ||
201: any; | ||
} ? T_11[201] : T_11 extends { | ||
202: any; | ||
} ? T_11[202] : T_11 extends { | ||
default: any; | ||
} ? T_11["default"] : unknown : never : never>> : unknown : never : never; | ||
error?: undefined; | ||
response: TruncatedResponse; | ||
} | { | ||
data?: undefined; | ||
error: T[U_1][keyof T[U_1]] extends infer T_12 ? T_12 extends T[U_1][keyof T[U_1]] ? T_12 extends { | ||
responses: any; | ||
} ? NonNullable<Unwrap<T_12["responses"] extends infer T_13 ? T_13 extends T_12["responses"] ? T_13 extends { | ||
500: any; | ||
} ? T_13[500] : T_13 extends { | ||
404: any; | ||
} ? T_13[404] : T_13 extends { | ||
402: any; | ||
} ? T_13[402] : T_13 extends { | ||
401: any; | ||
} ? T_13[401] : T_13 extends { | ||
400: any; | ||
} ? T_13[400] : T_13 extends { | ||
422: any; | ||
} ? T_13[422] : T_13 extends { | ||
418: any; | ||
} ? T_13[418] : T_13 extends { | ||
417: any; | ||
} ? T_13[417] : T_13 extends { | ||
416: any; | ||
} ? T_13[416] : T_13 extends { | ||
415: any; | ||
} ? T_13[415] : T_13 extends { | ||
414: any; | ||
} ? T_13[414] : T_13 extends { | ||
413: any; | ||
} ? T_13[413] : T_13 extends { | ||
412: any; | ||
} ? T_13[412] : T_13 extends { | ||
411: any; | ||
} ? T_13[411] : T_13 extends { | ||
410: any; | ||
} ? T_13[410] : T_13 extends { | ||
409: any; | ||
} ? T_13[409] : T_13 extends { | ||
408: any; | ||
} ? T_13[408] : T_13 extends { | ||
407: any; | ||
} ? T_13[407] : T_13 extends { | ||
406: any; | ||
} ? T_13[406] : T_13 extends { | ||
405: any; | ||
} ? T_13[405] : T_13 extends { | ||
default: any; | ||
} ? T_13["default"] : unknown : never : never>> : unknown : never : never; | ||
response: TruncatedResponse; | ||
}>; | ||
put<U_1 extends PathsWith<T, "put">, M_1 extends keyof T[U_1]>(url: U_1, init: FetchOptions<T[U_1][M_1]>): Promise<FetchResponse<T[U_1][keyof T[U_1]]>>; | ||
/** Call a POST endpoint */ | ||
post<U_2 extends { [Path_2 in keyof T]: T[Path_2] extends { | ||
post: unknown; | ||
} ? Path_2 : never; }[keyof T], M_2 extends keyof T[U_2]>(url: U_2, options: (T[U_2][M_2] extends infer T_14 ? T_14 extends T[U_2][M_2] ? T_14 extends { | ||
parameters: any; | ||
} ? { | ||
params: T_14["parameters"]; | ||
} : { | ||
params?: BaseParams | undefined; | ||
} : never : never) & (T[U_2][M_2] extends infer T_15 ? T_15 extends T[U_2][M_2] ? T_15 extends { | ||
parameters: any; | ||
} ? { | ||
params: T_15["parameters"]; | ||
} : { | ||
params?: BaseParams | undefined; | ||
} : never : never) & (T[U_2][M_2] extends infer T_16 ? T_16 extends T[U_2][M_2] ? T_16 extends { | ||
requestBody: any; | ||
} ? { | ||
body: Unwrap<T_16["requestBody"]>; | ||
} : { | ||
body?: undefined; | ||
} : never : never) & Omit<RequestInit, "body">): Promise<{ | ||
data: T[U_2][keyof T[U_2]] extends infer T_17 ? T_17 extends T[U_2][keyof T[U_2]] ? T_17 extends { | ||
responses: any; | ||
} ? NonNullable<Unwrap<T_17["responses"] extends infer T_18 ? T_18 extends T_17["responses"] ? T_18 extends { | ||
200: any; | ||
} ? T_18[200] : T_18 extends { | ||
201: any; | ||
} ? T_18[201] : T_18 extends { | ||
202: any; | ||
} ? T_18[202] : T_18 extends { | ||
default: any; | ||
} ? T_18["default"] : unknown : never : never>> : unknown : never : never; | ||
error?: undefined; | ||
response: TruncatedResponse; | ||
} | { | ||
data?: undefined; | ||
error: T[U_2][keyof T[U_2]] extends infer T_19 ? T_19 extends T[U_2][keyof T[U_2]] ? T_19 extends { | ||
responses: any; | ||
} ? NonNullable<Unwrap<T_19["responses"] extends infer T_20 ? T_20 extends T_19["responses"] ? T_20 extends { | ||
500: any; | ||
} ? T_20[500] : T_20 extends { | ||
404: any; | ||
} ? T_20[404] : T_20 extends { | ||
402: any; | ||
} ? T_20[402] : T_20 extends { | ||
401: any; | ||
} ? T_20[401] : T_20 extends { | ||
400: any; | ||
} ? T_20[400] : T_20 extends { | ||
422: any; | ||
} ? T_20[422] : T_20 extends { | ||
418: any; | ||
} ? T_20[418] : T_20 extends { | ||
417: any; | ||
} ? T_20[417] : T_20 extends { | ||
416: any; | ||
} ? T_20[416] : T_20 extends { | ||
415: any; | ||
} ? T_20[415] : T_20 extends { | ||
414: any; | ||
} ? T_20[414] : T_20 extends { | ||
413: any; | ||
} ? T_20[413] : T_20 extends { | ||
412: any; | ||
} ? T_20[412] : T_20 extends { | ||
411: any; | ||
} ? T_20[411] : T_20 extends { | ||
410: any; | ||
} ? T_20[410] : T_20 extends { | ||
409: any; | ||
} ? T_20[409] : T_20 extends { | ||
408: any; | ||
} ? T_20[408] : T_20 extends { | ||
407: any; | ||
} ? T_20[407] : T_20 extends { | ||
406: any; | ||
} ? T_20[406] : T_20 extends { | ||
405: any; | ||
} ? T_20[405] : T_20 extends { | ||
default: any; | ||
} ? T_20["default"] : unknown : never : never>> : unknown : never : never; | ||
response: TruncatedResponse; | ||
}>; | ||
post<U_2 extends PathsWith<T, "post">, M_2 extends keyof T[U_2]>(url: U_2, init: FetchOptions<T[U_2][M_2]>): Promise<FetchResponse<T[U_2][keyof T[U_2]]>>; | ||
/** Call a DELETE endpoint */ | ||
del<U_3 extends { [Path_3 in keyof T]: T[Path_3] extends { | ||
delete: unknown; | ||
} ? Path_3 : never; }[keyof T], M_3 extends keyof T[U_3]>(url: U_3, options: (T[U_3][M_3] extends infer T_21 ? T_21 extends T[U_3][M_3] ? T_21 extends { | ||
parameters: any; | ||
} ? { | ||
params: T_21["parameters"]; | ||
} : { | ||
params?: BaseParams | undefined; | ||
} : never : never) & (T[U_3][M_3] extends infer T_22 ? T_22 extends T[U_3][M_3] ? T_22 extends { | ||
parameters: any; | ||
} ? { | ||
params: T_22["parameters"]; | ||
} : { | ||
params?: BaseParams | undefined; | ||
} : never : never) & (T[U_3][M_3] extends infer T_23 ? T_23 extends T[U_3][M_3] ? T_23 extends { | ||
requestBody: any; | ||
} ? { | ||
body: Unwrap<T_23["requestBody"]>; | ||
} : { | ||
body?: undefined; | ||
} : never : never) & Omit<RequestInit, "body">): Promise<{ | ||
data: T[U_3][keyof T[U_3]] extends infer T_24 ? T_24 extends T[U_3][keyof T[U_3]] ? T_24 extends { | ||
responses: any; | ||
} ? NonNullable<Unwrap<T_24["responses"] extends infer T_25 ? T_25 extends T_24["responses"] ? T_25 extends { | ||
200: any; | ||
} ? T_25[200] : T_25 extends { | ||
201: any; | ||
} ? T_25[201] : T_25 extends { | ||
202: any; | ||
} ? T_25[202] : T_25 extends { | ||
default: any; | ||
} ? T_25["default"] : unknown : never : never>> : unknown : never : never; | ||
error?: undefined; | ||
response: TruncatedResponse; | ||
} | { | ||
data?: undefined; | ||
error: T[U_3][keyof T[U_3]] extends infer T_26 ? T_26 extends T[U_3][keyof T[U_3]] ? T_26 extends { | ||
responses: any; | ||
} ? NonNullable<Unwrap<T_26["responses"] extends infer T_27 ? T_27 extends T_26["responses"] ? T_27 extends { | ||
500: any; | ||
} ? T_27[500] : T_27 extends { | ||
404: any; | ||
} ? T_27[404] : T_27 extends { | ||
402: any; | ||
} ? T_27[402] : T_27 extends { | ||
401: any; | ||
} ? T_27[401] : T_27 extends { | ||
400: any; | ||
} ? T_27[400] : T_27 extends { | ||
422: any; | ||
} ? T_27[422] : T_27 extends { | ||
418: any; | ||
} ? T_27[418] : T_27 extends { | ||
417: any; | ||
} ? T_27[417] : T_27 extends { | ||
416: any; | ||
} ? T_27[416] : T_27 extends { | ||
415: any; | ||
} ? T_27[415] : T_27 extends { | ||
414: any; | ||
} ? T_27[414] : T_27 extends { | ||
413: any; | ||
} ? T_27[413] : T_27 extends { | ||
412: any; | ||
} ? T_27[412] : T_27 extends { | ||
411: any; | ||
} ? T_27[411] : T_27 extends { | ||
410: any; | ||
} ? T_27[410] : T_27 extends { | ||
409: any; | ||
} ? T_27[409] : T_27 extends { | ||
408: any; | ||
} ? T_27[408] : T_27 extends { | ||
407: any; | ||
} ? T_27[407] : T_27 extends { | ||
406: any; | ||
} ? T_27[406] : T_27 extends { | ||
405: any; | ||
} ? T_27[405] : T_27 extends { | ||
default: any; | ||
} ? T_27["default"] : unknown : never : never>> : unknown : never : never; | ||
response: TruncatedResponse; | ||
}>; | ||
del<U_3 extends PathsWith<T, "delete">, M_3 extends keyof T[U_3]>(url: U_3, init: FetchOptions<T[U_3][M_3]>): Promise<FetchResponse<T[U_3][keyof T[U_3]]>>; | ||
/** Call a OPTIONS endpoint */ | ||
options<U_4 extends { [Path_4 in keyof T]: T[Path_4] extends { | ||
options: unknown; | ||
} ? Path_4 : never; }[keyof T], M_4 extends keyof T[U_4]>(url: U_4, options: (T[U_4][M_4] extends infer T_28 ? T_28 extends T[U_4][M_4] ? T_28 extends { | ||
parameters: any; | ||
} ? { | ||
params: T_28["parameters"]; | ||
} : { | ||
params?: BaseParams | undefined; | ||
} : never : never) & (T[U_4][M_4] extends infer T_29 ? T_29 extends T[U_4][M_4] ? T_29 extends { | ||
parameters: any; | ||
} ? { | ||
params: T_29["parameters"]; | ||
} : { | ||
params?: BaseParams | undefined; | ||
} : never : never) & (T[U_4][M_4] extends infer T_30 ? T_30 extends T[U_4][M_4] ? T_30 extends { | ||
requestBody: any; | ||
} ? { | ||
body: Unwrap<T_30["requestBody"]>; | ||
} : { | ||
body?: undefined; | ||
} : never : never) & Omit<RequestInit, "body">): Promise<{ | ||
data: T[U_4][keyof T[U_4]] extends infer T_31 ? T_31 extends T[U_4][keyof T[U_4]] ? T_31 extends { | ||
responses: any; | ||
} ? NonNullable<Unwrap<T_31["responses"] extends infer T_32 ? T_32 extends T_31["responses"] ? T_32 extends { | ||
200: any; | ||
} ? T_32[200] : T_32 extends { | ||
201: any; | ||
} ? T_32[201] : T_32 extends { | ||
202: any; | ||
} ? T_32[202] : T_32 extends { | ||
default: any; | ||
} ? T_32["default"] : unknown : never : never>> : unknown : never : never; | ||
error?: undefined; | ||
response: TruncatedResponse; | ||
} | { | ||
data?: undefined; | ||
error: T[U_4][keyof T[U_4]] extends infer T_33 ? T_33 extends T[U_4][keyof T[U_4]] ? T_33 extends { | ||
responses: any; | ||
} ? NonNullable<Unwrap<T_33["responses"] extends infer T_34 ? T_34 extends T_33["responses"] ? T_34 extends { | ||
500: any; | ||
} ? T_34[500] : T_34 extends { | ||
404: any; | ||
} ? T_34[404] : T_34 extends { | ||
402: any; | ||
} ? T_34[402] : T_34 extends { | ||
401: any; | ||
} ? T_34[401] : T_34 extends { | ||
400: any; | ||
} ? T_34[400] : T_34 extends { | ||
422: any; | ||
} ? T_34[422] : T_34 extends { | ||
418: any; | ||
} ? T_34[418] : T_34 extends { | ||
417: any; | ||
} ? T_34[417] : T_34 extends { | ||
416: any; | ||
} ? T_34[416] : T_34 extends { | ||
415: any; | ||
} ? T_34[415] : T_34 extends { | ||
414: any; | ||
} ? T_34[414] : T_34 extends { | ||
413: any; | ||
} ? T_34[413] : T_34 extends { | ||
412: any; | ||
} ? T_34[412] : T_34 extends { | ||
411: any; | ||
} ? T_34[411] : T_34 extends { | ||
410: any; | ||
} ? T_34[410] : T_34 extends { | ||
409: any; | ||
} ? T_34[409] : T_34 extends { | ||
408: any; | ||
} ? T_34[408] : T_34 extends { | ||
407: any; | ||
} ? T_34[407] : T_34 extends { | ||
406: any; | ||
} ? T_34[406] : T_34 extends { | ||
405: any; | ||
} ? T_34[405] : T_34 extends { | ||
default: any; | ||
} ? T_34["default"] : unknown : never : never>> : unknown : never : never; | ||
response: TruncatedResponse; | ||
}>; | ||
options<U_4 extends PathsWith<T, "options">, M_4 extends keyof T[U_4]>(url: U_4, init: FetchOptions<T[U_4][M_4]>): Promise<FetchResponse<T[U_4][keyof T[U_4]]>>; | ||
/** Call a HEAD endpoint */ | ||
head<U_5 extends { [Path_5 in keyof T]: T[Path_5] extends { | ||
head: unknown; | ||
} ? Path_5 : never; }[keyof T], M_5 extends keyof T[U_5]>(url: U_5, options: (T[U_5][M_5] extends infer T_35 ? T_35 extends T[U_5][M_5] ? T_35 extends { | ||
parameters: any; | ||
} ? { | ||
params: T_35["parameters"]; | ||
} : { | ||
params?: BaseParams | undefined; | ||
} : never : never) & (T[U_5][M_5] extends infer T_36 ? T_36 extends T[U_5][M_5] ? T_36 extends { | ||
parameters: any; | ||
} ? { | ||
params: T_36["parameters"]; | ||
} : { | ||
params?: BaseParams | undefined; | ||
} : never : never) & (T[U_5][M_5] extends infer T_37 ? T_37 extends T[U_5][M_5] ? T_37 extends { | ||
requestBody: any; | ||
} ? { | ||
body: Unwrap<T_37["requestBody"]>; | ||
} : { | ||
body?: undefined; | ||
} : never : never) & Omit<RequestInit, "body">): Promise<{ | ||
data: T[U_5][keyof T[U_5]] extends infer T_38 ? T_38 extends T[U_5][keyof T[U_5]] ? T_38 extends { | ||
responses: any; | ||
} ? NonNullable<Unwrap<T_38["responses"] extends infer T_39 ? T_39 extends T_38["responses"] ? T_39 extends { | ||
200: any; | ||
} ? T_39[200] : T_39 extends { | ||
201: any; | ||
} ? T_39[201] : T_39 extends { | ||
202: any; | ||
} ? T_39[202] : T_39 extends { | ||
default: any; | ||
} ? T_39["default"] : unknown : never : never>> : unknown : never : never; | ||
error?: undefined; | ||
response: TruncatedResponse; | ||
} | { | ||
data?: undefined; | ||
error: T[U_5][keyof T[U_5]] extends infer T_40 ? T_40 extends T[U_5][keyof T[U_5]] ? T_40 extends { | ||
responses: any; | ||
} ? NonNullable<Unwrap<T_40["responses"] extends infer T_41 ? T_41 extends T_40["responses"] ? T_41 extends { | ||
500: any; | ||
} ? T_41[500] : T_41 extends { | ||
404: any; | ||
} ? T_41[404] : T_41 extends { | ||
402: any; | ||
} ? T_41[402] : T_41 extends { | ||
401: any; | ||
} ? T_41[401] : T_41 extends { | ||
400: any; | ||
} ? T_41[400] : T_41 extends { | ||
422: any; | ||
} ? T_41[422] : T_41 extends { | ||
418: any; | ||
} ? T_41[418] : T_41 extends { | ||
417: any; | ||
} ? T_41[417] : T_41 extends { | ||
416: any; | ||
} ? T_41[416] : T_41 extends { | ||
415: any; | ||
} ? T_41[415] : T_41 extends { | ||
414: any; | ||
} ? T_41[414] : T_41 extends { | ||
413: any; | ||
} ? T_41[413] : T_41 extends { | ||
412: any; | ||
} ? T_41[412] : T_41 extends { | ||
411: any; | ||
} ? T_41[411] : T_41 extends { | ||
410: any; | ||
} ? T_41[410] : T_41 extends { | ||
409: any; | ||
} ? T_41[409] : T_41 extends { | ||
408: any; | ||
} ? T_41[408] : T_41 extends { | ||
407: any; | ||
} ? T_41[407] : T_41 extends { | ||
406: any; | ||
} ? T_41[406] : T_41 extends { | ||
405: any; | ||
} ? T_41[405] : T_41 extends { | ||
default: any; | ||
} ? T_41["default"] : unknown : never : never>> : unknown : never : never; | ||
response: TruncatedResponse; | ||
}>; | ||
head<U_5 extends PathsWith<T, "head">, M_5 extends keyof T[U_5]>(url: U_5, init: FetchOptions<T[U_5][M_5]>): Promise<FetchResponse<T[U_5][keyof T[U_5]]>>; | ||
/** Call a PATCH endpoint */ | ||
patch<U_6 extends { [Path_6 in keyof T]: T[Path_6] extends { | ||
patch: unknown; | ||
} ? Path_6 : never; }[keyof T], M_6 extends keyof T[U_6]>(url: U_6, options: (T[U_6][M_6] extends infer T_42 ? T_42 extends T[U_6][M_6] ? T_42 extends { | ||
parameters: any; | ||
} ? { | ||
params: T_42["parameters"]; | ||
} : { | ||
params?: BaseParams | undefined; | ||
} : never : never) & (T[U_6][M_6] extends infer T_43 ? T_43 extends T[U_6][M_6] ? T_43 extends { | ||
parameters: any; | ||
} ? { | ||
params: T_43["parameters"]; | ||
} : { | ||
params?: BaseParams | undefined; | ||
} : never : never) & (T[U_6][M_6] extends infer T_44 ? T_44 extends T[U_6][M_6] ? T_44 extends { | ||
requestBody: any; | ||
} ? { | ||
body: Unwrap<T_44["requestBody"]>; | ||
} : { | ||
body?: undefined; | ||
} : never : never) & Omit<RequestInit, "body">): Promise<{ | ||
data: T[U_6][keyof T[U_6]] extends infer T_45 ? T_45 extends T[U_6][keyof T[U_6]] ? T_45 extends { | ||
responses: any; | ||
} ? NonNullable<Unwrap<T_45["responses"] extends infer T_46 ? T_46 extends T_45["responses"] ? T_46 extends { | ||
200: any; | ||
} ? T_46[200] : T_46 extends { | ||
201: any; | ||
} ? T_46[201] : T_46 extends { | ||
202: any; | ||
} ? T_46[202] : T_46 extends { | ||
default: any; | ||
} ? T_46["default"] : unknown : never : never>> : unknown : never : never; | ||
error?: undefined; | ||
response: TruncatedResponse; | ||
} | { | ||
data?: undefined; | ||
error: T[U_6][keyof T[U_6]] extends infer T_47 ? T_47 extends T[U_6][keyof T[U_6]] ? T_47 extends { | ||
responses: any; | ||
} ? NonNullable<Unwrap<T_47["responses"] extends infer T_48 ? T_48 extends T_47["responses"] ? T_48 extends { | ||
500: any; | ||
} ? T_48[500] : T_48 extends { | ||
404: any; | ||
} ? T_48[404] : T_48 extends { | ||
402: any; | ||
} ? T_48[402] : T_48 extends { | ||
401: any; | ||
} ? T_48[401] : T_48 extends { | ||
400: any; | ||
} ? T_48[400] : T_48 extends { | ||
422: any; | ||
} ? T_48[422] : T_48 extends { | ||
418: any; | ||
} ? T_48[418] : T_48 extends { | ||
417: any; | ||
} ? T_48[417] : T_48 extends { | ||
416: any; | ||
} ? T_48[416] : T_48 extends { | ||
415: any; | ||
} ? T_48[415] : T_48 extends { | ||
414: any; | ||
} ? T_48[414] : T_48 extends { | ||
413: any; | ||
} ? T_48[413] : T_48 extends { | ||
412: any; | ||
} ? T_48[412] : T_48 extends { | ||
411: any; | ||
} ? T_48[411] : T_48 extends { | ||
410: any; | ||
} ? T_48[410] : T_48 extends { | ||
409: any; | ||
} ? T_48[409] : T_48 extends { | ||
408: any; | ||
} ? T_48[408] : T_48 extends { | ||
407: any; | ||
} ? T_48[407] : T_48 extends { | ||
406: any; | ||
} ? T_48[406] : T_48 extends { | ||
405: any; | ||
} ? T_48[405] : T_48 extends { | ||
default: any; | ||
} ? T_48["default"] : unknown : never : never>> : unknown : never : never; | ||
response: TruncatedResponse; | ||
}>; | ||
patch<U_6 extends PathsWith<T, "patch">, M_6 extends keyof T[U_6]>(url: U_6, init: FetchOptions<T[U_6][M_6]>): Promise<FetchResponse<T[U_6][keyof T[U_6]]>>; | ||
/** Call a TRACE endpoint */ | ||
trace<U_7 extends { [Path_7 in keyof T]: T[Path_7] extends { | ||
trace: unknown; | ||
} ? Path_7 : never; }[keyof T], M_7 extends keyof T[U_7]>(url: U_7, options: (T[U_7][M_7] extends infer T_49 ? T_49 extends T[U_7][M_7] ? T_49 extends { | ||
parameters: any; | ||
} ? { | ||
params: T_49["parameters"]; | ||
} : { | ||
params?: BaseParams | undefined; | ||
} : never : never) & (T[U_7][M_7] extends infer T_50 ? T_50 extends T[U_7][M_7] ? T_50 extends { | ||
parameters: any; | ||
} ? { | ||
params: T_50["parameters"]; | ||
} : { | ||
params?: BaseParams | undefined; | ||
} : never : never) & (T[U_7][M_7] extends infer T_51 ? T_51 extends T[U_7][M_7] ? T_51 extends { | ||
requestBody: any; | ||
} ? { | ||
body: Unwrap<T_51["requestBody"]>; | ||
} : { | ||
body?: undefined; | ||
} : never : never) & Omit<RequestInit, "body">): Promise<{ | ||
data: T[U_7][keyof T[U_7]] extends infer T_52 ? T_52 extends T[U_7][keyof T[U_7]] ? T_52 extends { | ||
responses: any; | ||
} ? NonNullable<Unwrap<T_52["responses"] extends infer T_53 ? T_53 extends T_52["responses"] ? T_53 extends { | ||
200: any; | ||
} ? T_53[200] : T_53 extends { | ||
201: any; | ||
} ? T_53[201] : T_53 extends { | ||
202: any; | ||
} ? T_53[202] : T_53 extends { | ||
default: any; | ||
} ? T_53["default"] : unknown : never : never>> : unknown : never : never; | ||
error?: undefined; | ||
response: TruncatedResponse; | ||
} | { | ||
data?: undefined; | ||
error: T[U_7][keyof T[U_7]] extends infer T_54 ? T_54 extends T[U_7][keyof T[U_7]] ? T_54 extends { | ||
responses: any; | ||
} ? NonNullable<Unwrap<T_54["responses"] extends infer T_55 ? T_55 extends T_54["responses"] ? T_55 extends { | ||
500: any; | ||
} ? T_55[500] : T_55 extends { | ||
404: any; | ||
} ? T_55[404] : T_55 extends { | ||
402: any; | ||
} ? T_55[402] : T_55 extends { | ||
401: any; | ||
} ? T_55[401] : T_55 extends { | ||
400: any; | ||
} ? T_55[400] : T_55 extends { | ||
422: any; | ||
} ? T_55[422] : T_55 extends { | ||
418: any; | ||
} ? T_55[418] : T_55 extends { | ||
417: any; | ||
} ? T_55[417] : T_55 extends { | ||
416: any; | ||
} ? T_55[416] : T_55 extends { | ||
415: any; | ||
} ? T_55[415] : T_55 extends { | ||
414: any; | ||
} ? T_55[414] : T_55 extends { | ||
413: any; | ||
} ? T_55[413] : T_55 extends { | ||
412: any; | ||
} ? T_55[412] : T_55 extends { | ||
411: any; | ||
} ? T_55[411] : T_55 extends { | ||
410: any; | ||
} ? T_55[410] : T_55 extends { | ||
409: any; | ||
} ? T_55[409] : T_55 extends { | ||
408: any; | ||
} ? T_55[408] : T_55 extends { | ||
407: any; | ||
} ? T_55[407] : T_55 extends { | ||
406: any; | ||
} ? T_55[406] : T_55 extends { | ||
405: any; | ||
} ? T_55[405] : T_55 extends { | ||
default: any; | ||
} ? T_55["default"] : unknown : never : never>> : unknown : never : never; | ||
response: TruncatedResponse; | ||
}>; | ||
trace<U_7 extends PathsWith<T, "trace">, M_7 extends keyof T[U_7]>(url: U_7, init: FetchOptions<T[U_7][M_7]>): Promise<FetchResponse<T[U_7][keyof T[U_7]]>>; | ||
}; | ||
export {}; |
const DEFAULT_HEADERS = { | ||
'Content-Type': 'application/json', | ||
}; | ||
export const methods = ['get', 'put', 'post', 'delete', 'options', 'head', 'patch', 'trace']; | ||
export default function createClient(defaultOptions) { | ||
export default function createClient(options) { | ||
const defaultHeaders = new Headers({ | ||
...DEFAULT_HEADERS, | ||
...(defaultOptions?.headers ?? {}), | ||
...(options?.headers ?? {}), | ||
}); | ||
async function coreFetch(url, options) { | ||
let { headers, body, params = {}, ...init } = options || {}; | ||
async function coreFetch(url, fetchOptions) { | ||
let { headers, body, params = {}, ...init } = fetchOptions || {}; | ||
// URL | ||
let finalURL = `${defaultOptions?.baseUrl ?? ''}${url}`; | ||
let finalURL = `${options?.baseUrl ?? ''}${url}`; | ||
const { path, query } = params ?? {}; | ||
@@ -32,3 +31,3 @@ if (path) | ||
redirect: 'follow', | ||
...defaultOptions, | ||
...options, | ||
...init, | ||
@@ -52,34 +51,34 @@ headers: baseHeaders, | ||
/** Call a GET endpoint */ | ||
async get(url, options) { | ||
return coreFetch(url, { ...options, method: 'GET' }); | ||
async get(url, init) { | ||
return coreFetch(url, { ...init, method: 'GET' }); | ||
}, | ||
/** Call a PUT endpoint */ | ||
async put(url, options) { | ||
return coreFetch(url, { ...options, method: 'PUT' }); | ||
async put(url, init) { | ||
return coreFetch(url, { ...init, method: 'PUT' }); | ||
}, | ||
/** Call a POST endpoint */ | ||
async post(url, options) { | ||
return coreFetch(url, { ...options, method: 'POST' }); | ||
async post(url, init) { | ||
return coreFetch(url, { ...init, method: 'POST' }); | ||
}, | ||
/** Call a DELETE endpoint */ | ||
async del(url, options) { | ||
return coreFetch(url, { ...options, method: 'DELETE' }); | ||
async del(url, init) { | ||
return coreFetch(url, { ...init, method: 'DELETE' }); | ||
}, | ||
/** Call a OPTIONS endpoint */ | ||
async options(url, options) { | ||
return coreFetch(url, { ...options, method: 'OPTIONS' }); | ||
async options(url, init) { | ||
return coreFetch(url, { ...init, method: 'OPTIONS' }); | ||
}, | ||
/** Call a HEAD endpoint */ | ||
async head(url, options) { | ||
return coreFetch(url, { ...options, method: 'HEAD' }); | ||
async head(url, init) { | ||
return coreFetch(url, { ...init, method: 'HEAD' }); | ||
}, | ||
/** Call a PATCH endpoint */ | ||
async patch(url, options) { | ||
return coreFetch(url, { ...options, method: 'PATCH' }); | ||
async patch(url, init) { | ||
return coreFetch(url, { ...init, method: 'PATCH' }); | ||
}, | ||
/** Call a TRACE endpoint */ | ||
async trace(url, options) { | ||
return coreFetch(url, { ...options, method: 'TRACE' }); | ||
async trace(url, init) { | ||
return coreFetch(url, { ...init, method: 'TRACE' }); | ||
}, | ||
}; | ||
} |
@@ -1,1 +0,1 @@ | ||
var l={"Content-Type":"application/json"},P=["get","put","post","delete","options","head","patch","trace"];function m(d){let h=new Headers({...l,...d?.headers??{}});async function s(e,t){let{headers:x,body:T,params:u={},...U}=t||{},a=`${d?.baseUrl??""}${e}`,{path:p,query:c}=u??{};if(p)for(let[r,o]of Object.entries(p))a=a.replace(`{${r}}`,encodeURIComponent(`${o}`.trim()));c&&(a=`${a}?${new URLSearchParams(c).toString()}`);let y=new Headers(h),f=new Headers(x);for(let[r,o]of f.entries())o==null?y.delete(r):y.set(r,o);let n=await fetch(a,{redirect:"follow",...d,...U,headers:y,body:typeof T=="string"?T:JSON.stringify(T)}),i={bodyUsed:n.bodyUsed,headers:n.headers,ok:n.ok,redirected:n.redirected,status:n.status,statusText:n.statusText,type:n.type,url:n.url};return n.ok?{data:await n.json(),response:i}:{error:await n.json(),response:i}}return{async get(e,t){return s(e,{...t,method:"GET"})},async put(e,t){return s(e,{...t,method:"PUT"})},async post(e,t){return s(e,{...t,method:"POST"})},async del(e,t){return s(e,{...t,method:"DELETE"})},async options(e,t){return s(e,{...t,method:"OPTIONS"})},async head(e,t){return s(e,{...t,method:"HEAD"})},async patch(e,t){return s(e,{...t,method:"PATCH"})},async trace(e,t){return s(e,{...t,method:"TRACE"})}}}export{m as default,P as methods}; | ||
var l={"Content-Type":"application/json"};function m(T){let h=new Headers({...l,...T?.headers??{}});async function s(e,t){let{headers:x,body:d,params:u={},...U}=t||{},a=`${T?.baseUrl??""}${e}`,{path:p,query:c}=u??{};if(p)for(let[o,r]of Object.entries(p))a=a.replace(`{${o}}`,encodeURIComponent(`${r}`.trim()));c&&(a=`${a}?${new URLSearchParams(c).toString()}`);let y=new Headers(h),f=new Headers(x);for(let[o,r]of f.entries())r==null?y.delete(o):y.set(o,r);let n=await fetch(a,{redirect:"follow",...T,...U,headers:y,body:typeof d=="string"?d:JSON.stringify(d)}),i={bodyUsed:n.bodyUsed,headers:n.headers,ok:n.ok,redirected:n.redirected,status:n.status,statusText:n.statusText,type:n.type,url:n.url};return n.ok?{data:await n.json(),response:i}:{error:await n.json(),response:i}}return{async get(e,t){return s(e,{...t,method:"GET"})},async put(e,t){return s(e,{...t,method:"PUT"})},async post(e,t){return s(e,{...t,method:"POST"})},async del(e,t){return s(e,{...t,method:"DELETE"})},async options(e,t){return s(e,{...t,method:"OPTIONS"})},async head(e,t){return s(e,{...t,method:"HEAD"})},async patch(e,t){return s(e,{...t,method:"PATCH"})},async trace(e,t){return s(e,{...t,method:"TRACE"})}}}export{m as default}; |
{ | ||
"name": "openapi-fetch", | ||
"version": "0.0.7", | ||
"version": "0.0.8", | ||
"author": { | ||
@@ -5,0 +5,0 @@ "name": "Drew Powers", |
@@ -201,3 +201,3 @@ # 🎾 openapi-fetch | ||
}, | ||
}); | ||
}) as typeof client; | ||
@@ -204,0 +204,0 @@ // src/some-other-file.ts |
190
src/index.ts
@@ -16,5 +16,19 @@ const DEFAULT_HEADERS = { | ||
export const methods = ['get', 'put', 'post', 'delete', 'options', 'head', 'patch', 'trace'] as const; | ||
export type Method = (typeof methods)[number]; | ||
export type Method = 'get' | 'put' | 'post' | 'delete' | 'options' | 'head' | 'patch' | 'trace'; | ||
/** Gets a union of paths which have method */ | ||
type PathsWith<T, M extends Method> = { | ||
[Path in keyof T]: T[Path] extends { [K in M]: unknown } ? Path : never; | ||
}[keyof T]; | ||
type PathParams<T> = T extends { parameters: any } ? { params: T['parameters'] } : { params?: BaseParams }; | ||
type MethodParams<T> = T extends { | ||
parameters: any; | ||
} | ||
? { params: T['parameters'] } | ||
: { params?: BaseParams }; | ||
type Params<T> = PathParams<T> & MethodParams<T>; | ||
type RequestBody<T> = T extends { requestBody: any } ? { body: Unwrap<T['requestBody']> } : { body?: never }; | ||
type FetchOptions<T> = Params<T> & RequestBody<T> & Omit<RequestInit, 'body'>; | ||
type TruncatedResponse = Omit<Response, 'arrayBuffer' | 'blob' | 'body' | 'clone' | 'formData' | 'json' | 'text'>; | ||
@@ -32,86 +46,73 @@ /** Infer request/response from content type */ | ||
export default function createClient<T>(defaultOptions?: ClientOptions) { | ||
type Success<T> = T extends { 200: any } ? T[200] : T extends { 201: any } ? T[201] : T extends { 202: any } ? T[202] : T extends { default: any } ? T['default'] : unknown; | ||
type Error<T> = T extends { 500: any } | ||
? T[500] | ||
: T extends { 404: any } | ||
? T[404] | ||
: T extends { 402: any } | ||
? T[402] | ||
: T extends { 401: any } | ||
? T[401] | ||
: T extends { 400: any } | ||
? T[400] | ||
: T extends { 422: any } | ||
? T[422] | ||
: T extends { 418: any } | ||
? T[418] | ||
: T extends { 417: any } | ||
? T[417] | ||
: T extends { 416: any } | ||
? T[416] | ||
: T extends { 415: any } | ||
? T[415] | ||
: T extends { 414: any } | ||
? T[414] | ||
: T extends { 413: any } | ||
? T[413] | ||
: T extends { 412: any } | ||
? T[412] | ||
: T extends { 411: any } | ||
? T[411] | ||
: T extends { 410: any } | ||
? T[410] | ||
: T extends { 409: any } | ||
? T[409] | ||
: T extends { 408: any } | ||
? T[408] | ||
: T extends { 407: any } | ||
? T[407] | ||
: T extends { 406: any } | ||
? T[406] | ||
: T extends { 405: any } | ||
? T[405] | ||
: T extends { default: any } | ||
? T['default'] | ||
: unknown; | ||
type FetchResponse<T> = | ||
| { | ||
data: T extends { responses: any } ? NonNullable<Unwrap<Success<T['responses']>>> : unknown; | ||
error?: never; | ||
response: TruncatedResponse; | ||
} | ||
| { | ||
data?: never; | ||
error: T extends { responses: any } ? NonNullable<Unwrap<Error<T['responses']>>> : unknown; | ||
response: TruncatedResponse; | ||
}; | ||
export default function createClient<T>(options?: ClientOptions) { | ||
const defaultHeaders = new Headers({ | ||
...DEFAULT_HEADERS, | ||
...(defaultOptions?.headers ?? {}), | ||
...(options?.headers ?? {}), | ||
}); | ||
/** Gets a union of paths which have method */ | ||
type PathsWith<M extends Method> = { | ||
[Path in keyof T]: T[Path] extends { [K in M]: unknown } ? Path : never; | ||
}[keyof T]; | ||
async function coreFetch<U extends keyof T, M extends keyof T[U]>(url: U, fetchOptions: FetchOptions<T[U][M]>): Promise<FetchResponse<T[U][M]>> { | ||
let { headers, body, params = {}, ...init } = fetchOptions || {}; | ||
type FetchResponse<T> = | ||
| { | ||
data: T extends { responses: any } ? NonNullable<Unwrap<Success<T['responses']>>> : unknown; | ||
error?: never; | ||
response: TruncatedResponse; | ||
} | ||
| { | ||
data?: never; | ||
error: T extends { responses: any } ? NonNullable<Unwrap<Error<T['responses']>>> : unknown; | ||
response: TruncatedResponse; | ||
}; | ||
type PathParams<T> = T extends { parameters: any } ? { params: T['parameters'] } : { params?: BaseParams }; | ||
type MethodParams<T> = T extends { | ||
parameters: any; | ||
} | ||
? { params: T['parameters'] } | ||
: { params?: BaseParams }; | ||
type Params<T> = PathParams<T> & MethodParams<T>; | ||
type RequestBody<T> = T extends { requestBody: any } ? { body: Unwrap<T['requestBody']> } : { body?: never }; | ||
type FetchOptions<T> = Params<T> & RequestBody<T> & Omit<RequestInit, 'body'>; | ||
type Success<T> = T extends { 200: any } ? T[200] : T extends { 201: any } ? T[201] : T extends { 202: any } ? T[202] : T extends { default: any } ? T['default'] : unknown; | ||
type Error<T> = T extends { 500: any } | ||
? T[500] | ||
: T extends { 404: any } | ||
? T[404] | ||
: T extends { 402: any } | ||
? T[402] | ||
: T extends { 401: any } | ||
? T[401] | ||
: T extends { 400: any } | ||
? T[400] | ||
: T extends { 422: any } | ||
? T[422] | ||
: T extends { 418: any } | ||
? T[418] | ||
: T extends { 417: any } | ||
? T[417] | ||
: T extends { 416: any } | ||
? T[416] | ||
: T extends { 415: any } | ||
? T[415] | ||
: T extends { 414: any } | ||
? T[414] | ||
: T extends { 413: any } | ||
? T[413] | ||
: T extends { 412: any } | ||
? T[412] | ||
: T extends { 411: any } | ||
? T[411] | ||
: T extends { 410: any } | ||
? T[410] | ||
: T extends { 409: any } | ||
? T[409] | ||
: T extends { 408: any } | ||
? T[408] | ||
: T extends { 407: any } | ||
? T[407] | ||
: T extends { 406: any } | ||
? T[406] | ||
: T extends { 405: any } | ||
? T[405] | ||
: T extends { default: any } | ||
? T['default'] | ||
: unknown; | ||
async function coreFetch<U extends keyof T, M extends keyof T[U]>(url: U, options: FetchOptions<T[U][M]>): Promise<FetchResponse<T[U][M]>> { | ||
let { headers, body, params = {}, ...init } = options || {}; | ||
// URL | ||
let finalURL = `${defaultOptions?.baseUrl ?? ''}${url as string}`; | ||
let finalURL = `${options?.baseUrl ?? ''}${url as string}`; | ||
const { path, query } = (params as BaseParams | undefined) ?? {}; | ||
if (path) for (const [k, v] of Object.entries(path)) finalURL = finalURL.replace(`{${k}}`, encodeURIComponent(`${v}`.trim())); | ||
if (query) finalURL = `${finalURL}?${new URLSearchParams(query as any).toString()}`; | ||
// headers | ||
@@ -124,6 +125,7 @@ const baseHeaders = new Headers(defaultHeaders); // clone defaults (don’t overwrite!) | ||
} | ||
// fetch! | ||
const res = await fetch(finalURL, { | ||
redirect: 'follow', | ||
...defaultOptions, | ||
...options, | ||
...init, | ||
@@ -148,34 +150,34 @@ headers: baseHeaders, | ||
/** Call a GET endpoint */ | ||
async get<U extends PathsWith<'get'>, M extends keyof T[U]>(url: U, options: FetchOptions<T[U][M]>) { | ||
return coreFetch(url, { ...options, method: 'GET' }); | ||
async get<U extends PathsWith<T, 'get'>, M extends keyof T[U]>(url: U, init: FetchOptions<T[U][M]>) { | ||
return coreFetch(url, { ...init, method: 'GET' }); | ||
}, | ||
/** Call a PUT endpoint */ | ||
async put<U extends PathsWith<'put'>, M extends keyof T[U]>(url: U, options: FetchOptions<T[U][M]>) { | ||
return coreFetch(url, { ...options, method: 'PUT' }); | ||
async put<U extends PathsWith<T, 'put'>, M extends keyof T[U]>(url: U, init: FetchOptions<T[U][M]>) { | ||
return coreFetch(url, { ...init, method: 'PUT' }); | ||
}, | ||
/** Call a POST endpoint */ | ||
async post<U extends PathsWith<'post'>, M extends keyof T[U]>(url: U, options: FetchOptions<T[U][M]>) { | ||
return coreFetch(url, { ...options, method: 'POST' }); | ||
async post<U extends PathsWith<T, 'post'>, M extends keyof T[U]>(url: U, init: FetchOptions<T[U][M]>) { | ||
return coreFetch(url, { ...init, method: 'POST' }); | ||
}, | ||
/** Call a DELETE endpoint */ | ||
async del<U extends PathsWith<'delete'>, M extends keyof T[U]>(url: U, options: FetchOptions<T[U][M]>) { | ||
return coreFetch(url, { ...options, method: 'DELETE' }); | ||
async del<U extends PathsWith<T, 'delete'>, M extends keyof T[U]>(url: U, init: FetchOptions<T[U][M]>) { | ||
return coreFetch(url, { ...init, method: 'DELETE' }); | ||
}, | ||
/** Call a OPTIONS endpoint */ | ||
async options<U extends PathsWith<'options'>, M extends keyof T[U]>(url: U, options: FetchOptions<T[U][M]>) { | ||
return coreFetch(url, { ...options, method: 'OPTIONS' }); | ||
async options<U extends PathsWith<T, 'options'>, M extends keyof T[U]>(url: U, init: FetchOptions<T[U][M]>) { | ||
return coreFetch(url, { ...init, method: 'OPTIONS' }); | ||
}, | ||
/** Call a HEAD endpoint */ | ||
async head<U extends PathsWith<'head'>, M extends keyof T[U]>(url: U, options: FetchOptions<T[U][M]>) { | ||
return coreFetch(url, { ...options, method: 'HEAD' }); | ||
async head<U extends PathsWith<T, 'head'>, M extends keyof T[U]>(url: U, init: FetchOptions<T[U][M]>) { | ||
return coreFetch(url, { ...init, method: 'HEAD' }); | ||
}, | ||
/** Call a PATCH endpoint */ | ||
async patch<U extends PathsWith<'patch'>, M extends keyof T[U]>(url: U, options: FetchOptions<T[U][M]>) { | ||
return coreFetch(url, { ...options, method: 'PATCH' }); | ||
async patch<U extends PathsWith<T, 'patch'>, M extends keyof T[U]>(url: U, init: FetchOptions<T[U][M]>) { | ||
return coreFetch(url, { ...init, method: 'PATCH' }); | ||
}, | ||
/** Call a TRACE endpoint */ | ||
async trace<U extends PathsWith<'trace'>, M extends keyof T[U]>(url: U, options: FetchOptions<T[U][M]>) { | ||
return coreFetch(url, { ...options, method: 'TRACE' }); | ||
async trace<U extends PathsWith<T, 'trace'>, M extends keyof T[U]>(url: U, init: FetchOptions<T[U][M]>) { | ||
return coreFetch(url, { ...init, method: 'TRACE' }); | ||
}, | ||
}; | ||
} |
@@ -5,2 +5,3 @@ { | ||
"declaration": true, | ||
"downlevelIteration": false, | ||
"esModuleInterop": true, | ||
@@ -7,0 +8,0 @@ "module": "ESNext", |
13
43898
656