/** * @module http * Type-safe HTTP module built on fetch() with automatic JWT handling. * * @example * import { configure, get, post } from './http'; * * configure({ baseUrl: '/api' }); * const response = await get('/users'); * const users = response.as(); */ /** * Configuration options for the http module. */ export interface HttpOptions { /** * Root URL to remote endpoint. Used so that each method only has to specify path in requests. */ baseUrl?: string; /** * Default content type to use if none is specified in the request method. */ contentType?: string; /** * Checks for a JWT token in localStorage to automatically include it in requests. * * Undefined = use "jwt", null = disable. */ bearerTokenName?: string | null; /** * Default request timeout in milliseconds. * Uses `AbortSignal.timeout()` to automatically abort requests that take too long. * Can be overridden per-request by passing a `signal` in `RequestInit`. * * @example * configure({ baseUrl: '/api', timeout: 10000 }); // 10 second timeout */ timeout?: number; } /** * Response for request methods. */ export interface HttpResponse { /** * Http status code. */ statusCode: number; /** * Reason to why the status code was used. */ statusReason: string; /** * True if this is a 2xx response. */ success: boolean; /** * Content type of response body. */ contentType: string | null; /** * Body returned. * * Body has been read and deserialized from json (if the request content type was 'application/json' which is the default). */ body: unknown; /** * Charset used in body. */ charset: string | null; /** * Cast body to a type. */ as(): T; } /** * Error thrown when a request fails. */ export declare class HttpError extends Error { message: string; response: HttpResponse; constructor(response: HttpResponse); } /** * HTTP request options. */ export interface RequestOptions { method?: 'GET' | 'POST' | 'PUT' | 'DELETE'; mode?: 'cors' | 'no-cors' | '*cors' | 'same-origin'; cache: 'default' | 'no-store' | 'reload' | 'no-cache' | 'force-cache' | 'only-if-cached'; credentials: 'omit' | 'same-origin' | 'include'; headers: Map; redirect: 'follow' | 'manual' | '*follow' | 'error'; referrerPolicy: 'no-referrer' | '*no-referrer-when-downgrade' | 'origin' | 'origin-when-cross-origin' | 'same-origin' | 'strict-origin' | 'strict-origin-when-cross-origin' | 'unsafe-url'; /** * Will be serialized if the content type is json (and the body is an object). */ body: unknown; } declare type FetchFn = (input: RequestInfo | URL, init?: RequestInit) => Promise; /** * Replace the fetch implementation for testing purposes. * * @param fn - Custom fetch function, or undefined to restore the default. * * @example * setFetch(async (url, options) => { * return new Response(JSON.stringify({ id: 1 }), { status: 200 }); * }); */ export declare function setFetch(fn?: FetchFn): void; /** * Configure the http module. * * @example * configure({ baseUrl: '/api/v1', bearerTokenName: 'auth_token' }); */ export declare function configure(options: HttpOptions): void; /** * Make an HTTP request. * * @param url - URL to make the request against. * @param options - Request options. * @returns Response from server. * * @example * const response = await request('/users', { method: 'GET' }); */ export declare function request(url: string, options?: RequestInit): Promise; /** * GET a resource. * * @param url - URL to get resource from. * @param queryString - Optional query string parameters. * @param options - Request options. * @returns HTTP response. * * @example * const response = await get('/users', { page: '1', limit: '10' }); * const users = response.as(); */ export declare function get(url: string, queryString?: Record, options?: RequestInit): Promise; /** * POST a resource. * * @param url - URL to post to. * @param data - Data to post. * @param options - Request options. * @returns HTTP response. * * @example * const response = await post('/users', JSON.stringify({ name: 'John' })); */ export declare function post(url: string, data: BodyInit, options?: RequestInit): Promise; /** * PUT a resource. * * @param url - URL to resource. * @param data - Data to put. * @param options - Request options. * @returns HTTP response. * * @example * const response = await put('/users/1', JSON.stringify({ name: 'Jane' })); */ export declare function put(url: string, data: BodyInit, options?: RequestInit): Promise; /** * DELETE a resource. * * @param url - URL to resource. * @param options - Request options. * @returns HTTP response. * * @example * const response = await del('/users/1'); */ export declare function del(url: string, options?: RequestInit): Promise; export {};