1.0.7 โข Published 9 months ago
@bytekit/autofetch v1.0.7
@bytekit/autofetch
A TypeScript-first, decorator-based HTTP client for building elegant and modular API clients with fetch under the hood. Inspired by Spring's @RestClient and OpenFeign.
Features
- ๐งฉ Class-based HTTP client with decorators
- ๐ฏ Supports
GET,POST,PUT,PATCH,DELETE, and more - โ๏ธ Middleware support via interceptors
- ๐ Caching support and hooks for before/after execution
- ๐งต Works with native
fetchand streams/blobs - ๐งช Fully typed and extensible
Installation
npm install @bytekit/autofetchor
yarn add @bytekit/autofetchQuick Example
import {
Client,
GetMapping,
PostMapping,
BodyParam,
PathParam,
QueryParam,
} from "@bytekit/autofetch";
interface User {
id: string;
name: string;
email: string;
}
@Client({
baseUrl: () => "https://api.example.com",
before: (self, url, init, id) => {
console.log(`[${id}] Requesting ${init.method} ${url} ${init.body}`);
},
after: (self, response, id) => {
console.log(`[${id}] Got response`, response);
},
})
class UserService {
@GetMapping({ value: "/users" })
async getUsers(): Promise<User[]> {
return [];
}
@GetMapping({ value: "/users/:id" })
async getUser(@PathParam("id") id: string): Promise<User> {
return {} as User;
}
@PostMapping({ value: "/users" })
async createUser(@BodyParam user: Omit<User, "id">): Promise<User> {
return {} as User;
}
@GetMapping({ value: "/users/search" })
async searchUsers(
@QueryParam("q") query: string,
@QueryParam({ name: "limit", required: false }) limit?: number
): Promise<User[]> {
return [];
}
}
// Usage
const service = new UserService();
const run = async () => {
const newUser = await service.createUser({
name: "Alice",
email: "alice@example.com",
});
const user = await service.getUser(newUser.id);
const users = await service.getUsers();
const searchResults = await service.searchUsers("ali", 10);
};Decorators
Class Decorators
@Client(options)
Marks a class as an API client.
Method Decorators
@GetMapping({ value })@PostMapping({ value })@PutMapping({ value })@PatchMapping({ value })@DeleteMapping({ value })
Parameter Decorators
@BodyParamโ binds the request body@PathParam(name)โ binds a URL path parameter@QueryParam(name | { name, required })โ binds query parameters@HeaderParam(name)โ binds a header@FormParam(name)โ binds form fields (for multipart/form-data)@URLEncodedFormParam(name)โ binds form fields (for application/x-www-form-urlencoded)@Initโ accesses theRequestInitobject for dynamic tweaking
Advanced Options
- Interceptors: inject
RequestInitat the client or method level - Hooks:
beforeandafterfunctions for logging, auth, etc. - Streaming:
stream: trueon@Mappingreturns the raw response stream - Blobs:
blob: truefor binary payloads - Custom Fetch: swap in your own fetch implementation