UNPKG

@myparcel/sdk

Version:

JavaScript SDK to connect to the MyParcel API via Node.js or browser

56 lines (54 loc) 2.59 kB
import { Interceptors } from './middleware/Interceptors'; import { RequestHeaders, ResponseWrapper } from '../../types/request.types'; import { AbstractEndpoint } from '../endpoint/AbstractEndpoint'; import { AbstractClient } from './AbstractClient'; interface ClientPlugin { getClient?: () => void; init?: (client: AbstractClient) => void; transformRequest?: () => void; transformResponse?: <Endpoint extends AbstractEndpoint>(response: ResponseWrapper<EndpointResponseBody<Endpoint>>) => ResponseWrapper<EndpointResponseBody<Endpoint>>; } type PluginConstructor = (client: AbstractClient) => ClientPlugin; export interface ClientConfig { baseUrl?: string; headers?: RequestHeaders; parameters?: Record<string, string>; plugins?: PluginConstructor[]; options?: ClientOptions; interceptors?: { request: Interceptors<RequestInit>; response: Interceptors<Response>; }; } export interface ClientOptions { timeout?: number; [key: string]: unknown; } export type ClientRequest = <E extends AbstractEndpoint>(endpoint: E, options: OptionsWithoutBody<E> | OptionsWithBody<E>) => Promise<ResponseWrapper<EndpointResponseBody<E>>>; export type EndpointParameters<E extends AbstractEndpoint> = E['definition']['parameters']; export type EndpointPath<E extends AbstractEndpoint> = E['definition']['path']; export type EndpointResponse<E extends AbstractEndpoint> = E['definition']['response']; export type PaginatedEndpointResponse<E extends AbstractEndpoint> = E['definition']['response'] & { page?: number; size?: number; results?: number; }; export type EndpointBody<E extends AbstractEndpoint> = E['definition']['body']; export type EndpointResponseProperty<E extends AbstractEndpoint> = E['responseProperty'] extends string ? E['responseProperty'] : E['property'] extends string ? E['property'] : never; type EndpointResponseBodyWrapper<E extends AbstractEndpoint> = EndpointResponseProperty<E>; type Page = 'page' | 'size' | 'results'; export type EndpointResponseBody<E extends AbstractEndpoint> = { [key in EndpointResponseBodyWrapper<E>]: EndpointResponse<E>; } & { [key in Page]?: number; }; export interface OptionsWithBody<E extends AbstractEndpoint> { body?: EndpointBody<E>; headers?: RequestHeaders; parameters?: EndpointParameters<E>; path?: EndpointPath<E>; timeout?: number; } export type OptionsWithoutBody<E extends AbstractEndpoint> = Omit<OptionsWithBody<E>, 'body'>; export type Options<E extends AbstractEndpoint> = OptionsWithBody<E> | OptionsWithoutBody<E>; export {};