@data-client/endpoint
Version:
Declarative Network Interface Definitions
154 lines (152 loc) • 5.3 kB
TypeScript
// had to remove all [...T], which included importing PartialParameters from types
// also relaxed constraints on call,apply,bind *this*
/* eslint-disable @typescript-eslint/ban-types */
import type { EndpointInterface, Schema } from './interface.js';
import type { EndpointExtraOptions, FetchFunction } from './types.js';
export interface EndpointOptions<
F extends FetchFunction = FetchFunction,
S extends Schema | undefined = undefined,
M extends boolean | undefined = false,
> extends EndpointExtraOptions<F> {
key?: (...args: Parameters<F>) => string;
sideEffect?: M;
schema?: S;
[k: string]: any;
}
export interface EndpointExtendOptions<
F extends FetchFunction = FetchFunction,
S extends Schema | undefined = Schema | undefined,
M extends boolean | undefined = boolean | undefined,
> extends EndpointOptions<F, S, M> {
fetch?: FetchFunction;
}
export type ParamFromFetch<F> =
F extends (params: infer P, body?: any) => Promise<any> ? P : never;
export type KeyofEndpointInstance = keyof EndpointInstance<FetchFunction>;
export type ExtendedEndpoint<
O extends EndpointExtendOptions<F>,
E extends EndpointInstance<
FetchFunction,
Schema | undefined,
boolean | undefined
>,
F extends FetchFunction,
> = EndpointInstance<
'fetch' extends keyof O ? Exclude<O['fetch'], undefined> : E['fetch'],
'schema' extends keyof O ? O['schema'] : E['schema'],
'sideEffect' extends keyof O ? O['sideEffect'] : E['sideEffect']
> &
Omit<O, KeyofEndpointInstance> &
Omit<E, KeyofEndpointInstance>;
/**
* Defines an async data source.
* @see https://dataclient.io/docs/api/Endpoint
*/
export interface EndpointInstance<
F extends (...args: any) => Promise<any> = FetchFunction,
S extends Schema | undefined = Schema | undefined,
M extends boolean | undefined = boolean | undefined,
> extends EndpointInstanceInterface<F, S, M> {
extend<
E extends EndpointInstance<
(...args: any) => Promise<any>,
Schema | undefined,
boolean | undefined
>,
O extends EndpointExtendOptions<F> &
Partial<Omit<E, keyof EndpointInstance<FetchFunction>>> &
Record<string, unknown>,
>(
this: E,
options: Readonly<O>,
): ExtendedEndpoint<typeof options, E, F>;
}
/**
* Defines an async data source.
* @see https://dataclient.io/docs/api/Endpoint
*/
export interface EndpointInstanceInterface<
F extends FetchFunction = FetchFunction,
S extends Schema | undefined = Schema | undefined,
M extends boolean | undefined = boolean | undefined,
> extends EndpointInterface<F, S, M> {
constructor: EndpointConstructor;
/**
* Calls the function, substituting the specified object for the this value of the function, and the specified array for the arguments of the function.
* @param thisArg The object to be used as the this object.
* @param argArray A set of arguments to be passed to the function.
*/
apply<E extends FetchFunction>(
this: E,
thisArg: any,
argArray?: Parameters<E>,
): ReturnType<E>;
/**
* Calls a method of an object, substituting another object for the current object.
* @param thisArg The object to be used as the current object.
* @param argArray A list of arguments to be passed to the method.
*/
call<E extends FetchFunction>(
this: E,
thisArg: any,
...argArray: Parameters<E>
): ReturnType<E>;
/**
* For a given function, creates a bound function that has the same body as the original function.
* The this object of the bound function is associated with the specified object, and has the specified initial parameters.
* @param thisArg An object to which the this keyword can refer inside the new function.
* @param argArray A list of arguments to be passed to the new function.
*/
bind<E extends FetchFunction, P extends Parameters<E>>(
this: E,
thisArg: any,
...args: P
): EndpointInstance<() => ReturnType<E>, S, M> &
Omit<E, keyof EndpointInstance<FetchFunction>>;
/** Returns a string representation of a function. */
toString(): string;
prototype: any;
readonly length: number;
arguments: any;
caller: F;
key(...args: Parameters<F>): string;
readonly sideEffect: M;
readonly schema: S;
fetch: F;
/** @see https://dataclient.io/rest/api/Endpoint#testKey */
testKey(key: string): boolean;
}
export interface EndpointConstructor {
new <
F extends (
this: EndpointInstance<FetchFunction> & E,
params?: any,
body?: any,
) => Promise<any>,
S extends Schema | undefined = undefined,
M extends boolean | undefined = false,
E extends Record<string, any> = {},
>(
fetchFunction: F,
options?: EndpointOptions<F, S, M> & E,
): EndpointInstance<F, S, M> & E;
readonly prototype: Function;
}
export interface ExtendableEndpointConstructor {
new <
F extends (
this: EndpointInstanceInterface<FetchFunction> & E,
params?: any,
body?: any,
) => Promise<any>,
S extends Schema | undefined = undefined,
M extends boolean | undefined = false,
E extends Record<string, any> = {},
>(
RestFetch: F,
options?: Readonly<EndpointOptions<F, S, M>> & E,
): EndpointInstanceInterface<F, S, M> & E;
readonly prototype: Function;
}
export {};
//# sourceMappingURL=endpointTypes.d.ts.map