import { EndpointInterface } from '@data-client/endpoint'; export interface HookableEndpointInterface extends EndpointInterface { extend(...args: any): HookableEndpointInterface; } /** Turns a collection of Endpoints (Resource) into a collection of hooks. * This is useful for Endpoints that need hooks to prepare their fetch requests. * * @see https://dataclient.io/rest/api/hookifyResource */ export default function hookifyResource( resource: R, useRequestInit: () => RequestInit, ): HookResource { const usingResource: Record HookableEndpointInterface> = {}; Object.keys(resource).forEach(key => { const endpoint = (resource as any)[key]; if (endpoint.extend !== undefined) usingResource[`use${capitalizeFirstLetter(key)}`] = () => { // this is false positive due to the dynamic nature of assignment // eslint-disable-next-line react-hooks/rules-of-hooks const requestInit = useRequestInit(); return endpoint.extend({ requestInit }); }; }); return usingResource as any; } export type HookResource = { [K in Extract as `use${Capitalize}`]: () => R[K]; }; function capitalizeFirstLetter(s: string) { return s.charAt(0).toUpperCase() + s.slice(1); }