@leancodepl/fetch-client
v10.2.1
Published
Fetch client for CQRS commands and queries
Readme
@leancodepl/fetch-client
CQRS client using native fetch API with automatic response uncapitalization.
Features
- Native fetch API - No external HTTP dependencies, works in any JavaScript environment
- CQRS pattern - Separate queries, commands, and operations with proper typing
- Automatic uncapitalization - Response keys automatically transformed from PascalCase to camelCase
- Query abort support - Built-in AbortController for query cancellation
- Authentication - Token handling with automatic refresh and retry logic
Installation
npm install @leancodepl/fetch-client
# or
yarn add @leancodepl/fetch-clientAPI
mkCqrsClient(params)
Creates CQRS client using native fetch API with automatic response uncapitalization.
Parameters:
params: MkCqrsClientParameters- Configuration object for CQRS client
Returns: Object with createQuery, createOperation, and createCommand factories
MkCqrsClientParameters
Configuration options for the CQRS client.
Properties:
cqrsEndpoint: string- Base URL for CQRS API endpointstokenProvider?: TokenProvider- Optional token provider for authenticationfetchOptions?: Omit<RequestInit, "body" | "headers" | "method">- Optional fetch configuration optionstokenHeader?: string- Header name for authentication token (default: "Authorization")
Usage Examples
Basic Setup
import { mkCqrsClient } from "@leancodepl/fetch-client"
const client = mkCqrsClient({
cqrsEndpoint: "https://api.example.com",
tokenProvider: {
getToken: () => Promise.resolve(localStorage.getItem("token")),
invalidateToken: () => Promise.resolve(true),
},
})Query Operations
interface GetUserQuery {
userId: string
}
interface UserResult {
id: string
name: string
email: string
}
const getUser = client.createQuery<GetUserQuery, UserResult>("GetUser")
const response = await getUser({ userId: "123" })
if (response.isSuccess) {
console.log("User:", response.result)
}Aborting Queries
const getUser = client.createQuery<GetUserQuery, UserResult>("GetUser")
const queryPromise = getUser({ userId: "123" })
// Abort the request if needed
queryPromise.abort()
const response = await queryPromise
if (!response.isSuccess && response.isAborted) {
console.log("Query was aborted")
}Command Operations
interface CreateUserCommand {
name: string
email: string
}
const errorCodes = { EmailExists: 1, InvalidEmail: 2 } as const
const createUser = client.createCommand<CreateUserCommand, typeof errorCodes>("CreateUser", errorCodes)
const response = await createUser({ name: "John", email: "[email protected]" })
if (response.isSuccess) {
console.log("Command result:", response.result)
}
// Using the handle method for validation
createUser.handle({ name: "John", email: "[email protected]" }).then(handler =>
handler
.handle("success", () => console.log("User created"))
.handle("EmailExists", () => console.log("Email already exists"))
.handle("failure", () => console.log("Creation failed"))
.check(),
)Operation Requests
interface ProcessPaymentOperation {
orderId: string
amount: number
}
interface PaymentResult {
transactionId: string
status: string
}
const processPayment = client.createOperation<ProcessPaymentOperation, PaymentResult>("ProcessPayment")
const response = await processPayment({ orderId: "order-123", amount: 99.99 })
if (response.isSuccess) {
console.log("Transaction:", response.result.transactionId)
}Custom Fetch Options
const client = mkCqrsClient({
cqrsEndpoint: "https://api.example.com",
fetchOptions: {
credentials: "include",
},
tokenHeader: "X-Auth-Token",
})