@lightningkite/lightning-server-simplified
Version:
50 lines (47 loc) • 1.59 kB
text/typescript
type PathImpl<T, K extends keyof T> =
K extends string
? T[K] extends Record<string, any>
? T[K] extends ArrayLike<any>
? K | `${K}.${PathImpl<T[K], Exclude<keyof T[K], keyof any[]>>}`
: K | `${K}.${PathImpl<T[K], keyof T[K]>}`
: K
: never;
export type Path<T> = PathImpl<T, keyof T> | (keyof T & string);
/**
* @deprecated
*/
export function apiCall<T>(url: string, body: T, request: RequestInit, fileUploads?: Record<Path<T>, File>, responseInterceptors?: (x: Response)=>Response): Promise<Response> {
let f: Promise<Response>
if(fileUploads === undefined || Object.keys(fileUploads).length === 0) {
f = fetch(url, {
...request,
headers: {
...request.headers,
"Content-Type": "application/json",
"Accept": "application/json",
},
body: JSON.stringify(body)
})
} else {
const data = new FormData()
data.append("__json", JSON.stringify(body))
for(const key in fileUploads) {
data.append(key, fileUploads[key as Path<T>], fileUploads[key as Path<T>].name)
}
f = fetch(url, {
...request,
headers: {
...request.headers,
"Accept": "application/json",
},
body: data
})
}
return f.then(x => {
let response = responseInterceptors?.(x) ?? x
if(!response.ok) {
throw response
}
else return response
})
}