4.1.0 • Published 8 months ago
@devmoods/fetch v4.1.0
@devmoods/fetch
JSON-friendly wrapper around the Fetch API Fetch API with some additional features.
pnpm install @devmoods/fetchFeatures
- Assume JSON responses and always make it available as
response.jsonData- no need toawait response.json() - Create
fetchinstances with pre-configured options and root URLs. - Type argument
fetch<T>to specify response types, optionally inferred via Standard Schema validators - Throw a
HttpErrorwhenstatus < 200orstatus >= 400(containingerror.response) - Timeout after x seconds
- Automatic retries with configurable behaviour
- Request and Response interceptors
- Attach
X-Request-IDto all requests. Retried requests have the same ID - Camel to snake and snake to camel property transformers
Examples
Setup a configured fetch instance
import { createFetch, TimeoutError } from '@devmoods/fetch';
const fetch = createFetch({
getRootUrl: () => 'http://localhost:3000/api',
timeout: 1000,
retryOn: () => (error) => error instanceof TimeoutError,
});
fetch.intercept({
request: (request) => console.log(request),
response: (response) => console.log(response),
});Basic usage
type User = Record<string, any>;
const response = await fetch<User>('/users/1');
console.log(response.jsonData);
await fetch<User[]>('/users', {
timeout: 5000,
credentials: 'include',
retryOn: () = false
});Transforms
import { createFetch, snakeToCamelCase } from '@devmoods/fetch';
const fetch = createFetch({ transform: snakeToCamelCase });
await fetch('/users');Standard Schema
Validates the transformed data. See above.
import { type } from 'arktype';
const post = type({ name: 'string', body: 'string' });
await fetch('/names', { schema: post.array() });createRetryOn
Use the exported createRetryOn to create functions you can pass to retryOn. This utility makes it easy to limit amount of attempts, determine what errors to retry and setting a backoff strategy (e.g. linear or exponential).
import {
createFetch,
createRetryOn,
TimeoutError,
HttpError,
} from '@devmoods/fetch';
const fetch = createFetch({
getRootUrl: () => 'http://localhost:3000/api',
timeout: 20000,
retryOn: () =>
createRetryOn({
max: 5,
isRetriable: (error) =>
error instanceof HttpError
? error.response.status === 503
: error instanceof TimeoutError,
getDelay: (n) => 500 * n,
}),
});License
MIT